54c1eefb6c2ae5fa6521c7e927c630f2d14b8240
Re-enables BDD_SCHEMA_ISOLATION=true with the foundation from PR #34 (NewPostgresRepositoryFromDSN). Achieves ~2.85x speedup on the BDD test suite by running feature packages in parallel. ARCHITECTURE When BDD_SCHEMA_ISOLATION=true, each test package (process) gets its own isolated PostgreSQL schema: 1. testserver.Start() generates a deterministic schema name per FEATURE 2. CREATE SCHEMA <name> 3. Open a per-package gorm.DB with DSN search_path=<name> 4. AutoMigrate runs in the isolated schema (creates users table) 5. Build a per-package server.Server with this isolated repo via server.NewServerWithUserRepo 6. Stop() drops the schema + closes the per-package pool Packages then run in parallel (default Go test parallelism) without contention because each has its own schema + connection pool. CHANGES - pkg/server/server.go : NEW factory NewServerWithUserRepo(cfg, ctx, userRepo, userService) that injects a per-test repo. Existing NewServer becomes a thin wrapper. - pkg/bdd/testserver/server.go : Start() chooses isolated mode based on BDD_SCHEMA_ISOLATION env var. Stop() drops schema + closes pool. - pkg/user/postgres_repository.go : Exec(sql) helper for the schema lifecycle (CREATE/DROP) used by testserver. - scripts/run-bdd-tests.sh : -p 1 only when BDD_SCHEMA_ISOLATION!=true. When true, default Go parallelism (~ NumCPU packages concurrent). - .gitea/workflows/ci-cd.yaml : exports BDD_SCHEMA_ISOLATION=true. - adr/0025-bdd-scenario-isolation-strategies.md : Status to "Implemented". VALIDATION 5x AuthBDD with isolation: 5/5 PASS, public.users count=0 after runs. Local benchmark on the full features/... suite: - Sequential -p 1 (no isolation): 12.87s - Parallel + isolation (this PR): 4.51s - Speedup: 2.85x 🤖 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
♻️ refactor(frontend): split HealthDashboard into smart wrapper + dumb View for state-based stories (#33)
dance-lessons-coach
Go web service demonstrating idiomatic package structure, versioned JSON API, and production-ready features.
Features
- Versioned JSON API (
/api/v1,/api/v2) - Chi router with graceful shutdown
- Zerolog structured logging (console and JSON modes)
- Viper configuration (file + env vars)
- Readiness endpoint for Kubernetes / service mesh
- OpenTelemetry / Jaeger distributed tracing
- OpenAPI / Swagger UI (embedded in binary)
- PostgreSQL user service with JWT auth
- BDD + unit tests
Quick Start
git clone https://gitea.arcodange.lab/arcodange/dance-lessons-coach.git
cd dance-lessons-coach
./scripts/build.sh # produces ./bin/server and ./bin/greet
./scripts/start-server.sh start
curl http://localhost:8080/api/health
curl http://localhost:8080/api/v1/greet/Alice
Stop: ./scripts/start-server.sh stop
Greet CLI
go run ./cmd/greet # Hello world!
go run ./cmd/greet Alice # Hello Alice!
Configuration
All options are available via config.yaml or DLC_* environment variables.
| Env var | Default | Description |
|---|---|---|
DLC_SERVER_PORT |
8080 |
Listening port |
DLC_SERVER_HOST |
0.0.0.0 |
Bind address |
DLC_LOGGING_JSON |
false |
JSON log format |
DLC_LOGGING_OUTPUT |
stderr | Log file path |
DLC_SHUTDOWN_TIMEOUT |
30s |
Graceful shutdown window |
DLC_API_V2_ENABLED |
false |
Enable /api/v2 routes |
DLC_CONFIG_FILE |
./config.yaml |
Override config path |
See config.example.yaml for a full template.
API
| Method | Path | Description |
|---|---|---|
| GET | /api/health |
Liveness check |
| GET | /api/ready |
Readiness check (503 during shutdown) |
| GET | /api/version |
Version info (?format=plain|full|json) |
| GET | /api/v1/greet/ |
Default greeting |
| GET | /api/v1/greet/{name} |
Named greeting |
| POST | /api/v2/greet |
V2 greeting with validation |
| GET | /swagger/ |
Swagger UI |
Testing
go test ./... # unit + integration tests
./scripts/test-graceful-shutdown.sh # lifecycle + JSON logging validation
./scripts/test-opentelemetry.sh # tracing end-to-end
Gitea Client
AI agent helper script at .vibe/skills/gitea-client/scripts/gitea-client.sh.
Auth setup:
echo "your_token" > ~/.gitea_token
chmod 600 ~/.gitea_token
export GITEA_API_TOKEN_FILE="$HOME/.gitea_token"
Get a token at https://gitea.arcodange.lab → Profile → Settings → Applications.
Architecture
Key decisions are documented in adr/. See AGENTS.md for the full development reference (commands, config, ADR index, commit conventions).
License
MIT
Description
Languages
Go
71.2%
Shell
21.7%
Gherkin
3.9%
TypeScript
1.4%
Vue
0.5%
Other
1.2%