Windsurf testing

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

Expected 1 row but found 5 Error: duplicate key value violates unique constraint Test passed individually but fails in suite Error: relation has dependent rows - cannot truncate Expected empty array but received [previous test data]
Expected 1 row but found 5Error: duplicate key value violates unique constraintTest passed individually but fails in suiteError: relation has dependent rows - cannot truncateExpected empty array but received [previous test data]

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

  1. Use transactions with rollback — Wrap each test in a database transaction and roll it back in afterEach. This is the fastest and cleanest approach
  2. Add truncation in beforeEach — Truncate all tables before each test with TRUNCATE TABLE ... CASCADE (PostgreSQL) or DELETE FROM (SQLite)
  3. Use a dedicated test database — Configure a separate database for tests in .env.test. Never run tests against your development or production database
  4. Install a test cleanup library — Use libraries like pg-mem (in-memory PostgreSQL), or prisma's test utils that handle cleanup automatically
  5. Isolate parallel tests — If running tests in parallel, use separate schemas or databases per worker to prevent interference
  6. Reset sequences and IDs — After truncation, reset auto-increment sequences so tests don't depend on specific ID values

Real developers can help you.

Sage Fulcher Sage Fulcher Hey I'm Sage! Im a Boston area software engineer who grew up in South Florida. Ive worked at a ton of cool places like a telehealth kidney care startup that took part in a billion dollar merger (Cricket health/Interwell health), a boutique design agency where I got to work on a ton of exciting startups including a photography education app, a collegiate Esports league and more (Philosophie), a data analytics as a service startup in Cambridge (MA) as well as at Phillips and MIT Lincoln Lab where I designed and developed novel network security visualizations and analytics. I've been writing code and furiously devoted to using computers to make people’s lives easier for about 17 years. My degree is in making computers make pretty lights and sounds. Outside of work I love hip hop, the Celtics, professional wrestling, magic the gathering, photography, drumming, and guitars (both making and playing them) Jacek Rozanski Jacek Rozanski Senior PHP/Symfony developer and DevOps engineer with 20+ years of professional experience, running opcode.pl (web development agency, est. 2004). Day job: I'm the sole backend developer at merketing company where I own and maintain 11 PHP/Symfony microservices on AWS (ECS Fargate, RDS, S3, CloudFront), handle the full CI/CD pipeline (Bitbucket Pipelines, Docker), and manage monitoring with Sentry and CloudWatch. These services handle high request volumes in production every month. What I bring to AI-built apps: - I audit and fix security issues (OWASP methodology), performance bottlenecks, and architectural problems in codebases generated by Cursor, Claude Code, Lovable, Bolt, and v0 - I refactor AI-generated prototypes into production-grade applications with proper error handling, testing, and clean architecture (SOLID, DDD, hexagonal architecture) - I set up the infrastructure AI tools don't touch: AWS hosting, CI/CD pipelines, automated deployments, database optimization, monitoring, and alerting - I integrate external services: payment providers, email systems, partner APIs, SSO/auth Tech stack: PHP 8.x, Symfony, React, Next.js, PostgreSQL, MySQL, Docker, AWS (ECS, RDS, S3, SQS/SNS, CloudFront), Terraform, Supabase. I also use AI tools daily (Claude Code, Cursor) in my own workflow, so I understand both the strengths and the gaps in AI-generated code. Based in Poland (CET timezone). Available for async work and calls during EU/US business hours. ISHANTDEEP SINGH ISHANTDEEP SINGH Senior Software Engineer with 7+ years of experience in React, JavaScript, TypeScript, Next.js, and Node.js. I’ve also worked as a tech lead for startups, owning end-to-end technical execution including architecture, development, scaling, and delivery. I bring a strong mix of hands-on coding, product thinking, and technical leadership, and I’m comfortable building products from scratch as well as improving and scaling existing systems. Krishna Sai Kuncha Krishna Sai Kuncha Experienced Professional Full stack Developer with 8+ years of experience across react, python, js, ts, golang and react-native. Developed inhouse websearch tooling for AI before websearch was solved : ) PawelPloszaj PawelPloszaj I'm fronted developer with 10+ years of experience with big projects. I have small backend background too Omar Faruk Omar Faruk As a Product Engineer at Klasio, I contributed to end-to-end product development, focusing on scalability, performance, and user experience. My work spanned building and refining core features, developing dynamic website templates, integrating secure and reliable payment gateways, and optimizing the overall system architecture. I played a key role in creating a scalable and maintainable platform to support educators and learners globally. I'm enthusiastic about embracing new challenges and making meaningful contributions. Nam Tran Nam Tran 10 years as fullstack developer Costea Adrian Costea Adrian Embedded Engineer specilizing in perception systems. Latest project was a adas camera calibration system. Taufan Taufan I’m a product-focused engineer and tech leader who builds scalable systems and turns ideas into production-ready platforms. Over the past years, I’ve worked across startups and fast-moving teams, leading backend architecture, improving system reliability, and shipping products used by thousands of users. My strength is not just writing code — but connecting product vision, technical execution, and business impact. Simon A. Simon A. I'm a backend developer building APIs, emulators, and interactive game systems. Professionally, I've developed Java/Spring reporting solutions, managed relational and NoSQL databases, and implemented CI/CD workflows.

You don't need to be technical. Just describe what's wrong and a verified developer will handle the rest.

Get Help

Frequently 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.

Related Windsurf Issues

Can't fix it yourself?
Real developers can help.

You don't need to be technical. Just describe what's wrong and a verified developer will handle the rest.

Get Help