Тестирование
Unit-тесты
Запуск Vitest:
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-отчёт последнего прогона (скриншоты, трейсы, видео падений). |
Типовой рабочий процесс
- Первый раз:
pnpm test:e2e:install - Пишешь тесты:
pnpm test:e2e:ui - CI или полный прогон:
pnpm test:e2e - Разбираешь падение:
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:
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:
- Открыть приложение в demo-режиме, считать Pinia-стора́ через devtools и сохранить
{ wallets, categories, trns }вapp/scripts/.demo-snapshot.json(в gitignore). node app/scripts/gen-seed.mjs- пишетapp/supabase/seed.sql.
Синтетические категории adjustment / transfer пропускаются (это литералы trns.categoryId, а не реальные строки категорий).
Вход под тест-юзером
app/scripts/dev-login.mjs минтит сессию через password grant и печатает значение для localStorage['finapp.auth']:
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 и переиспользовать сессию между тестами.