ci: add layered test stages for hybrid test strategy

- Add P0 invariant tests stage (blocking)
- Add P1 contract tests stage (warning only - requires server)
- Add Makefile targets: test-invariants, test-contracts, test-scenarios, test-critical
- Document test layer policy in CONTRIBUTING.md
This commit is contained in:
viettranx committed 2026-04-12 21:56:05 +07:00
1 parent 49398208d8
commit 38289e99d6
3 files changed
+57

No files matched your search

+9
View File
@@ -48,6 +48,15 @@ jobs:
# suites run in <20s, so 90s leaves ample breathing room.
- name: Unit tests
run: go test -race -timeout=90s -coverpkg=./... -coverprofile=coverage.out ./...
# Invariant tests (P0) - tenant isolation, permission enforcement
# These run against real DB and MUST pass for merge.
- name: Invariant tests (P0)
run: go test -race -timeout=90s -tags integration ./tests/invariants/...
# Contract tests (P1) - API schema validation
# Skip if no server available (requires CONTRACT_TEST_* env vars).
- name: Contract tests (P1)
run: go test -race -timeout=90s -tags integration ./tests/contracts/... || echo "::warning::Contract tests skipped (no server configured)"
continue-on-error: true
# Integration suite runs against the `pg` service container above.
# Longer -timeout=180s because the first test runs migrations from
# scratch (can take 10-30s on a cold CI runner). Local full suite
+32
View File
@@ -72,6 +72,38 @@ Shared predicate: `store.IsMasterScope(ctx)` (`internal/store/context.go`).
- `requireAuth(RoleAdmin)` as the **sole** gate on a global-state write
- Admin revoke/delete handlers that skip pre-fetch ownership verification (store SQL alone is not enough when it matches `IS NULL` arms)
## Test Layers
Tests are organized by priority and purpose:
| Layer | Priority | Location | Blocking? | Purpose |
|-------|----------|----------|-----------|---------|
| **Invariants** | P0 | `tests/invariants/` | YES | Tenant isolation, permission enforcement |
| **Contracts** | P1 | `tests/contracts/` | YES | API schema validation |
| **Scenarios** | P2 | `tests/scenarios/` | NO | End-to-end user journeys |
| **Integration** | P1 | `tests/integration/` | YES | DB/pipeline integration |
### Running Tests
```bash
make test # Unit tests (fast, no DB)
make test-invariants # P0 invariants (requires pgvector)
make test-contracts # P1 API contracts (requires server)
make test-scenarios # P2 scenarios (requires server)
make test-critical # P0 + P1 (run before merge)
```
### Test Layer Policy
- **P0 failures**: Block PR merge immediately
- **P1 failures**: Block merge, investigate contract breakage
- **P2 failures**: Warning only, may indicate flaky tests or environment issues
When adding new tests:
- Tenant isolation/permissions → `tests/invariants/`
- API response schemas → `tests/contracts/`
- User journeys (multi-step flows) → `tests/scenarios/`
### Commit Messages
Use conventional commits:
+16
View File
@@ -78,6 +78,22 @@ reset: version-file
test:
go test -race -timeout=90s ./...
# ── Layered Testing ──
# P0: Invariant tests - tenant isolation, permission enforcement (MUST pass)
test-invariants:
go test -race -timeout=90s -tags integration ./tests/invariants/...
# P1: Contract tests - API schema validation (MUST pass)
test-contracts:
go test -race -timeout=90s -tags integration ./tests/contracts/...
# P2: Scenario tests - end-to-end user journeys (warning only)
test-scenarios:
go test -race -timeout=180s -tags integration ./tests/scenarios/...
# Critical tests (P0 + P1) - run before merge
test-critical: test-invariants test-contracts
vet:
go vet ./...