test(web): e2e голоса различает отсутствие пользователя и лимит частоты

Регистрация тестового пользователя выполнялась на любой неудачный вход, из-за
чего при `rate_limited` прогон падал на попытке регистрации. Теперь:
- 401 → пользователя нет, регистрируем; 429 → ждём `retry_after_ms` и повторяем;
- 409 при регистрации (аккаунт уже есть) → просто входим;
- число повторов увеличено до шести.
Прогон зелёный, аккаунт `voiceprobe` переиспользуется.
This commit is contained in:
2026-09-20 20:57:54 +03:00
parent 197c3d1a82
commit 8ae8ca1a1d
+18 -12
View File
@@ -127,7 +127,7 @@ async function postWithRetry(
api: APIRequestContext,
path: string,
data: Record<string, unknown>,
attempts = 4,
attempts = 6,
): Promise<Awaited<ReturnType<APIRequestContext['post']>>> {
let response = await api.post(path, { data });
for (let attempt = 1; attempt < attempts && response.status() === 429; attempt += 1) {
@@ -144,29 +144,35 @@ async function postWithRetry(
* нет — регистрирует. Один и тот же аккаунт переиспользуется между прогонами:
* иначе каждый запуск оставлял бы в базе нового пользователя, а удалять
* пользователей API пока не умеет (это задача админ-панели Фазы 5).
*
* Важно различать «пользователя нет» (401 — тогда регистрируем) и «сработал
* лимит частоты» (429 — ждём и повторяем, иначе тест падал бы из-за защиты,
* которая обязана работать).
*/
async function ensureProbeGuest(
guest: APIRequestContext,
): Promise<{ id: string; email: string; password: string }> {
const email = `${PROBE_LOGIN}@gl.mhspx.su`;
const password = 'Voice-Probe-Password-9x';
const login = await postWithRetry(guest, '/api/v1/auth/login', { email, password });
if (login.ok()) {
const payload = (await login.json()) as { user: { id: string } };
await finishOnboarding(guest);
return { id: payload.user.id, email, password };
const credentials = { email, password };
let login = await postWithRetry(guest, '/api/v1/auth/login', credentials);
if (login.status() === 429) {
throw new Error(`вход тестового пользователя упёрся в лимит частоты: ${await login.text()}`);
}
if (!login.ok()) {
const registered = await postWithRetry(guest, '/api/v1/auth/register', {
username: PROBE_LOGIN,
email,
password,
...credentials,
});
expect(
registered.ok(),
`тестовый пользователь ${PROBE_LOGIN} не найден и не зарегистрирован ` +
`(регистрация выключена?): ${await registered.text()}`,
registered.ok() || registered.status() === 409,
`тестовый пользователь ${PROBE_LOGIN} не зарегистрирован: ${await registered.text()}`,
).toBeTruthy();
const payload = (await registered.json()) as { user: { id: string } };
// 409 — аккаунт уже существует (например, гонка прогонов): просто входим.
login = await postWithRetry(guest, '/api/v1/auth/login', credentials);
}
expect(login.ok(), `вход тестового пользователя: ${await login.text()}`).toBeTruthy();
const payload = (await login.json()) as { user: { id: string } };
await finishOnboarding(guest);
return { id: payload.user.id, email, password };
}