fix(ui): сохранять формы проб после подтверждения API
This commit is contained in:
1 parent
bb9278fe58
commit
2f5b617e8c
4 files changed
+189
-91
No files matched your search
@@ -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()
|
||||
})
|
||||
}
|
||||
Reference in new issue
Block a user