Test Database Not Resetting Between Tests in Windsurf Project
Tests in your Windsurf-generated project fail intermittently because the database retains data from previous test runs. Tests that pass individually fail when run together, test order matters, and adding a new test breaks existing ones. The test suite is unreliable and developers lose confidence in the results.
Cascade generates tests that create database records but doesn't clean them up afterward. Test A inserts a user, Test B expects an empty users table, and Test B fails because Test A's user is still there. The problem gets worse as more tests are added, creating an increasingly tangled web of data dependencies.
The failures are often non-deterministic — they depend on which tests run first, whether a previous test run completed fully, and sometimes even on timing. This makes them extremely hard to debug.
Error Messages You Might See
Common Causes
- No afterEach cleanup — Tests create database records but don't have afterEach hooks to clean up created data
- Shared database between test runs — Tests use the development database instead of a dedicated test database that gets reset
- No transaction rollback — Tests don't wrap operations in transactions that get rolled back, so changes persist
- Truncation order wrong — Tables with foreign keys must be truncated in the correct order, or truncation fails silently
- Seed data conflicts — Database seeds run before tests and create data with fixed IDs that conflict with test-created records
- Parallel tests sharing state — Tests running in parallel write to the same tables and interfere with each other
How to Fix It
- Use transactions with rollback — Wrap each test in a database transaction and roll it back in afterEach. This is the fastest and cleanest approach
- Add truncation in beforeEach — Truncate all tables before each test with TRUNCATE TABLE ... CASCADE (PostgreSQL) or DELETE FROM (SQLite)
- Use a dedicated test database — Configure a separate database for tests in .env.test. Never run tests against your development or production database
- Install a test cleanup library — Use libraries like pg-mem (in-memory PostgreSQL), or prisma's test utils that handle cleanup automatically
- Isolate parallel tests — If running tests in parallel, use separate schemas or databases per worker to prevent interference
- Reset sequences and IDs — After truncation, reset auto-increment sequences so tests don't depend on specific ID values
Real developers can help you.
You don't need to be technical. Just describe what's wrong and a verified developer will handle the rest.
Get HelpFrequently Asked Questions
Should I use truncation or transaction rollback for test cleanup?
Transaction rollback is faster and cleaner — each test runs in a transaction that gets rolled back, leaving no trace. However, it doesn't work if your code commits transactions internally. Truncation is simpler but slower because it actually deletes and recreates data.
Why do my tests pass individually but fail together?
This is a classic sign of missing test isolation. One test creates data that another test doesn't expect. Add cleanup (truncation or rollback) in beforeEach or afterEach hooks so each test starts with a known database state.