Add multi-database test runner (test:all_databases)

Adds `bundle exec rails test:all_databases` which runs the full test
suite against every test database configured in database.yml in a single
command.

Convention: any top-level key starting with "test" that contains a Hash
is a test database. `test:` is the required primary; `test_<name>:` blocks
are optional additional adapters (e.g. test_sqlite, test_pg).

For each configured database the task:
  1. Checks the required adapter gem is available (skips with warning if not)
  2. Runs `rails db:test:prepare` to create and migrate the database
  3. Runs `rails test` and records pass/fail
  4. Prints a summary and exits non-zero if any database failed

Mechanism: a RAILS_DATABASE_YML env var points each subprocess to a
temporary database.yml that contains only the current test config.
config/application.rb(.dist) reads this var and overrides Rails'
database config path before initialisation, so no monkey-patching of
the test runner is required.

config/database.yml.dist is updated with documented examples for SQLite
and PostgreSQL additional test databases.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-05 10:48:53 +00:00
parent d893e59293
commit 24539f236c
3 changed files with 145 additions and 0 deletions

View File

@@ -48,3 +48,26 @@ production:
#test:
# <<: *default
# database: fixinme_test
# Multi-database testing — `bundle exec rails test:all_databases`
# ---------------------------------------------------------------
# Add any number of `test_<name>:` blocks to run the full test suite
# against additional database adapters in a single command.
# Each adapter's gem must be available in the bundle:
# bundle config --local with "mysql:sqlite" # mysql + sqlite
# bundle config --local with "mysql:pg" # mysql + postgresql
#
# Example — run tests against MySQL and SQLite:
#
#test_sqlite:
# adapter: sqlite3
# database: db/fixinme_test.sqlite3
#
# Example — run tests against MySQL and PostgreSQL:
#
#test_pg:
# adapter: postgresql
# database: fixinme_test
# username: fixinme
# password: Some-password1%
# host: localhost