fix(ui): сериализовать ручной опрос и ограничить ожидание Speed-test
This commit is contained in:
1 parent
cc40a5e33d
commit
f7e0e20673
4 files changed
+121
-29
No files matched your search
@@ -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()
|
||||
})
|
||||
Reference in new issue
Block a user