test(web): e2e голоса различает отсутствие пользователя и лимит частоты
Регистрация тестового пользователя выполнялась на любой неудачный вход, из-за чего при `rate_limited` прогон падал на попытке регистрации. Теперь: - 401 → пользователя нет, регистрируем; 429 → ждём `retry_after_ms` и повторяем; - 409 при регистрации (аккаунт уже есть) → просто входим; - число повторов увеличено до шести. Прогон зелёный, аккаунт `voiceprobe` переиспользуется.
This commit is contained in:
+23
-17
@@ -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()}`);
|
||||
}
|
||||
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 };
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user