name: tdd
This command enforces test-driven development methodology for GROWI.
Use /tdd when:
RED → GREEN → REFACTOR → REPEAT
RED: Write a failing test
GREEN: Write minimal code to pass
REFACTOR: Improve code, keep tests passing
REPEAT: Next feature/scenario
User: /tdd I need a function to validate page paths
Agent:
// src/utils/page-path-validator.ts
export interface ValidationResult {
isValid: boolean;
errorMessage?: string;
}
export function validatePagePath(path: string): ValidationResult {
throw new Error('Not implemented');
}
// src/utils/page-path-validator.spec.ts
describe('validatePagePath', () => {
it('should return valid for correct path', () => {
const result = validatePagePath('/user/docs/page');
expect(result.isValid).toBe(true);
});
it('should reject path without leading slash', () => {
const result = validatePagePath('user/docs');
expect(result.isValid).toBe(false);
expect(result.errorMessage).toBeDefined();
});
it('should reject empty path', () => {
const result = validatePagePath('');
expect(result.isValid).toBe(false);
});
});
turbo run test --filter @growi/app -- src/utils/page-path-validator.spec.ts
FAIL src/utils/page-path-validator.spec.ts
✕ should return valid for correct path
Error: Not implemented
✅ Tests fail as expected. Ready to implement.
export function validatePagePath(path: string): ValidationResult {
if (!path) {
return { isValid: false, errorMessage: 'Path cannot be empty' };
}
if (!path.startsWith('/')) {
return { isValid: false, errorMessage: 'Path must start with /' };
}
return { isValid: true };
}
turbo run test --filter @growi/app -- src/utils/page-path-validator.spec.ts
PASS ✓ All tests passing!
cd {package_dir} && pnpm vitest run --coverage src/utils/page-path-validator.spec.ts
Coverage: 100% ✅ (Target: 80%)
DO:
vitest-mock-extended for type-safe mocksDON'T:
Unit Tests (*.spec.ts):
Integration Tests (*.integ.ts):
Component Tests (*.spec.tsx):
MANDATORY: Tests must be written BEFORE implementation. The TDD cycle is:
Never skip the RED phase. Never write code before tests.
This command uses patterns from: