krona-staff/tests/e2e/harness/context.ts
grok aa7f5f8bbd test(e2e): готовые роли через E2E_MIGRATOR_URL/E2E_APP_URL
Почему: TASK-GROK-3 п.1 — на общем кластере (параллельные прогоны приёмки, чужой стенд)
пересоздание ролей krona_migrator/krona_staff_app со случайными паролями ломает соседей.
Если заданы оба URL, global-setup не вызывает provision и не требует E2E_PG_ADMIN_URL;
по умолчанию поведение прежнее. provision-pg получил --roles keep: пересоздать только БД,
не меняя паролей (нужно accept-branch для отдельной БД на ветку).
ctx.adminDatabaseUrl (E2E_DB_ADMIN_URL или E2E_PG_ADMIN_URL + БД стенда) — только для PILOT-REHOME.
Проверено: run-e2e с E2E_MIGRATOR_URL/E2E_APP_URL без E2E_PG_ADMIN_URL — 45 failed | 9 passed,
как на основе; повторный прогон на уже мигрированной БД — то же.
2026-09-26 16:01:19 +07:00

43 lines
1.4 KiB
TypeScript

import { randomBytes } from 'node:crypto';
export interface E2EContext {
baseUrl: string;
openBaseUrl: string;
rateLimitBaseUrl: string;
managerToken: string;
terminalToken: string;
tenantId: string;
actorId: string;
terminalActorId: string;
appDatabaseUrl: string;
migrationDatabaseUrl: string;
/** Админ (владелец кластера) в БД стенда; null, если не передан. Только для PILOT-REHOME. */
adminDatabaseUrl: string | null;
}
declare module 'vitest' {
export interface ProvidedContext {
e2e: E2EContext;
}
}
const crockford = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';
/** Случайный ULID (время + crypto.randomBytes), чтобы не зависеть от src/. */
export function randomUlid(): string {
let time = Date.now();
let timePart = '';
for (let i = 0; i < 10; i += 1) {
timePart = crockford[time % 32]! + timePart;
time = Math.floor(time / 32);
}
const bytes = randomBytes(16);
let randomPart = '';
for (let i = 0; i < 16; i += 1) randomPart += crockford[bytes[i]! % 32]!;
return timePart + randomPart;
}
/** Синтетическая метка для данных тестов: очевидно не реальные люди/суммы. */
export function synthetic(label: string): string {
return `E2E-${label}-${randomBytes(3).toString('hex')}`;
}