Перейти к содержанию

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, user postgres
  • Передаёт в тест 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/