I’d argue that in some cases it can be more testable than code. With a small, strict subset of a turing-complete language and constrained input choices, you can often auto generate test cases for any valid expression in a given context. Static analysis of code is much more difficult and broad.
One thing code versioning doesn’t do well either is executing multiple versions of the same logic. With rules as data, you can store them as timestamped versions and keep applying the correct historical rule against some older business object or view.
No this is not code - this is configuration. Many places actually save CODE into the DB and then load it at runtime for, say, ETL jobs. It's not an easy problem.