From 8ae8ca1a1da7ab80dbd706dafc1fb827387cf505 Mon Sep 17 00:00:00 2001 From: grendervill Date: Sun, 20 Sep 2026 20:57:54 +0300 Subject: [PATCH] =?UTF-8?q?test(web):=20e2e=20=D0=B3=D0=BE=D0=BB=D0=BE?= =?UTF-8?q?=D1=81=D0=B0=20=D1=80=D0=B0=D0=B7=D0=BB=D0=B8=D1=87=D0=B0=D0=B5?= =?UTF-8?q?=D1=82=20=D0=BE=D1=82=D1=81=D1=83=D1=82=D1=81=D1=82=D0=B2=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D1=8F=20=D0=B8=20=D0=BB=D0=B8=D0=BC=D0=B8=D1=82=20?= =?UTF-8?q?=D1=87=D0=B0=D1=81=D1=82=D0=BE=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Регистрация тестового пользователя выполнялась на любой неудачный вход, из-за чего при `rate_limited` прогон падал на попытке регистрации. Теперь: - 401 → пользователя нет, регистрируем; 429 → ждём `retry_after_ms` и повторяем; - 409 при регистрации (аккаунт уже есть) → просто входим; - число повторов увеличено до шести. Прогон зелёный, аккаунт `voiceprobe` переиспользуется. --- web/e2e/voice.spec.ts | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/web/e2e/voice.spec.ts b/web/e2e/voice.spec.ts index 4740174..dd07630 100644 --- a/web/e2e/voice.spec.ts +++ b/web/e2e/voice.spec.ts @@ -127,7 +127,7 @@ async function postWithRetry( api: APIRequestContext, path: string, data: Record, - attempts = 4, + attempts = 6, ): Promise>> { 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()}`); } - const registered = await postWithRetry(guest, '/api/v1/auth/register', { - username: PROBE_LOGIN, - email, - password, - }); - expect( - registered.ok(), - `тестовый пользователь ${PROBE_LOGIN} не найден и не зарегистрирован ` + - `(регистрация выключена?): ${await registered.text()}`, - ).toBeTruthy(); - const payload = (await registered.json()) as { user: { id: string } }; + if (!login.ok()) { + const registered = await postWithRetry(guest, '/api/v1/auth/register', { + username: PROBE_LOGIN, + ...credentials, + }); + expect( + registered.ok() || registered.status() === 409, + `тестовый пользователь ${PROBE_LOGIN} не зарегистрирован: ${await registered.text()}`, + ).toBeTruthy(); + // 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 }; }