Help us improve
Share bugs, ideas, or general feedback.
Manages database testing: fixtures, transactions, rollback, migrations, integrity checks, performance for PostgreSQL, MySQL, MongoDB, SQLite, Redis with Prisma, Drizzle, Knex.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin database-test-managerHow this skill is triggered — by the user, by Claude, or both
Slash command
/database-test-manager:managing-database-testsThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Manage database testing including fixture loading, transaction-based test isolation, migration validation, query performance testing, and data integrity checks. Supports PostgreSQL, MySQL, MongoDB, SQLite (in-memory), and Redis with ORM-agnostic patterns for Prisma, TypeORM, SQLAlchemy, Knex, and Drizzle.
Configures Testcontainers with real PostgreSQL for database testing, parallel schema isolation, flaky test quarantine, data seeding patterns, ephemeral DBs, and CI setup for reliable tests.
Establishes patterns for test factories, fixtures, database seeding, and test data isolation to create realistic, composable data without coupling tests to database states.
Sets up integration tests across databases, APIs, and message queues using Testcontainers, with DB seeding, cleanup strategies, and Docker dependencies.
Share bugs, ideas, or general feedback.
Manage database testing including fixture loading, transaction-based test isolation, migration validation, query performance testing, and data integrity checks. Supports PostgreSQL, MySQL, MongoDB, SQLite (in-memory), and Redis with ORM-agnostic patterns for Prisma, TypeORM, SQLAlchemy, Knex, and Drizzle.
docker run -d -p 5433:5432 --name test-db postgres:16-alpine.sqlite::memory:.npx prisma migrate deploy or npx knex migrate:latest --env test.migrate:rollback and verify schema reverts correctly.beforeEach. Simpler but slower.EXPLAIN ANALYZE on critical queries and assert expected index usage.tests/database/ or tests/models/tests/helpers/ or tests/factories/| Error | Cause | Solution |
|---|---|---|
| Foreign key constraint violation during cleanup | Truncation order does not respect foreign key dependencies | Truncate tables in reverse dependency order; or disable FK checks during cleanup (SET CONSTRAINTS ALL DEFERRED) |
| Connection pool exhausted | Too many test workers opening separate connections | Use a single shared connection for tests; limit pool size; close connections in afterAll |
| Migration fails on test database | Schema drift between development and test databases | Drop and recreate test database; run all migrations from scratch; verify migration checksums |
| Transaction rollback does not clean up | ORM auto-commits or test creates a new connection outside the transaction | Inject the transaction connection into all ORM operations; disable auto-commit in test config |
| Slow test suite due to database I/O | Too many INSERT/DELETE operations per test | Use in-memory SQLite for unit tests; batch seed data; use transaction rollback instead of truncation |
Jest with Prisma transaction rollback:
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
describe('UserRepository', () => {
afterAll(async () => { await prisma.$disconnect(); });
it('creates and retrieves a user', async () => {
await prisma.$transaction(async (tx) => {
const created = await tx.user.create({
data: { name: 'Alice', email: 'alice@test.com' },
});
const found = await tx.user.findUnique({ where: { id: created.id } });
expect(found).toMatchObject({ name: 'Alice', email: 'alice@test.com' });
// Transaction rolls back automatically when we throw
throw new Error('ROLLBACK');
}).catch((e) => {
if (e.message !== 'ROLLBACK') throw e;
});
});
});
pytest with database fixture and rollback:
import pytest
from sqlalchemy import create_engine
from sqlalchemy.orm import Session
@pytest.fixture
def db_session():
engine = create_engine("postgresql://test:test@localhost:5433/testdb") # 5433 = configured value
connection = engine.connect()
transaction = connection.begin()
session = Session(bind=connection)
yield session
session.close()
transaction.rollback()
connection.close()
def test_insert_and_query_user(db_session):
db_session.execute(
text("INSERT INTO users (name, email) VALUES (:n, :e)"),
{"n": "Alice", "e": "alice@test.com"}
)
result = db_session.execute(text("SELECT name FROM users WHERE email = :e"),
{"e": "alice@test.com"}).fetchone()
assert result[0] == "Alice"
Migration validation test:
describe('Database Migrations', () => {
it('applies all migrations to empty database', async () => {
const result = await exec('npx prisma migrate deploy');
expect(result.exitCode).toBe(0);
});
it('migration is idempotent', async () => {
await exec('npx prisma migrate deploy');
const result = await exec('npx prisma migrate deploy');
expect(result.exitCode).toBe(0); // Second run should succeed (no-op)
});
});