fix(ui): подтверждать удаление проб и изменение звезды

This commit is contained in:
Denozordec committed 2026-09-21 21:08:06 +07:00
1 parent 4f235058be
commit ce14f5de3e
4 files changed
+136 -47

No files matched your search

+68
View File
@@ -303,3 +303,71 @@ for (const speed of [false, true]) {
expect(calls).toBe(2)
})
}
for (const speed of [false, true]) {
test(`удаление ${speed ? "Speed" : "Ping"}: подтверждение, отказ и повтор`, 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 fail = true
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++
const rows = route.request().postDataJSON().probes
expect(rows.some((p: { id: string }) => p.id === (speed ? "s1" : "p1"))).toBe(false)
if (fail) await pending
await route.fulfill({ status: fail ? 403 : 200, json: fail ? { error: "Forbidden" } : { ok: true } })
})
const remove = page.getByRole("button", { name: speed ? "Удалить speed-пробу" : "Удалить пробу", exact: true })
await remove.click()
const dialog = page.getByRole("alertdialog")
await expect(dialog).toContainText(speed ? "Источник → Назначение" : "Проверка сети → 192.0.2.10")
await dialog.getByRole("button", { name: "Отмена", exact: true }).click()
expect(calls).toBe(0)
await remove.click()
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 page.keyboard.press("Escape")
await expect(dialog).toBeVisible()
await expect.poll(() => calls).toBe(1)
release()
await expect(dialog.getByRole("alert")).toContainText("Недостаточно прав")
fail = false
await dialog.getByRole("button", { name: "Удалить", exact: true }).click()
await expect(dialog).toBeHidden()
await expect(remove).toHaveCount(0)
expect(calls).toBe(2)
})
}
test("звезда дашборда: состояние меняется после PATCH, ошибка сохраняет прежнее", async ({ page }) => {
await setup(page, "/uptime?probe=p1", 0, false, "mm:uptime:write")
await page.getByRole("button", { name: "Пауза", exact: true }).click()
let calls = 0
let fail = true
let release!: () => void
const pending = new Promise<void>(resolve => { release = resolve })
await page.route("**/api/uptime/probes/p1", async route => {
if (route.request().method() !== "PATCH") return route.fallback()
calls++
expect(route.request().postDataJSON()).toEqual({ showOnDashboard: true })
if (fail) await pending
await route.fulfill({ status: fail ? 500 : 200, json: fail ? { error: "Звезда не сохранена" } : { ok: true } })
})
const star = page.getByRole("button", { name: "Показать на дашборде", exact: true })
await star.click()
await expect(star).toBeDisabled()
await expect(star).toHaveAttribute("aria-pressed", "false")
await expect(page.getByRole("switch")).toBeDisabled()
await expect.poll(() => calls).toBe(1)
release()
await expect(page.getByRole("alert").filter({ hasText: "Звезда не сохранена" })).toBeVisible()
await expect(star).toBeEnabled()
fail = false
await star.click()
await expect(page.getByRole("button", { name: "Убрать с дашборда", exact: true })).toHaveAttribute("aria-pressed", "true")
expect(calls).toBe(2)
})