# Integration Tests

This directory contains integration tests for the Xpeditis backend infrastructure layer.

## Overview

Integration tests verify that our infrastructure adapters (repositories, cache, carrier connectors) work correctly with their respective external services or mocks.

## Test Coverage

### Redis Cache Adapter (`redis-cache.adapter.spec.ts`)
- ✅ Get and set operations with various data types
- ✅ TTL (Time To Live) functionality
- ✅ Delete operations (single, multiple, clear all)
- ✅ Statistics tracking (hits, misses, hit rate)
- ✅ Error handling and resilience
- ✅ Complex data structures (nested objects, arrays)
- ✅ Key patterns and namespacing

### Booking Repository (`booking.repository.spec.ts`)
- ✅ Save new bookings
- ✅ Update existing bookings
- ✅ Find by ID, booking number, organization, status
- ✅ Delete bookings
- ✅ Complex scenarios with nested data (shipper, consignee)
- ✅ Data integrity verification

### Maersk Connector (`maersk.connector.spec.ts`)
- ✅ Search rates with successful responses
- ✅ Request/response mapping
- ✅ Surcharge handling
- ✅ Vessel and service information
- ✅ Empty results handling
- ✅ Error scenarios (timeout, API errors, malformed data)
- ✅ Circuit breaker behavior
- ✅ Health check functionality

## Running Integration Tests

### Prerequisites

**For Redis tests:**
- Redis server running on `localhost:6379` (or set `REDIS_HOST` and `REDIS_PORT`)
- Tests use Redis DB 1 by default (not DB 0)

**For Repository tests:**
- PostgreSQL server running on `localhost:5432` (or set `TEST_DB_*` variables)
- Tests will create a temporary database: `xpeditis_test`
- Tests use `synchronize: true` and `dropSchema: true` for clean slate

### Commands

```bash
# Run all integration tests
npm run test:integration

# Run with coverage report
npm run test:integration:cov

# Run in watch mode (for development)
npm run test:integration:watch

# Run specific test file
npm run test:integration -- redis-cache.adapter.spec.ts
```

### Environment Variables

Create a `.env.test` file or set these variables:

```bash
# Database (for repository tests)
TEST_DB_HOST=localhost
TEST_DB_PORT=5432
TEST_DB_USER=postgres
TEST_DB_PASSWORD=postgres
TEST_DB_NAME=xpeditis_test

# Redis (for cache tests)
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_DB=1

# Carrier APIs (for connector tests - mocked in tests)
MAERSK_API_BASE_URL=https://api.maersk.com
MAERSK_API_KEY=test-api-key
```

## Test Strategy

### Redis Cache Tests
- Uses `ioredis-mock` for isolated testing
- No real Redis connection required for CI/CD
- Fast execution, no external dependencies

### Repository Tests
- **Option 1 (Current)**: Real PostgreSQL database with `synchronize: true`
- **Option 2 (Recommended for CI)**: Use `testcontainers` for ephemeral PostgreSQL
- Tests create and destroy schema between runs
- Each test cleans up its data in `afterEach` hooks

### Carrier Connector Tests
- Uses mocked HTTP calls (jest mocks on axios)
- No real API calls to carriers
- Simulates various response scenarios
- Tests circuit breaker and retry logic

## Coverage Goals

Target coverage for infrastructure layer:

- **Redis Cache Adapter**: 90%+
- **Repositories**: 80%+
- **Carrier Connectors**: 80%+

## Best Practices

1. **Isolation**: Each test should be independent and not rely on other tests
2. **Cleanup**: Always clean up test data in `afterEach` or `afterAll`
3. **Mocking**: Use mocks for external services where appropriate
4. **Assertions**: Be specific with assertions - test both happy paths and error cases
5. **Performance**: Keep tests fast (< 5 seconds per test suite)

## Troubleshooting

### "Cannot connect to Redis"
- Ensure Redis is running: `redis-cli ping` should return `PONG`
- Check `REDIS_HOST` and `REDIS_PORT` environment variables
- For CI: ensure `ioredis-mock` is properly installed

### "Database connection failed"
- Ensure PostgreSQL is running
- Verify credentials in environment variables
- Check that user has permission to create databases

### "Tests timeout"
- Check `testTimeout` in `jest-integration.json` (default: 30s)
- Ensure database/Redis are responsive
- Look for hanging promises (missing `await`)

## Future Improvements

- [ ] Add testcontainers for PostgreSQL (better CI/CD)
- [ ] Add integration tests for User and Organization repositories
- [ ] Add integration tests for additional carrier connectors (MSC, CMA CGM)
- [ ] Add performance benchmarks
- [ ] Add integration tests for S3 storage adapter
- [ ] Add integration tests for email service
