fix(ui): сериализовать ручной опрос и ограничить ожидание Speed-test

This commit is contained in:
Denozordec committed 2026-09-23 09:17:20 +07:00
1 parent cc40a5e33d
commit f7e0e20673
4 files changed
+121 -29

No files matched your search

+73
View File
@@ -400,3 +400,76 @@ test("Speed-test: один запуск, запись проб заблокир
await expect(run).toBeEnabled()
await expect(page.getByText("Измерение отклонено", { exact: true }).first()).toBeVisible()
})
for (const group of [false, true]) {
for (const status of [200, 403]) {
test(`ручной Ping ${group ? "группы" : "всех"}: один POST, блокировка записи, ответ ${status}`, async ({ page }) => {
await setup(page, group ? "/uptime?probe=p1" : "/uptime", 0, false, "mm:uptime:write")
await page.getByRole("button", { name: "Пауза", exact: true }).click()
let calls = 0
let reads = 0
let release!: () => void
const pending = new Promise<void>(resolve => { release = resolve })
await page.route("**/api/uptime/overview?*", route => { reads++; return route.fallback() })
await page.route(group ? "**/api/uptime/probes/collect-group" : "**/api/uptime/collect-now", async route => {
calls++
await pending
await route.fulfill({ status, json: status === 200 ? { ok: true, polled: 1 } : { error: "Forbidden" } })
})
const refresh = page.getByRole("button", { name: "Обновить", exact: true }).first()
await refresh.evaluate(button => { (button as HTMLButtonElement).click(); (button as HTMLButtonElement).click() })
await expect(refresh).toBeDisabled()
await expect(page.getByRole("button", { name: "Новая проба", exact: true })).toBeDisabled()
await expect(page.getByRole("switch").first()).toBeDisabled()
await expect.poll(() => calls).toBe(1)
await page.getByRole("button", { name: /Скорость/ }).click()
await expect(page.getByRole("button", { name: "Запустить", exact: true })).toBeDisabled()
release()
await expect(page.getByRole("button", { name: "Запустить", exact: true })).toBeEnabled()
await page.getByRole("button", { name: /Пинг-пробы/ }).click()
await expect(refresh).toBeEnabled()
if (status === 403) await expect(page.getByRole("alert").filter({ hasText: "Недостаточно прав" })).toBeVisible()
if (status === 200 || !group) expect(reads).toBeGreaterThan(0)
expect(calls).toBe(1)
})
}
}
test("Speed-test: таймаут освобождает действия и сообщает неизвестный результат", async ({ page }) => {
await page.addInitScript(() => {
const timeout = AbortSignal.timeout.bind(AbortSignal)
AbortSignal.timeout = ms => timeout(ms === 120_000 ? 100 : ms)
})
await setup(page, "/uptime?probe=p1", 0, false, "mm:uptime:write")
await page.getByRole("button", { name: "Пауза", exact: true }).click()
await page.getByRole("button", { name: /Скорость/ }).click()
let release!: () => void
const pending = new Promise<void>(resolve => { release = resolve })
await page.route("**/api/uptime/speed-test", async route => {
await pending
await route.fulfill({ json: { result: { txAvgMbps: 10, rxAvgMbps: 20 } } }).catch(() => {})
})
await page.getByRole("button", { name: "Запустить", exact: true }).click()
await expect(page.getByRole("alert").filter({ hasText: "Результат операции неизвестен" })).toBeVisible()
await expect(page.getByRole("button", { name: "Запустить", exact: true })).toBeEnabled()
await expect(page.getByRole("button", { name: "Редактировать speed-пробу", exact: true })).toBeEnabled()
release()
})
test("ручной Ping: поздняя ошибка выбранной пробы не попадает в новый список", async ({ page }) => {
await setup(page, "/uptime?probe=p1", 0, false, "mm:uptime:write")
let release!: () => void
const pending = new Promise<void>(resolve => { release = resolve })
await page.route("**/api/uptime/probes/collect-group", async route => {
await pending
await route.fulfill({ status: 500, json: { error: "Ошибка прежнего контекста" } })
})
await page.getByRole("button", { name: "Обновить", exact: true }).click()
await page.getByRole("link", { name: "Все проверки", exact: true }).click()
await expect(page.locator("[data-probe-id]")).toHaveCount(2)
const response = page.waitForResponse(r => r.url().endsWith("/collect-group"))
release()
await response
await expect(page.getByText("Ошибка прежнего контекста", { exact: true })).toHaveCount(0)
await expect(page.getByRole("button", { name: "Новая проба", exact: true })).toBeEnabled()
})