PSA/ee/temporal-workflows/docs/E2E-TESTING.md
Hermes 284313f908
Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Initial import of AlgaPSA codebase from PSA server
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz

Source: /opt/alga-psa on psa.joliet.tech
2026-06-22 16:12:17 -05:00

284 lines
6.7 KiB
Markdown

# E2E Testing Guide
This guide explains how to run End-to-End (E2E) tests for the Temporal workflows.
## Overview
Our E2E testing strategy uses:
- **Temporal TestWorkflowEnvironment** for time-skipping unit tests
- **temporalio/auto-setup Docker container** for full integration tests
- **Main application database** for realistic data validation
- **Vitest** as the test runner with proper timeout configuration
## Test Types
### 1. Unit Tests (Database Logic)
Location: `src/activities/__tests__/*-simple.test.ts`
- Test database operations without Temporal context
- Fast execution, isolated test data
- Focus on business logic validation
```bash
npm run test:unit
```
### 2. E2E Tests (Full Workflow)
Location: `src/__tests__/e2e/*.e2e.test.ts`
- Test complete workflows with Temporal
- Real activity execution with database operations
- End-to-end validation of business processes
```bash
npm run test:e2e
```
## Prerequisites
1. **Main Application Database**: Must be running on port 5432
```bash
cd /Users/robertisaacs/alga-psa
docker-compose -f docker-compose.base.yaml up -d postgres
```
2. **Node.js 20+**: Required for Temporal SDK compatibility
3. **Docker**: For running Temporal test environment
## Running E2E Tests
### Method 1: Using NPM Scripts (Recommended)
```bash
# Run E2E tests once
npm run test:e2e
# Run E2E tests in watch mode
npm run test:e2e:watch
# Run all tests (unit + E2E)
npm run test:all
```
### Method 2: Manual Docker Setup
```bash
# Start Temporal test environment
npm run docker:test:up
# Wait for services to be ready (check logs)
docker-compose -f docker-compose.test.yml logs -f
# Run tests manually
npm test -- src/__tests__/e2e
# Clean up
npm run docker:test:down
```
### Method 3: Using Test Script
```bash
# Run the comprehensive E2E test script
./scripts/test-e2e.sh
# Run in watch mode
./scripts/test-e2e.sh --watch
```
## Test Environment Configuration
### Environment Files
- `.env.test`: Unit test configuration (uses main app DB)
- `.env.e2e`: E2E test configuration (Temporal + main app DB)
### Docker Services
**docker-compose.test.yml** includes:
- `temporal`: Temporal server with auto-setup
- `postgres`: Dedicated PostgreSQL for Temporal metadata
- `temporal-admin-tools`: CLI tools for debugging
### Ports
- **7233**: Temporal gRPC endpoint
- **8233**: Temporal Web UI (http://localhost:8233)
- **5433**: Temporal PostgreSQL
- **5432**: Main application PostgreSQL (external)
## Test Configuration
### Vitest Settings
```typescript
{
testTimeout: 120000, // 2 minutes for E2E tests
hookTimeout: 60000, // 1 minute for setup/teardown
pool: 'forks', // Required for Temporal
poolOptions: {
forks: { singleFork: true } // Prevent concurrent environments
}
}
```
### Temporal Settings
```typescript
{
address: 'localhost:7233',
namespace: 'default',
taskQueue: 'e2e-temporal-workflows'
}
```
## Writing E2E Tests
### Basic Structure
```typescript
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
import { TestWorkflowEnvironment } from '@temporalio/testing';
import { Worker } from '@temporalio/worker';
import * as activities from '../../activities';
import { myWorkflow } from '../../workflows/my-workflow';
describe('My Workflow E2E', () => {
let testEnv: TestWorkflowEnvironment;
beforeAll(async () => {
testEnv = await TestWorkflowEnvironment.createTimeSkipping();
});
afterAll(async () => {
await testEnv?.teardown();
});
it('should complete workflow successfully', async () => {
const worker = await Worker.create({
connection: testEnv.nativeConnection,
taskQueue: 'test-queue',
workflowsPath: require.resolve('../../workflows'),
activities,
});
const handle = await testEnv.client.workflow.start(myWorkflow, {
args: [{ input: 'test' }],
taskQueue: 'test-queue',
workflowId: 'test-' + Date.now(),
});
const result = await handle.result();
expect(result.success).toBe(true);
await worker.shutdown();
});
});
```
### Best Practices
1. **Unique Test Data**: Use timestamps to avoid conflicts
```typescript
const timestamp = Date.now();
const email = `test-${timestamp}@example.com`;
```
2. **Proper Cleanup**: Always clean up test data
```typescript
afterEach(async () => {
await testDb.cleanup();
});
```
3. **Realistic Data**: Use actual database operations
```typescript
// Verify in database, not just workflow result
const tenant = await testDb.getTenant(result.tenantId);
expect(tenant.client_name).toBe(input.companyName ?? input.tenantName);
```
4. **Error Testing**: Test failure scenarios
```typescript
await expect(handle.result()).rejects.toThrow('Expected error');
```
## Debugging
### Temporal Web UI
Visit http://localhost:8233 when test environment is running to:
- View workflow executions
- Inspect workflow history
- Debug failed workflows
### Logs
```bash
# View Temporal server logs
docker-compose -f docker-compose.test.yml logs temporal
# View PostgreSQL logs
docker-compose -f docker-compose.test.yml logs postgres
```
### Database Inspection
```bash
# Connect to test database
docker exec -it temporal-workflows-postgres-1 psql -U temporal -d temporal
# Connect to main app database
docker exec -it alga-psa-postgres-1 psql -U postgres -d server
```
## Troubleshooting
### Common Issues
1. **Timeout Errors**: Increase test timeouts in vitest.config.ts
2. **Port Conflicts**: Ensure ports 7233, 8233, 5433 are available
3. **Database Connection**: Verify main app database is running
4. **Memory Issues**: Use `singleFork: true` in Vitest pool options
### Error: "Main application database not running"
```bash
cd /Users/robertisaacs/alga-psa
docker-compose -f docker-compose.base.yaml up -d postgres
```
### Error: "Temporal connection failed"
```bash
# Restart test environment
npm run docker:test:down
npm run docker:test:up
```
### Error: "Test timeout"
- Check Temporal Web UI for stuck workflows
- Increase timeouts in vitest.config.ts
- Verify all services are healthy
## Performance
### Expected Test Times
- Basic setup test: ~10-30 seconds
- Simple workflow test: ~30-60 seconds
- Complex workflow test: ~1-2 minutes
### Optimization Tips
- Use `TestWorkflowEnvironment.createTimeSkipping()` for faster tests
- Minimize database operations in tests
- Use test data factories for consistent setup
- Run tests in single fork mode to avoid conflicts
## Integration with CI/CD
```yaml
# Example GitHub Actions step
- name: Run E2E Tests
run: |
docker-compose -f docker-compose.base.yaml up -d postgres
npm run test:e2e
env:
NODE_ENV: test
```
For more details, see the test files in `src/__tests__/e2e/` and the setup utilities in `src/test-utils/`.