Open Finapp
Разработка

Тестирование

Скрипты для unit- и E2E-тестов.

Unit-тесты

Запуск Vitest:

Terminal
pnpm test

E2E-тесты

E2E-тесты работают на Playwright. Playwright поставляет браузеры отдельно от npm-пакета, поэтому после клонирования нужна разовая установка.

Скрипты

СкриптНазначение
pnpm test:e2e:installРазовая установка бинарника Chromium. Повторять после обновления @playwright/test - версия браузера привязана к версии пакета.
pnpm test:e2eЗапуск всех тестов в headless-режиме. Используется в CI.
pnpm test:e2e:headedЗапуск с видимым окном браузера. Полезно, чтобы посмотреть сценарий или отладить нестабильный тест.
pnpm test:e2e:uiИнтерактивный UI Playwright с time-travel, watch-режимом и пошаговым просмотром. Лучший вариант для написания новых тестов.
pnpm test:e2e:reportОткрывает HTML-отчёт последнего прогона (скриншоты, трейсы, видео падений).

Типовой рабочий процесс

  1. Первый раз: pnpm test:e2e:install
  2. Пишешь тесты: pnpm test:e2e:ui
  3. CI или полный прогон: pnpm test:e2e
  4. Разбираешь падение: pnpm test:e2e:report

Строго обязательны только test:e2e и test:e2e:install - остальные это удобные обёртки над флагами playwright CLI.

Локальный вход без Google (seed-данные)

Тестам в реальном режиме (PowerSync) нужна активная сессия, но Google OAuth не автоматизируешь. Локальный стек поставляет фиксированного тест-юзера с email/паролем и набор данных из демо, чтобы агенты / Playwright / ручные прогоны входили в реальный режим без Google.

Email/password включён в бэкенде Supabase, но намеренно не выводится в UI приложения (только Google + Demo). Тест-юзер нужен для локальных тестов; его пароль локальный и не секрет.

Seed

app/supabase/seed.sql (генерируемый, идемпотентный, в транзакции) создаёт:

  • подтверждённого тест-юзера - e2e@finapp.local / finapp-e2e (фиксированный UUID), и
  • его набор из демо: 8 кошельков, 32 категории, ~860 транзакций.

Применяется автоматически при supabase db reset ([db.seed] в app/supabase/config.toml). Чтобы (пере)применить к работающей БД без полного reset:

Terminal
docker exec -i supabase_db_app psql -U postgres -d postgres < app/supabase/seed.sql

Вход по email/паролю работает через Supabase password grant даже при выключенной email-регистрации ([auth.email] enable_signup = false), потому что юзер создан заранее. Токен-колонки GoTrue в seed заданы как '' (не NULL) - NULL вызывает Database error querying schema при входе.

Перегенерация seed из демо-данных

seed.sql собирается из снапшота реального генератора демо скриптом app/scripts/gen-seed.mjs:

  1. Открыть приложение в demo-режиме, считать Pinia-стора́ через devtools и сохранить { wallets, categories, trns } в app/scripts/.demo-snapshot.json (в gitignore).
  2. node app/scripts/gen-seed.mjs - пишет app/supabase/seed.sql.

Синтетические категории adjustment / transfer пропускаются (это литералы trns.categoryId, а не реальные строки категорий).

Вход под тест-юзером

app/scripts/dev-login.mjs минтит сессию через password grant и печатает значение для localStorage['finapp.auth']:

Terminal
node app/scripts/dev-login.mjs --raw    # печатает сырой JSON сессии

В браузере выставить это значение, очистить cookie finapp.isDemo и перезагрузить - приложение стартует в реальном режиме PowerSync под тест-юзером, seed-данные подтягиваются. Учётные данные/URL читаются из app/.env (переопределяются E2E_EMAIL / E2E_PASSWORD).

Это же основа для Playwright storageState global-setup: войти один раз через grant и переиспользовать сессию между тестами.