fix(ui): сохранять формы проб после подтверждения API

This commit is contained in:
Denozordec committed 2026-09-21 16:24:07 +07:00
1 parent bb9278fe58
commit 2f5b617e8c
4 files changed
+189 -91

No files matched your search

+82
View File
@@ -186,3 +186,85 @@ for (const speed of [false, true]) {
expect(control.writes).toEqual([])
})
}
for (const speed of [false, true]) {
for (const status of [400, 403, 500]) {
test(`сохранение ${speed ? "Speed" : "Ping"}: ${status} сохраняет черновик, повтор подтверждён`, async ({ page }) => {
await setup(page, "/uptime?probe=p1", 0, false, "mm:uptime:write")
await page.getByRole("button", { name: "Пауза", exact: true }).click()
if (speed) await page.getByRole("button", { name: /Скорость/ }).click()
let fail = true
const bodies: { probes: Record<string, unknown>[] }[] = []
await page.route(speed ? "**/api/uptime/speed-probes" : "**/api/uptime/probes", route => {
if (route.request().method() !== "PUT") return route.fallback()
bodies.push(route.request().postDataJSON())
return route.fulfill({ status: fail ? status : 200, json: fail ? { error: "Сохранение отклонено" } : { ok: true } })
})
await page.getByRole("button", { name: speed ? "Редактировать speed-пробу" : "Редактировать пробу", exact: true }).click()
const dialog = page.getByRole("dialog")
const input = speed ? dialog.locator('input').filter({ visible: true }).last() : dialog.getByPlaceholder("youtube.com")
await input.fill(speed ? "17" : "Черновик проверки")
await dialog.getByRole("button", { name: "Сохранить", exact: true }).click()
await expect(dialog.getByRole("alert")).toContainText(status === 403 ? "Недостаточно прав" : "Сохранение отклонено")
await expect(input).toHaveValue(speed ? "17" : "Черновик проверки")
fail = false
await dialog.getByRole("button", { name: "Сохранить", exact: true }).click()
await expect(dialog).toBeHidden()
expect(bodies).toHaveLength(2)
expect(bodies[1]).toEqual(bodies[0])
expect(bodies[1].probes[0][speed ? "durationSec" : "name"]).toBe(speed ? 17 : "Черновик проверки")
})
}
test(`сохранение ${speed ? "Speed" : "Ping"}: один PUT, Escape и отмена заблокированы до ответа`, async ({ page }) => {
await setup(page, "/uptime?probe=p1", 0, false, "mm:uptime:write")
await page.getByRole("button", { name: "Пауза", exact: true }).click()
if (speed) await page.getByRole("button", { name: /Скорость/ }).click()
let calls = 0
let release!: () => void
const pending = new Promise<void>(resolve => { release = resolve })
await page.route(speed ? "**/api/uptime/speed-probes" : "**/api/uptime/probes", async route => {
if (route.request().method() !== "PUT") return route.fallback()
calls++
await pending
await route.fulfill({ json: { ok: true } })
})
await page.getByRole("button", { name: speed ? "Редактировать speed-пробу" : "Редактировать пробу", exact: true }).click()
const dialog = page.getByRole("dialog")
await dialog.getByRole("button", { name: "Сохранить", exact: true }).evaluate(button => { (button as HTMLButtonElement).click(); (button as HTMLButtonElement).click() })
await expect(dialog.getByRole("button", { name: "Сохранение…", exact: true })).toBeDisabled()
await expect(dialog.getByRole("button", { name: "Отмена", exact: true })).toBeDisabled()
await expect(dialog.locator("fieldset input").last()).toBeDisabled()
await page.keyboard.press("Escape")
await expect(dialog).toBeVisible()
expect(calls).toBe(1)
release()
await expect(dialog).toBeHidden()
})
}
for (const speed of [false, true]) {
test(`сохранение ${speed ? "Speed" : "Ping"}: таймаут сохраняет форму с неизвестным результатом`, async ({ page }) => {
await page.addInitScript(() => {
const timeout = AbortSignal.timeout.bind(AbortSignal)
AbortSignal.timeout = ms => timeout(ms === 30_000 ? 100 : ms)
})
await setup(page, "/uptime?probe=p1", 0, false, "mm:uptime:write")
await page.getByRole("button", { name: "Пауза", exact: true }).click()
if (speed) await page.getByRole("button", { name: /Скорость/ }).click()
let release!: () => void
const pending = new Promise<void>(resolve => { release = resolve })
await page.route(speed ? "**/api/uptime/speed-probes" : "**/api/uptime/probes", async route => {
if (route.request().method() !== "PUT") return route.fallback()
await pending
await route.fulfill({ json: { ok: true } }).catch(() => {})
})
await page.getByRole("button", { name: speed ? "Редактировать speed-пробу" : "Редактировать пробу", exact: true }).click()
const dialog = page.getByRole("dialog")
await dialog.getByRole("button", { name: "Сохранить", exact: true }).click()
await expect(dialog.getByRole("alert")).toContainText("Результат операции неизвестен")
await expect(dialog.getByRole("button", { name: "Сохранить", exact: true })).toBeEnabled()
release()
await expect(dialog).toBeVisible()
})
}