tribunal-kit 2.4.5 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agent/agents/accessibility-reviewer.md +220 -134
- package/.agent/agents/ai-code-reviewer.md +233 -129
- package/.agent/agents/backend-specialist.md +238 -178
- package/.agent/agents/code-archaeologist.md +181 -119
- package/.agent/agents/database-architect.md +207 -164
- package/.agent/agents/debugger.md +218 -151
- package/.agent/agents/dependency-reviewer.md +136 -55
- package/.agent/agents/devops-engineer.md +238 -175
- package/.agent/agents/documentation-writer.md +221 -137
- package/.agent/agents/explorer-agent.md +180 -142
- package/.agent/agents/frontend-reviewer.md +194 -80
- package/.agent/agents/frontend-specialist.md +237 -188
- package/.agent/agents/game-developer.md +52 -184
- package/.agent/agents/logic-reviewer.md +149 -78
- package/.agent/agents/mobile-developer.md +223 -152
- package/.agent/agents/mobile-reviewer.md +195 -79
- package/.agent/agents/orchestrator.md +211 -170
- package/.agent/agents/penetration-tester.md +174 -131
- package/.agent/agents/performance-optimizer.md +203 -139
- package/.agent/agents/performance-reviewer.md +211 -108
- package/.agent/agents/product-manager.md +162 -108
- package/.agent/agents/project-planner.md +162 -142
- package/.agent/agents/qa-automation-engineer.md +242 -138
- package/.agent/agents/security-auditor.md +194 -170
- package/.agent/agents/seo-specialist.md +213 -132
- package/.agent/agents/sql-reviewer.md +194 -73
- package/.agent/agents/supervisor-agent.md +203 -156
- package/.agent/agents/test-coverage-reviewer.md +193 -81
- package/.agent/agents/type-safety-reviewer.md +208 -65
- package/.agent/scripts/__pycache__/auto_preview.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/bundle_analyzer.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/checklist.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/dependency_analyzer.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/security_scan.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/session_manager.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/skill_integrator.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/swarm_dispatcher.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/test_runner.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/verify_all.cpython-311.pyc +0 -0
- package/.agent/skills/agent-organizer/SKILL.md +126 -132
- package/.agent/skills/ai-prompt-injection-defense/SKILL.md +160 -0
- package/.agent/skills/api-patterns/SKILL.md +289 -257
- package/.agent/skills/api-security-auditor/SKILL.md +177 -0
- package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +1 -1
- package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +1 -1
- package/.agent/skills/appflow-wireframe/SKILL.md +107 -58
- package/.agent/skills/architecture/SKILL.md +331 -200
- package/.agent/skills/authentication-best-practices/SKILL.md +173 -0
- package/.agent/skills/bash-linux/SKILL.md +154 -215
- package/.agent/skills/brainstorming/SKILL.md +104 -210
- package/.agent/skills/building-native-ui/SKILL.md +174 -0
- package/.agent/skills/clean-code/SKILL.md +360 -206
- package/.agent/skills/config-validator/SKILL.md +141 -165
- package/.agent/skills/csharp-developer/SKILL.md +528 -107
- package/.agent/skills/database-design/SKILL.md +455 -275
- package/.agent/skills/deployment-procedures/SKILL.md +145 -188
- package/.agent/skills/devops-engineer/SKILL.md +332 -134
- package/.agent/skills/devops-incident-responder/SKILL.md +113 -98
- package/.agent/skills/edge-computing/SKILL.md +157 -213
- package/.agent/skills/extract-design-system/SKILL.md +134 -0
- package/.agent/skills/framer-motion-expert/SKILL.md +939 -0
- package/.agent/skills/game-design-expert/SKILL.md +105 -0
- package/.agent/skills/game-engineering-expert/SKILL.md +122 -0
- package/.agent/skills/geo-fundamentals/SKILL.md +124 -215
- package/.agent/skills/github-operations/SKILL.md +314 -354
- package/.agent/skills/gsap-expert/SKILL.md +901 -0
- package/.agent/skills/i18n-localization/SKILL.md +138 -216
- package/.agent/skills/intelligent-routing/SKILL.md +127 -139
- package/.agent/skills/llm-engineering/SKILL.md +357 -258
- package/.agent/skills/local-first/SKILL.md +154 -203
- package/.agent/skills/mcp-builder/SKILL.md +118 -224
- package/.agent/skills/nextjs-react-expert/SKILL.md +783 -203
- package/.agent/skills/nodejs-best-practices/SKILL.md +559 -280
- package/.agent/skills/observability/SKILL.md +330 -285
- package/.agent/skills/parallel-agents/SKILL.md +122 -181
- package/.agent/skills/performance-profiling/SKILL.md +254 -197
- package/.agent/skills/plan-writing/SKILL.md +118 -188
- package/.agent/skills/platform-engineer/SKILL.md +123 -135
- package/.agent/skills/playwright-best-practices/SKILL.md +162 -0
- package/.agent/skills/powershell-windows/SKILL.md +146 -230
- package/.agent/skills/python-pro/SKILL.md +879 -114
- package/.agent/skills/react-specialist/SKILL.md +931 -108
- package/.agent/skills/readme-builder/SKILL.md +42 -0
- package/.agent/skills/realtime-patterns/SKILL.md +304 -296
- package/.agent/skills/rust-pro/SKILL.md +701 -240
- package/.agent/skills/seo-fundamentals/SKILL.md +154 -181
- package/.agent/skills/server-management/SKILL.md +190 -212
- package/.agent/skills/shadcn-ui-expert/SKILL.md +206 -0
- package/.agent/skills/skill-creator/SKILL.md +68 -0
- package/.agent/skills/sql-pro/SKILL.md +633 -104
- package/.agent/skills/supabase-postgres-best-practices/SKILL.md +78 -0
- package/.agent/skills/swiftui-expert/SKILL.md +176 -0
- package/.agent/skills/systematic-debugging/SKILL.md +118 -186
- package/.agent/skills/tailwind-patterns/SKILL.md +576 -232
- package/.agent/skills/tdd-workflow/SKILL.md +137 -209
- package/.agent/skills/testing-patterns/SKILL.md +573 -205
- package/.agent/skills/vue-expert/SKILL.md +964 -119
- package/.agent/skills/vulnerability-scanner/SKILL.md +269 -316
- package/.agent/skills/web-accessibility-auditor/SKILL.md +193 -0
- package/.agent/skills/webapp-testing/SKILL.md +145 -236
- package/.agent/workflows/api-tester.md +151 -279
- package/.agent/workflows/audit.md +138 -168
- package/.agent/workflows/brainstorm.md +110 -146
- package/.agent/workflows/changelog.md +112 -144
- package/.agent/workflows/create.md +124 -139
- package/.agent/workflows/debug.md +189 -196
- package/.agent/workflows/deploy.md +189 -153
- package/.agent/workflows/enhance.md +151 -139
- package/.agent/workflows/fix.md +135 -143
- package/.agent/workflows/generate.md +157 -164
- package/.agent/workflows/migrate.md +160 -163
- package/.agent/workflows/orchestrate.md +168 -151
- package/.agent/workflows/performance-benchmarker.md +123 -305
- package/.agent/workflows/plan.md +173 -151
- package/.agent/workflows/preview.md +80 -137
- package/.agent/workflows/refactor.md +183 -153
- package/.agent/workflows/review-ai.md +129 -140
- package/.agent/workflows/review.md +116 -155
- package/.agent/workflows/session.md +94 -154
- package/.agent/workflows/status.md +79 -125
- package/.agent/workflows/strengthen-skills.md +139 -99
- package/.agent/workflows/swarm.md +179 -194
- package/.agent/workflows/test.md +211 -166
- package/.agent/workflows/tribunal-backend.md +113 -111
- package/.agent/workflows/tribunal-database.md +115 -132
- package/.agent/workflows/tribunal-frontend.md +118 -115
- package/.agent/workflows/tribunal-full.md +133 -136
- package/.agent/workflows/tribunal-mobile.md +119 -123
- package/.agent/workflows/tribunal-performance.md +133 -152
- package/.agent/workflows/ui-ux-pro-max.md +143 -171
- package/README.md +11 -15
- package/package.json +1 -1
- package/.agent/skills/dotnet-core-expert/SKILL.md +0 -103
- package/.agent/skills/game-development/2d-games/SKILL.md +0 -119
- package/.agent/skills/game-development/3d-games/SKILL.md +0 -135
- package/.agent/skills/game-development/SKILL.md +0 -236
- package/.agent/skills/game-development/game-art/SKILL.md +0 -185
- package/.agent/skills/game-development/game-audio/SKILL.md +0 -190
- package/.agent/skills/game-development/game-design/SKILL.md +0 -129
- package/.agent/skills/game-development/mobile-games/SKILL.md +0 -108
- package/.agent/skills/game-development/multiplayer/SKILL.md +0 -132
- package/.agent/skills/game-development/pc-games/SKILL.md +0 -144
- package/.agent/skills/game-development/vr-ar/SKILL.md +0 -123
- package/.agent/skills/game-development/web-games/SKILL.md +0 -150
|
@@ -1,138 +1,242 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: qa-automation-engineer
|
|
3
|
-
description: Test automation architect
|
|
4
|
-
tools: Read, Grep, Glob, Bash, Edit, Write
|
|
5
|
-
model: inherit
|
|
6
|
-
skills: clean-code, testing
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
//
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
})
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
1
|
+
---
|
|
2
|
+
name: qa-automation-engineer
|
|
3
|
+
description: Test automation architect. Designs Testing Trophy strategies (unit with Vitest, integration with RTL+MSW, E2E with Playwright), enforces behavior-driven test design, prevents brittle selector usage, and builds CI-integrated coverage gates. Keywords: test, spec, coverage, vitest, playwright, rtl, msw, jest, automation.
|
|
4
|
+
tools: Read, Grep, Glob, Bash, Edit, Write
|
|
5
|
+
model: inherit
|
|
6
|
+
skills: clean-code, webapp-testing, playwright-best-practices, tdd-workflow
|
|
7
|
+
version: 2.0.0
|
|
8
|
+
last-updated: 2026-04-02
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# QA Automation Engineer — Testing Trophy Architect
|
|
12
|
+
|
|
13
|
+
> "Tests that don't find bugs are expensive documentation."
|
|
14
|
+
> Write tests that fail when real user-facing behavior breaks — nothing less, nothing more.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 1. The Testing Trophy (2026 Standard)
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
/\
|
|
22
|
+
/E2E\ ← Small: happy paths, auth flows (Playwright)
|
|
23
|
+
/──────\
|
|
24
|
+
/Integr.\ ← Medium: RTL + MSW (component + API interaction)
|
|
25
|
+
/──────────\
|
|
26
|
+
/ Unit \ ← Foundation: Vitest (pure logic, transformations)
|
|
27
|
+
/──────────────\
|
|
28
|
+
/ Static Types \ ← Free: TypeScript + ESLint
|
|
29
|
+
/────────────────────\
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**Prioritize integration tests** — they catch the most real user bugs per test written.
|
|
33
|
+
**Minimize E2E** — they're slow, flaky, maintenance-heavy. Use only for critical flows.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 2. Unit Tests — Pure Logic with Vitest
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
// Target: Pure functions, transformations, calculations — no I/O
|
|
41
|
+
// ❌ DON'T unit test: component rendering, API calls, DB queries
|
|
42
|
+
|
|
43
|
+
// ✅ DO unit test: business logic isolated
|
|
44
|
+
import { describe, it, expect } from 'vitest';
|
|
45
|
+
import { calculateDiscount } from './pricing';
|
|
46
|
+
|
|
47
|
+
describe('calculateDiscount()', () => {
|
|
48
|
+
// Always test the happy path
|
|
49
|
+
it('applies 10% to orders over $100', () => {
|
|
50
|
+
expect(calculateDiscount(150)).toBe(135);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
// Always test all boundary cases
|
|
54
|
+
it('applies no discount at exactly $100 (exclusive boundary)', () => {
|
|
55
|
+
expect(calculateDiscount(100)).toBe(100);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
// Always test error/invalid input
|
|
59
|
+
it('throws RangeError on negative input', () => {
|
|
60
|
+
expect(() => calculateDiscount(-50)).toThrow(RangeError);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// Always test zero and extreme values
|
|
64
|
+
it('returns 0 for $0 order', () => {
|
|
65
|
+
expect(calculateDiscount(0)).toBe(0);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## 3. Integration Tests — RTL + MSW
|
|
73
|
+
|
|
74
|
+
Integration tests render real components against mocked network — closest thing to real user behavior.
|
|
75
|
+
|
|
76
|
+
```typescript
|
|
77
|
+
// vitest.setup.ts
|
|
78
|
+
import { afterEach } from 'vitest';
|
|
79
|
+
import { cleanup } from '@testing-library/react';
|
|
80
|
+
afterEach(cleanup);
|
|
81
|
+
|
|
82
|
+
// handlers.ts — MSW intercepts at network layer (no axios/fetch mocking)
|
|
83
|
+
import { http, HttpResponse } from 'msw';
|
|
84
|
+
export const handlers = [
|
|
85
|
+
http.get('/api/users/:id', ({ params }) => {
|
|
86
|
+
return HttpResponse.json({
|
|
87
|
+
id: params.id,
|
|
88
|
+
name: 'Alice',
|
|
89
|
+
email: 'alice@example.com'
|
|
90
|
+
});
|
|
91
|
+
}),
|
|
92
|
+
http.post('/api/auth/login', async ({ request }) => {
|
|
93
|
+
const body = await request.json();
|
|
94
|
+
if (body.password === 'wrong') {
|
|
95
|
+
return HttpResponse.json({ error: 'Invalid credentials' }, { status: 401 });
|
|
96
|
+
}
|
|
97
|
+
return HttpResponse.json({ token: 'mock-jwt' });
|
|
98
|
+
}),
|
|
99
|
+
];
|
|
100
|
+
|
|
101
|
+
// UserProfile.test.tsx
|
|
102
|
+
import { render, screen, waitFor } from '@testing-library/react';
|
|
103
|
+
import userEvent from '@testing-library/user-event';
|
|
104
|
+
import { UserProfile } from './UserProfile';
|
|
105
|
+
|
|
106
|
+
test('shows user name after loading', async () => {
|
|
107
|
+
const user = userEvent.setup();
|
|
108
|
+
render(<UserProfile userId="1" />);
|
|
109
|
+
|
|
110
|
+
// Test loading state
|
|
111
|
+
expect(screen.getByText('Loading...')).toBeInTheDocument();
|
|
112
|
+
|
|
113
|
+
// Wait for async data
|
|
114
|
+
await screen.findByText('Alice');
|
|
115
|
+
expect(screen.getByRole('heading', { name: 'Alice' })).toBeInTheDocument();
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
test('shows error on failed load', async () => {
|
|
119
|
+
server.use(
|
|
120
|
+
http.get('/api/users/:id', () => {
|
|
121
|
+
return HttpResponse.json({ error: 'Not found' }, { status: 404 });
|
|
122
|
+
})
|
|
123
|
+
);
|
|
124
|
+
render(<UserProfile userId="999" />);
|
|
125
|
+
await screen.findByText(/user not found/i);
|
|
126
|
+
});
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## 4. Playwright E2E — Critical Paths Only
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
// playwright.config.ts
|
|
135
|
+
import { defineConfig, devices } from '@playwright/test';
|
|
136
|
+
|
|
137
|
+
export default defineConfig({
|
|
138
|
+
testDir: './e2e',
|
|
139
|
+
fullyParallel: true,
|
|
140
|
+
retries: process.env.CI ? 2 : 0, // Retry in CI for flakiness
|
|
141
|
+
reporter: [['html'], ['github']],
|
|
142
|
+
use: {
|
|
143
|
+
baseURL: 'http://localhost:3000',
|
|
144
|
+
trace: 'on-first-retry', // Record trace only on failure
|
|
145
|
+
video: 'on-first-retry', // Record video only on failure
|
|
146
|
+
screenshot: 'only-on-failure',
|
|
147
|
+
},
|
|
148
|
+
projects: [
|
|
149
|
+
{ name: 'chromium', use: { ...devices['Desktop Chrome'] } },
|
|
150
|
+
{ name: 'Mobile Safari', use: { ...devices['iPhone 14'] } },
|
|
151
|
+
],
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
// e2e/auth.spec.ts
|
|
155
|
+
import { test, expect } from '@playwright/test';
|
|
156
|
+
|
|
157
|
+
// Store auth state to avoid logging in every test
|
|
158
|
+
test.use({ storageState: 'e2e/auth.json' });
|
|
159
|
+
|
|
160
|
+
test('user can complete checkout flow', async ({ page }) => {
|
|
161
|
+
await page.goto('/products');
|
|
162
|
+
await page.getByRole('button', { name: 'Add to cart' }).first().click();
|
|
163
|
+
await page.getByRole('link', { name: 'Cart' }).click();
|
|
164
|
+
await expect(page.getByText('1 item')).toBeVisible();
|
|
165
|
+
await page.getByRole('button', { name: 'Checkout' }).click();
|
|
166
|
+
await expect(page).toHaveURL('/checkout');
|
|
167
|
+
});
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## 5. Selectors — Resilience Rules
|
|
173
|
+
|
|
174
|
+
```typescript
|
|
175
|
+
// ❌ BRITTLE (fails on UI refactor)
|
|
176
|
+
page.locator('.cart-btn > span.label');
|
|
177
|
+
getByTestId('btn-0'); // Index-based
|
|
178
|
+
container.querySelector('#submit-47f3'); // Generated ID
|
|
179
|
+
|
|
180
|
+
// ✅ RESILIENT (survives refactoring + validates accessibility)
|
|
181
|
+
getByRole('button', { name: /add to cart/i }) // Role + name
|
|
182
|
+
getByLabelText('Email address') // Form label association
|
|
183
|
+
getByPlaceholderText('Search products') // Input placeholder
|
|
184
|
+
getByText('Free shipping on orders over $50') // Visible text
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## 6. API Route Testing
|
|
190
|
+
|
|
191
|
+
```typescript
|
|
192
|
+
// Test server routes with supertest — no browser needed
|
|
193
|
+
import request from 'supertest';
|
|
194
|
+
import app from '../src/app';
|
|
195
|
+
|
|
196
|
+
describe('POST /api/auth/login', () => {
|
|
197
|
+
it('returns JWT on valid credentials', async () => {
|
|
198
|
+
const response = await request(app)
|
|
199
|
+
.post('/api/auth/login')
|
|
200
|
+
.send({ email: 'alice@example.com', password: 'correct' })
|
|
201
|
+
.expect(200);
|
|
202
|
+
|
|
203
|
+
expect(response.body).toMatchObject({ token: expect.any(String) });
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
it('returns 401 on invalid credentials', async () => {
|
|
207
|
+
await request(app)
|
|
208
|
+
.post('/api/auth/login')
|
|
209
|
+
.send({ email: 'alice@example.com', password: 'wrong' })
|
|
210
|
+
.expect(401);
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
it('returns 429 after 10 failed attempts', async () => {
|
|
214
|
+
for (let i = 0; i < 10; i++) {
|
|
215
|
+
await request(app).post('/api/auth/login').send({ password: 'wrong' });
|
|
216
|
+
}
|
|
217
|
+
await request(app)
|
|
218
|
+
.post('/api/auth/login')
|
|
219
|
+
.send({ password: 'wrong' })
|
|
220
|
+
.expect(429); // Rate limit hit
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## 🏛️ Tribunal Integration
|
|
228
|
+
|
|
229
|
+
### Pre-Delivery Checklist
|
|
230
|
+
|
|
231
|
+
```
|
|
232
|
+
✅ Pure logic isolated in Vitest unit tests (no RTL in unit tests)
|
|
233
|
+
✅ Component behavior tested via RTL + MSW (not mocking React hooks)
|
|
234
|
+
✅ Both happy path AND error path tested for every feature
|
|
235
|
+
✅ Boundary values tested (0, null, empty, max) for all inputs
|
|
236
|
+
✅ Selectors use getByRole/getByLabelText (not CSS classes or generated IDs)
|
|
237
|
+
✅ E2E tests use storageState for auth (not logging in from UI each test)
|
|
238
|
+
✅ Auth rate-limiting tested explicitly (429 on N failed attempts)
|
|
239
|
+
✅ Playwright traces/videos recorded on first retry only (not always)
|
|
240
|
+
✅ Test names describe behavior ("shows error on failed load") not implementation
|
|
241
|
+
✅ All tests pass clean before Human Gate
|
|
242
|
+
```
|