# Integration Tests Интеграционные тесты для Konduktor — полноценное тестирование сервера с реальными HTTP запросами. ## Отличие от unit-тестов | Аспект | Unit-тесты | Интеграционные тесты | |--------|------------|---------------------| | Scope | Отдельный модуль в изоляции | Весь сервер целиком | | Backend | Mock (httptest.Server) | Реальные HTTP серверы | | Config | Программный | YAML конфигурация | | Extensions | Не тестируются | Полная цепочка обработки | ## Структура тестов ``` tests/integration/ ├── README.md # Эта документация ├── helpers_test.go # Общие хелперы и утилиты ├── reverse_proxy_test.go # Тесты reverse proxy ├── routing_test.go # Тесты маршрутизации (TODO) ├── security_test.go # Тесты security extension (TODO) ├── caching_test.go # Тесты caching extension (TODO) └── static_files_test.go # Тесты статических файлов (TODO) ``` ## Что тестируют интеграционные тесты ### 1. Reverse Proxy (`reverse_proxy_test.go`) - [x] Базовое проксирование GET/POST/PUT/DELETE - [x] Exact match routes (`=/api/version`) - [x] Regex routes с параметрами (`~^/api/resource/(?P\d+)$`) - [x] Подстановка параметров в target URL (`{id}`, `{tag}`) - [x] Подстановка переменных в заголовки (`$remote_addr`) - [x] Передача заголовков X-Forwarded-For, X-Real-IP - [x] Сохранение query string - [x] Обработка ошибок backend (502, 504) - [x] Таймауты соединения ### 2. Routing Extension (`routing_test.go`) - [x] Приоритет маршрутов (exact > regex > default) - [x] Case-sensitive regex (`~`) - [x] Case-insensitive regex (`~*`) - [x] Default route (`__default__`) - [x] Return directive (`return 200 "OK"`) - [x] Regex с именованными группами - [x] Множественные regex маршруты - [x] Кастомные заголовки в маршрутах - [x] Обработка отсутствия маршрута ### 3. Security Extension (`security_test.go`) - [ ] IP whitelist - [ ] IP blacklist - [ ] CIDR нотация (10.0.0.0/8) - [ ] Security headers (X-Frame-Options, X-Content-Type-Options) - [ ] Rate limiting - [ ] Комбинация с другими extensions ### 4. Caching Extension (`caching_test.go`) - [x] Cache hit/miss - [x] TTL expiration - [x] Pattern-based caching - [x] Cache-Control headers (X-Cache header) - [x] Кэширование только GET запросов - [x] Разные пути = разные ключи кэша - [x] Query string влияет на ключ кэша - [x] Ошибки не кэшируются - [x] Конкурентный доступ к кэшу - [x] Множественные паттерны кэширования ### 5. Static Files (`static_files_test.go`) - [ ] Serving статических файлов - [ ] Index file (index.html) - [ ] MIME types - [ ] Cache-Control для static - [ ] SPA fallback - [ ] Directory traversal protection - [ ] 404 для несуществующих файлов ### 6. Extension Chain (`extension_chain_test.go`) - [ ] Порядок выполнения extensions (security → caching → routing) - [ ] Прерывание цепочки при ошибке - [ ] Совместная работа extensions ## Запуск тестов ```bash # Все интеграционные тесты go test ./tests/integration/... -v # Конкретный файл go test ./tests/integration/... -v -run TestReverseProxy # С таймаутом (интеграционные тесты медленнее) go test ./tests/integration/... -v -timeout 60s # С покрытием go test ./tests/integration/... -v -coverprofile=coverage.out ``` ## Требования - Свободные порты: тесты используют случайные порты (`:0`) - Сетевой доступ: для localhost соединений - Время: интеграционные тесты занимают больше времени (~5-10 сек) ## Добавление новых тестов 1. Создайте файл `*_test.go` в `tests/integration/` 2. Используйте хелперы из `helpers_test.go`: - `startTestServer()` — запуск Konduktor сервера - `startBackend()` — запуск mock backend - `makeRequest()` — отправка HTTP запроса 3. Добавьте описание в этот README ## CI/CD Интеграционные тесты запускаются отдельно от unit-тестов: ```yaml # .github/workflows/test.yml jobs: unit-tests: run: go test ./internal/... integration-tests: run: go test ./tests/integration/... -timeout 120s ```