Skip to content

Test Database Strategy

NENE2 database adapter tests should be deterministic by default and should not require a developer-specific database server.

Default Strategy

Framework-maintained database adapter tests use SQLite in-memory databases first.

Reasons:

  • tests run inside the existing PHP container
  • no local MySQL or PostgreSQL credentials are required
  • each test can create its own schema
  • tests stay fast enough for composer check
  • adapters remain easy to inspect and reason about

The default command for focused database adapter checks is:

bash
docker compose run --rm app composer test:database

composer check still runs the full PHPUnit suite, including database adapter tests.

Test Shape

Database adapter tests should:

  • create schema inside the test
  • use tiny deterministic data
  • avoid production-like credentials
  • avoid relying on migration state unless the test is specifically about migrations
  • prefer typed config objects over raw environment variables
  • keep SQL expectations close to the adapter being tested

External Databases

MySQL verification is available through Docker Compose for adapter behavior that SQLite cannot cover.

Start the service and run the opt-in command:

bash
docker compose up -d mysql
docker compose run --rm app composer test:database:mysql

This path verifies PDO MySQL connection creation, parameterized query execution, and transaction rollback against a real MySQL service.

External database tests stay opt-in until CI has a documented service container and safe credentials. They do not block the default local composer check path.

The Docker Compose defaults are local-only development credentials. Override them through environment variables when needed, and do not commit real database secrets.

Migration Tests

Migration tests should be separate from repository adapter tests.

When migration tests are introduced, they should define:

  • the database service used in CI
  • how schemas are reset between runs
  • whether seeds are allowed
  • which Composer command runs them
  • what happens when a migration is intentionally irreversible

Released under the MIT License.