A monorepo containing a C# .NET 10 Web API backend and a React/TypeScript frontend.
From the monorepo root, start PostgreSQL and run all pending Flyway migrations:
docker compose upThis creates the projectmgmt database and applies all SQL migrations in backend/sql/. To stop, press Ctrl+C.
From the backend/ directory:
dotnet runAPI runs at http://localhost:5231. OpenAPI docs are available at http://localhost:5231/openapi/v1.json.
From the frontend/ directory:
npm install # first time only
npm run devFrontend runs at http://localhost:5173.
Backend (from backend/):
dotnet testFrontend unit tests (from frontend/):
npm testE2E tests — Cucumber + Playwright
No local installs or manual service startup needed. A single command builds every image, starts the full stack in dependency order, runs all scenarios, and exits with the test result code:
# From the monorepo root
docker compose -f docker-compose.fullstack.yml run --rm e2eOn the first run Docker builds the images (takes a few minutes). Subsequent runs reuse the cached layers.
If you have made changes to the backend or frontend source since the last run, rebuild the affected images first:
# From the monorepo root
docker compose -f docker-compose.fullstack.yml build api e2eThen re-run the suite as normal.
Use this when you want a visible browser window to debug a failing scenario.
Prerequisites (first time only):
cd frontend
npm install
npx playwright install chromiumStart the full stack manually:
# Terminal 1 — monorepo root: PostgreSQL + Redis + migrations
docker compose up
# Terminal 2 — backend/
dotnet run
# Terminal 3 — frontend/
npm run devRun the tests:
# From frontend/ — headless
npm run e2e
# With a visible browser window
npm run e2e:headed| Variable | Default | Description |
|---|---|---|
BASE_URL |
http://localhost:5173 |
Frontend URL Playwright navigates to |
API_URL |
http://localhost:5231/api |
Backend API URL for setup calls |
HEADLESS |
true |
Set to false for a visible browser |
DOCKER |
unset | Set to any value inside Docker to enable --no-sandbox |
Override them inline if your ports differ:
BASE_URL=http://localhost:4173 API_URL=http://localhost:5000/api npm run e2e- Pass/fail results are printed to the terminal.
- HTML report is written to
frontend/e2e/reports/report.htmlafter every run (open in any browser). - Failure screenshots are embedded directly in the HTML report.
| Feature file | Scenario |
|---|---|
auth.feature |
User logs in with valid credentials |
projects.feature |
Admin creates a new project |
members.feature |
Admin adds a member to a project |
sprints.feature |
Admin creates a sprint |
tickets.feature |
User creates a new ticket |
dashboard.feature |
Admin creates a dashboard |
- Create
backend/sql/V{next}__{Description}.sql - Apply it:
docker compose run --rm migrate - Regenerate EF Core entities:
cd backend && bash scripts/scaffold.sh