# Backup Service Tests

## Test Structure

```
test/
├── unit/                          # Unit tests (no external dependencies)
│   ├── api/                       # Controller tests
│   ├── application/               # Handler tests
│   ├── domain/                    # Entity and value object tests
│   ├── infrastructure/            # Service tests
│   └── shared/                    # Guard, filter, interceptor tests
├── integration/                   # Integration tests (mocked DB)
├── e2e/                          # End-to-end tests
│   ├── backup-share-mock.e2e-spec.ts  # Mock DB E2E tests
│   └── backup-share.e2e-spec.ts       # Real DB E2E tests
├── setup/                        # Test setup files
│   ├── global-setup.ts           # DB container setup
│   ├── global-teardown.ts        # DB container cleanup
│   ├── jest-e2e-setup.ts         # Real DB test setup
│   ├── jest-mock-setup.ts        # Mock test setup
│   └── test-database.helper.ts   # DB helper utilities
└── utils/                        # Test utilities
    ├── mock-prisma.service.ts    # Mock Prisma service
    └── test-utils.ts             # Helper functions
```

## Running Tests

### Unit Tests
```bash
npm run test:unit
```
Runs 37 unit tests. No external dependencies required.

### Mock E2E Tests
```bash
npm run test:e2e:mock
# or
npm run test:e2e
```
Runs 21 E2E tests with mocked database. No Docker or PostgreSQL required.

### All Tests (Unit + Mock E2E)
```bash
npm run test:all
```
Runs all 58 tests that don't require a real database.

### Real Database E2E Tests

#### Option 1: With Docker Desktop
```bash
# Ensure Docker Desktop is running
npm run test:e2e:db
```
This will:
1. Start PostgreSQL container (port 5434)
2. Push Prisma schema
3. Run 32 E2E tests
4. Stop and cleanup container

#### Option 2: With Existing PostgreSQL
```bash
# 1. Create a test database
psql -c "CREATE DATABASE rwa_backup_test;"

# 2. Update DATABASE_URL in .env.test
# DATABASE_URL="postgresql://user:password@localhost:5432/rwa_backup_test"

# 3. Setup database schema
npm run db:test:setup

# 4. Run tests
npm run test:e2e:db:manual
```

## Test Commands

| Command | Description |
|---------|-------------|
| `npm run test` | Run all Jest tests |
| `npm run test:unit` | Run unit tests only |
| `npm run test:e2e` | Run mock E2E tests |
| `npm run test:e2e:mock` | Run mock E2E tests |
| `npm run test:e2e:db` | Run real DB E2E tests (Docker) |
| `npm run test:e2e:db:manual` | Run real DB E2E tests (existing DB) |
| `npm run test:all` | Run unit + mock E2E tests |
| `npm run test:cov` | Run tests with coverage |
| `npm run db:test:up` | Start test DB container |
| `npm run db:test:down` | Stop test DB container |
| `npm run db:test:setup` | Setup existing DB for tests |

## Test Environment Variables

Located in `.env.test`:

```env
DATABASE_URL="postgresql://postgres:testpassword@localhost:5434/rwa_backup_test"
APP_PORT=3003
APP_ENV="test"
SERVICE_JWT_SECRET="test-super-secret-service-jwt-key-for-e2e-testing"
ALLOWED_SERVICES="identity-service,recovery-service"
BACKUP_ENCRYPTION_KEY="0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
BACKUP_ENCRYPTION_KEY_ID="test-key-v1"
```

## Test Utilities

### generateServiceToken(service, secret?)
Generates a JWT service token for testing authenticated endpoints.

### createStoreSharePayload(overrides?)
Creates a valid store share request payload.

### createRetrieveSharePayload(overrides?)
Creates a valid retrieve share request payload.

### createRevokeSharePayload(overrides?)
Creates a valid revoke share request payload.

### MockPrismaService
Full mock implementation of PrismaService for testing without a database.

## Coverage Report

Generate coverage report:
```bash
npm run test:cov
```

Coverage output in `./coverage/` directory.
