Overview
Тест-инфраструктура: integration тесты с реальной БД, без моков.
Структура тестов¶
| Папка | Что покрыто |
|---|---|
test/integration/admin/ |
setEncryptPiiMode — PII-режим шифрования |
test/integration/cleanup/ |
incompleteRegistrationCleanup, userDeletionService |
test/integration/consumer/ |
checkReferralCode, saveCloseloopProfile |
test/integration/merchant/ |
merchantInvoice — создание инвойса |
test/integration/nfc/ |
adminSetNfcEnabled, merchantChargeByNfc, nfcChipReset, nfcCryptoService, nfcDecommissionWindow, nfcTagEndpoint, nfcTagService |
test/integration/payment/ |
paymentEndpoint, pspHmacClient, pspHmacClientMerchant, tbAccountIdDeriver, walletCreationService, walletEndpoint |
test/integration/pii/ |
piiCryptoService, piiHashService, piiMaskService, piiProfileWriter — round-trip шифрования |
test/unit/qr/ |
invoiceQrDecoder, invoiceQrEncoder, invoiceQrSigner — без БД |
withServerpod()¶
Хелпер из test/integration/test_tools/serverpod_test_tools.dart (auto-generated serverpod generate).
- Поднимает полный Serverpod-сервер с тестовой конфигурацией (
config/test.yaml+config/passwords.yaml) - Подключается к реальному PostgreSQL:
localhost:9090, базаonewallet_base_test, userpostgres - Передаёт в тест
sessionBuilderиendpoints— позволяет вызывать endpoint-методы как обычные функции sessionBuilder.copyWith(authentication: AuthenticationOverride.authenticationInfo(...))— строит аутентифицированную сессию
withServerpod('MyEndpoint', (sessionBuilder, endpoints) {
test('does something', () async {
final session = sessionBuilder.build();
final result = await endpoints.myEndpoint.myMethod(sessionBuilder, param);
expect(result, equals('expected'));
});
});
RollbackDatabase.afterEach¶
Опция rollbackDatabase: RollbackDatabase.afterEach в withServerpod(...) обеспечивает автоматический откат транзакции после каждого теста.
- Изменения, записанные в БД за время теста, не видны другим тестам
- Не требует
tearDownс ручной очисткой данных - Используется во всех тестах, работающих с реальными строками БД
withServerpod('MyService DB logic',
rollbackDatabase: RollbackDatabase.afterEach,
(sessionBuilder, _) {
// каждый test() получает чистое состояние БД
});
Правило: только реальный PostgreSQL¶
Моков БД в проекте нет. Причина: мок-дивергенция (mock вернул устаревшее поведение) привела к production-ошибке. Все integration тесты работают с реальным PostgreSQL контейнером.
Unit тесты (test/unit/) используются только для чистой бизнес-логики без DB: QR-кодирование, криптография, математика.
Known Issues¶
Missing DB views в тестовом контейнере¶
v_tx_history и v_user_tb_accounts отсутствуют в тестовой БД — они создаются в production средой pm.* схемы (Drizzle migrations), которая не является частью Serverpod-миграций.
Затронутые файлы:
- test/integration/payment/wallet_endpoint_test.dart
- test/integration/nfc/nfc_tag_service_test.dart
- test/integration/nfc/nfc_tag_endpoint_test.dart
Fix: добавить CREATE VIEW в setup тестового контейнера. wallet_endpoint_test.dart частично обходит проблему через seed в pm.tb_account_map напрямую.
Команды¶
# Запустить все integration тесты
dart test test/integration/
# Запустить unit тесты
dart test test/unit/
# Запустить конкретный файл с verbose
dart test test/integration/payment/psp_hmac_client_test.dart -v
# Ограничить параллелизм (рекомендуется при работе с БД)
dart test --concurrency=1 test/integration/