356 lines
8.4 KiB
Markdown
356 lines
8.4 KiB
Markdown
# Test All Command
|
|
|
|
Run the comprehensive test suite for the ExFabrica Agentic Factory monorepo, including unit tests, integration tests, and end-to-end tests for both backend and frontend applications.
|
|
|
|
## Usage
|
|
|
|
```
|
|
/test-all [target] [--coverage] [--watch] [--verbose]
|
|
```
|
|
|
|
## Parameters
|
|
|
|
- **target** (optional): Specific test target to run
|
|
- `backend` - Run only backend tests
|
|
- `frontend` - Run only frontend tests
|
|
- `e2e` - Run only end-to-end tests
|
|
- `unit` - Run only unit tests (backend + frontend)
|
|
- `integration` - Run only integration tests
|
|
- If omitted, runs all test suites
|
|
- **--coverage** (optional): Generate code coverage reports
|
|
- **--watch** (optional): Run tests in watch mode (auto-rerun on changes)
|
|
- **--verbose** (optional): Show detailed test output
|
|
|
|
## Test Suites
|
|
|
|
### Backend Tests (NestJS + Drizzle ORM)
|
|
|
|
**Unit Tests**
|
|
- Service layer tests
|
|
- Controller tests
|
|
- Utility function tests
|
|
- Guard and interceptor tests
|
|
|
|
**Integration Tests**
|
|
- API endpoint tests
|
|
- Database operation tests
|
|
- Authentication and authorization flows
|
|
- Third-party service integrations
|
|
|
|
**Test Location**: `apps/backend/src/**/*.spec.ts`
|
|
**Test Runner**: Jest
|
|
**Configuration**: `apps/backend/jest.config.js`
|
|
|
|
### Frontend Tests (Angular 20)
|
|
|
|
**Unit Tests**
|
|
- Component tests
|
|
- Service tests
|
|
- Pipe and directive tests
|
|
- Utility function tests
|
|
|
|
**Integration Tests**
|
|
- Component integration tests
|
|
- Router navigation tests
|
|
- State management tests
|
|
- HTTP interceptor tests
|
|
|
|
**Test Location**: `apps/frontend/src/**/*.spec.ts`
|
|
**Test Runner**: Karma + Jasmine
|
|
**Configuration**: `apps/frontend/karma.conf.js`
|
|
|
|
### End-to-End Tests
|
|
|
|
**E2E Scenarios**
|
|
- User authentication flows
|
|
- Critical user journeys
|
|
- Cross-application workflows
|
|
- API integration tests
|
|
|
|
**Test Location**: `apps/frontend/e2e/`
|
|
**Test Runner**: Protractor/Cypress (based on configuration)
|
|
|
|
## Workflow
|
|
|
|
When you execute this command, Claude will:
|
|
|
|
1. **Environment Setup**
|
|
- Verify Node.js version (22+)
|
|
- Check Yarn version (4.9.2)
|
|
- Ensure test database is available
|
|
- Set test environment variables
|
|
|
|
2. **Backend Tests**
|
|
- Run unit tests: `yarn workspace @bdqt/backend test`
|
|
- Run integration tests: `yarn workspace @bdqt/backend test:integration`
|
|
- Generate coverage report if requested
|
|
|
|
3. **Frontend Tests**
|
|
- Run unit tests: `yarn workspace @bdqt/frontend test --watch=false`
|
|
- Run in headless Chrome for CI compatibility
|
|
- Generate coverage report if requested
|
|
|
|
4. **E2E Tests** (if applicable)
|
|
- Start backend server in test mode
|
|
- Start frontend development server
|
|
- Run E2E test suite
|
|
- Shutdown servers after tests complete
|
|
|
|
5. **Results Aggregation**
|
|
- Combine test results from all suites
|
|
- Calculate overall coverage
|
|
- Generate unified test report
|
|
- Highlight any failures or warnings
|
|
|
|
## Examples
|
|
|
|
### Run All Tests
|
|
```
|
|
/test-all
|
|
```
|
|
Executes the complete test suite across all applications.
|
|
|
|
### Run Backend Tests Only
|
|
```
|
|
/test-all backend
|
|
```
|
|
Runs only the backend unit and integration tests.
|
|
|
|
### Run Frontend Tests Only
|
|
```
|
|
/test-all frontend
|
|
```
|
|
Runs only the frontend unit tests using Karma.
|
|
|
|
### Run Tests with Coverage
|
|
```
|
|
/test-all --coverage
|
|
```
|
|
Generates code coverage reports for all test suites.
|
|
|
|
### Run Tests in Watch Mode
|
|
```
|
|
/test-all backend --watch
|
|
```
|
|
Runs backend tests in watch mode for active development.
|
|
|
|
### Run E2E Tests with Verbose Output
|
|
```
|
|
/test-all e2e --verbose
|
|
```
|
|
Runs end-to-end tests with detailed logging.
|
|
|
|
## Coverage Thresholds
|
|
|
|
The test suite enforces minimum coverage thresholds:
|
|
|
|
### Backend Coverage Requirements
|
|
- **Statements**: 80%
|
|
- **Branches**: 75%
|
|
- **Functions**: 80%
|
|
- **Lines**: 80%
|
|
|
|
### Frontend Coverage Requirements
|
|
- **Statements**: 75%
|
|
- **Branches**: 70%
|
|
- **Functions**: 75%
|
|
- **Lines**: 75%
|
|
|
|
Tests will fail if coverage drops below these thresholds.
|
|
|
|
## Test Environment Configuration
|
|
|
|
### Backend Test Environment
|
|
- Uses in-memory SQLite for fast unit tests
|
|
- Uses test PostgreSQL database for integration tests (port 5442)
|
|
- JWT secrets use test values
|
|
- External API calls are mocked
|
|
|
|
### Frontend Test Environment
|
|
- Runs in headless Chrome
|
|
- Uses Angular testing utilities (TestBed)
|
|
- HTTP calls are mocked via HttpClientTestingModule
|
|
- LocalStorage/SessionStorage use test implementations
|
|
|
|
### E2E Test Environment
|
|
- Backend runs on port 3001 (test port)
|
|
- Frontend runs on port 4201 (test port)
|
|
- Test database is seeded with fixtures
|
|
- Clean state before each test suite
|
|
|
|
## Output Format
|
|
|
|
### Success Output
|
|
```
|
|
✓ Backend Unit Tests: 245 passed
|
|
✓ Backend Integration Tests: 67 passed
|
|
✓ Frontend Unit Tests: 189 passed
|
|
✓ E2E Tests: 34 passed
|
|
|
|
Total: 535 tests passed
|
|
Coverage: 82.5% (above threshold)
|
|
Duration: 3m 24s
|
|
|
|
All tests passed successfully! ✓
|
|
```
|
|
|
|
### Failure Output
|
|
```
|
|
✗ Backend Unit Tests: 243 passed, 2 failed
|
|
- UserService.createUser should hash password (apps/backend/src/users/users.service.spec.ts:42)
|
|
- AuthGuard should reject expired tokens (apps/backend/src/auth/auth.guard.spec.ts:78)
|
|
|
|
✓ Backend Integration Tests: 67 passed
|
|
✓ Frontend Unit Tests: 189 passed
|
|
|
|
Total: 499 tests passed, 2 failed
|
|
Coverage: 79.2% (below threshold)
|
|
|
|
Tests failed. Please fix the failing tests before proceeding.
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Test Database Connection Issues
|
|
```
|
|
Error: Cannot connect to test database
|
|
```
|
|
**Solution**: Ensure Docker is running and test database is available
|
|
```bash
|
|
docker compose up -d postgres-test
|
|
```
|
|
|
|
### Chrome/Browser Not Found (Frontend Tests)
|
|
```
|
|
Error: ChromeHeadless not found
|
|
```
|
|
**Solution**: Install Chromium or configure alternative browser
|
|
```bash
|
|
yarn add -D puppeteer
|
|
```
|
|
|
|
### Port Already in Use (E2E Tests)
|
|
```
|
|
Error: Port 3001 already in use
|
|
```
|
|
**Solution**: Stop any running development servers or use different test ports
|
|
|
|
### Memory Issues (Large Test Suites)
|
|
```
|
|
Error: JavaScript heap out of memory
|
|
```
|
|
**Solution**: Increase Node.js memory limit
|
|
```bash
|
|
export NODE_OPTIONS="--max-old-space-size=4096"
|
|
```
|
|
|
|
### Flaky E2E Tests
|
|
```
|
|
Error: Element not found within timeout
|
|
```
|
|
**Solution**: Increase wait timeouts or add explicit waits in E2E tests
|
|
|
|
## Performance Optimization
|
|
|
|
### Parallel Test Execution
|
|
Tests run in parallel by default using Jest workers:
|
|
- Backend: `--maxWorkers=50%`
|
|
- Frontend: `--parallel=true`
|
|
|
|
### Test Caching
|
|
Jest caches test results between runs:
|
|
```bash
|
|
# Clear test cache if needed
|
|
yarn jest --clearCache
|
|
```
|
|
|
|
### Selective Test Running
|
|
Run only changed tests during development:
|
|
```bash
|
|
yarn test --onlyChanged
|
|
```
|
|
|
|
## CI/CD Integration
|
|
|
|
This command is designed to work seamlessly with Azure DevOps pipelines:
|
|
|
|
### Pipeline Integration
|
|
```yaml
|
|
- task: Script@1
|
|
displayName: 'Run Test Suite'
|
|
inputs:
|
|
script: |
|
|
/test-all --coverage
|
|
```
|
|
|
|
### Test Results Publishing
|
|
Test results are automatically formatted for Azure DevOps:
|
|
- JUnit XML for test results
|
|
- Cobertura XML for coverage reports
|
|
- HTML reports for detailed analysis
|
|
|
|
## Best Practices
|
|
|
|
1. **Run tests before committing**
|
|
```
|
|
/test-all
|
|
# Commit only if all tests pass
|
|
```
|
|
|
|
2. **Use watch mode during development**
|
|
```
|
|
/test-all backend --watch
|
|
```
|
|
|
|
3. **Check coverage regularly**
|
|
```
|
|
/test-all --coverage
|
|
```
|
|
|
|
4. **Fix failing tests immediately**
|
|
- Don't let failing tests accumulate
|
|
- Maintain high test quality standards
|
|
|
|
5. **Run E2E tests before major releases**
|
|
```
|
|
/test-all e2e
|
|
```
|
|
|
|
## Related Commands
|
|
|
|
- `/deploy` - Deploy after tests pass
|
|
- `/analyze-code` - Check code quality and test coverage
|
|
- `/db-operations seed` - Seed test database with fixtures
|
|
|
|
## Test Writing Guidelines
|
|
|
|
### Backend Test Example
|
|
```typescript
|
|
describe('UserService', () => {
|
|
it('should create a new user with hashed password', async () => {
|
|
const userData = { email: 'test@example.com', password: 'password123' };
|
|
const user = await userService.create(userData);
|
|
|
|
expect(user.password).not.toBe('password123');
|
|
expect(await bcrypt.compare('password123', user.password)).toBe(true);
|
|
});
|
|
});
|
|
```
|
|
|
|
### Frontend Test Example
|
|
```typescript
|
|
describe('LoginComponent', () => {
|
|
it('should disable submit button when form is invalid', () => {
|
|
component.loginForm.controls['email'].setValue('');
|
|
fixture.detectChanges();
|
|
|
|
const submitButton = fixture.nativeElement.querySelector('button[type="submit"]');
|
|
expect(submitButton.disabled).toBe(true);
|
|
});
|
|
});
|
|
```
|
|
|
|
---
|
|
|
|
**Note**: All tests use the Yarn workspace structure. Direct Jest/Karma commands should be run through Yarn workspaces to respect the monorepo configuration.
|