235 lines
6.3 KiB
Markdown
235 lines
6.3 KiB
Markdown
# MPC System Test Suite
|
|
|
|
This directory contains the automated test suite for the MPC Distributed Signature System.
|
|
|
|
## Test Structure
|
|
|
|
```
|
|
tests/
|
|
├── unit/ # Unit tests for domain logic
|
|
│ ├── session_coordinator/ # Session coordinator domain tests
|
|
│ ├── account/ # Account domain tests
|
|
│ └── pkg/ # Shared package tests
|
|
├── integration/ # Integration tests (require database)
|
|
│ ├── session_coordinator/ # Session coordinator repository tests
|
|
│ └── account/ # Account repository tests
|
|
├── e2e/ # End-to-end tests (require full services)
|
|
│ ├── keygen_flow_test.go # Complete keygen workflow test
|
|
│ └── account_flow_test.go # Complete account workflow test
|
|
├── mocks/ # Mock implementations for testing
|
|
├── docker-compose.test.yml # Docker Compose for test environment
|
|
├── Dockerfile.test # Dockerfile for test runner
|
|
└── README.md # This file
|
|
```
|
|
|
|
## Running Tests
|
|
|
|
### Unit Tests
|
|
|
|
Unit tests don't require any external dependencies:
|
|
|
|
```bash
|
|
# Run all unit tests
|
|
make test-unit
|
|
|
|
# Or directly with go test
|
|
go test -v -race -short ./...
|
|
```
|
|
|
|
### Integration Tests
|
|
|
|
Integration tests require PostgreSQL, Redis, and RabbitMQ:
|
|
|
|
```bash
|
|
# Start test infrastructure
|
|
docker-compose -f tests/docker-compose.test.yml up -d postgres-test redis-test rabbitmq-test migrate
|
|
|
|
# Run integration tests
|
|
make test-integration
|
|
|
|
# Or directly with go test
|
|
go test -v -race -tags=integration ./tests/integration/...
|
|
```
|
|
|
|
### End-to-End Tests
|
|
|
|
E2E tests require all services running:
|
|
|
|
```bash
|
|
# Start full test environment
|
|
docker-compose -f tests/docker-compose.test.yml up -d
|
|
|
|
# Run E2E tests
|
|
make test-e2e
|
|
|
|
# Or directly with go test
|
|
go test -v -race -tags=e2e ./tests/e2e/...
|
|
```
|
|
|
|
### All Tests with Docker
|
|
|
|
Run all tests in isolated Docker environment:
|
|
|
|
```bash
|
|
# Run integration tests
|
|
docker-compose -f tests/docker-compose.test.yml run --rm integration-tests
|
|
|
|
# Run E2E tests
|
|
docker-compose -f tests/docker-compose.test.yml run --rm e2e-tests
|
|
|
|
# Clean up
|
|
docker-compose -f tests/docker-compose.test.yml down -v
|
|
```
|
|
|
|
## Test Coverage
|
|
|
|
Generate test coverage report:
|
|
|
|
```bash
|
|
make test-coverage
|
|
```
|
|
|
|
This will generate:
|
|
- `coverage.out` - Coverage data file
|
|
- `coverage.html` - HTML coverage report
|
|
|
|
## Test Environment Variables
|
|
|
|
### Integration Tests
|
|
|
|
- `TEST_DATABASE_URL` - PostgreSQL connection string
|
|
- Default: `postgres://mpc_user:mpc_password@localhost:5432/mpc_system_test?sslmode=disable`
|
|
- `TEST_REDIS_URL` - Redis connection string
|
|
- Default: `localhost:6379`
|
|
- `TEST_RABBITMQ_URL` - RabbitMQ connection string
|
|
- Default: `amqp://mpc_user:mpc_password@localhost:5672/`
|
|
|
|
### E2E Tests
|
|
|
|
- `SESSION_COORDINATOR_URL` - Session Coordinator service URL
|
|
- Default: `http://localhost:8080`
|
|
- `ACCOUNT_SERVICE_URL` - Account service URL
|
|
- Default: `http://localhost:8083`
|
|
|
|
## Writing Tests
|
|
|
|
### Unit Test Guidelines
|
|
|
|
1. Test domain entities and value objects
|
|
2. Test use case logic with mocked dependencies
|
|
3. Use table-driven tests for multiple scenarios
|
|
4. Follow naming convention: `TestEntityName_MethodName`
|
|
|
|
Example:
|
|
```go
|
|
func TestMPCSession_AddParticipant(t *testing.T) {
|
|
t.Run("should add participant successfully", func(t *testing.T) {
|
|
// Test implementation
|
|
})
|
|
|
|
t.Run("should fail when participant limit reached", func(t *testing.T) {
|
|
// Test implementation
|
|
})
|
|
}
|
|
```
|
|
|
|
### Integration Test Guidelines
|
|
|
|
1. Use `//go:build integration` build tag
|
|
2. Create and clean up test data in SetupTest/TearDownTest
|
|
3. Use testify suite for complex test scenarios
|
|
4. Test repository implementations against real database
|
|
|
|
### E2E Test Guidelines
|
|
|
|
1. Use `//go:build e2e` build tag
|
|
2. Test complete user workflows
|
|
3. Verify API contracts
|
|
4. Test error scenarios and edge cases
|
|
|
|
## Mocks
|
|
|
|
Mock implementations are provided in `tests/mocks/`:
|
|
|
|
- `MockSessionRepository` - Session coordinator repository mock
|
|
- `MockAccountRepository` - Account repository mock
|
|
- `MockAccountShareRepository` - Account share repository mock
|
|
- `MockEventPublisher` - Event publisher mock
|
|
- `MockTokenService` - JWT token service mock
|
|
- `MockCacheService` - Cache service mock
|
|
|
|
Usage:
|
|
```go
|
|
import "github.com/rwadurian/mpc-system/tests/mocks"
|
|
|
|
func TestSomething(t *testing.T) {
|
|
mockRepo := new(mocks.MockSessionRepository)
|
|
mockRepo.On("Create", mock.Anything, mock.Anything).Return(nil)
|
|
|
|
// Use mockRepo in test
|
|
|
|
mockRepo.AssertExpectations(t)
|
|
}
|
|
```
|
|
|
|
## CI/CD Integration
|
|
|
|
The test suite is designed to run in CI/CD pipelines:
|
|
|
|
```yaml
|
|
# GitHub Actions example
|
|
jobs:
|
|
test:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
|
|
- name: Set up Go
|
|
uses: actions/setup-go@v4
|
|
with:
|
|
go-version: '1.21'
|
|
|
|
- name: Run unit tests
|
|
run: make test-unit
|
|
|
|
- name: Start test services
|
|
run: docker-compose -f tests/docker-compose.test.yml up -d postgres-test redis-test rabbitmq-test
|
|
|
|
- name: Wait for services
|
|
run: sleep 10
|
|
|
|
- name: Run migrations
|
|
run: docker-compose -f tests/docker-compose.test.yml run --rm migrate
|
|
|
|
- name: Run integration tests
|
|
run: make test-integration
|
|
|
|
- name: Upload coverage
|
|
uses: codecov/codecov-action@v3
|
|
with:
|
|
files: ./coverage.out
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Database Connection Issues
|
|
|
|
If integration tests fail with connection errors:
|
|
1. Ensure PostgreSQL is running on port 5433
|
|
2. Check `TEST_DATABASE_URL` environment variable
|
|
3. Verify database user permissions
|
|
|
|
### Service Health Check Failures
|
|
|
|
If E2E tests timeout waiting for services:
|
|
1. Check service logs: `docker-compose -f tests/docker-compose.test.yml logs <service-name>`
|
|
2. Ensure all required environment variables are set
|
|
3. Verify port mappings in docker-compose.test.yml
|
|
|
|
### Flaky Tests
|
|
|
|
If tests are intermittently failing:
|
|
1. Add appropriate waits for async operations
|
|
2. Ensure test data isolation between tests
|
|
3. Check for race conditions with `-race` flag
|