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

This commit is contained in:
Denozordec committed 2026-09-28 23:52:43 +07:00
1 parent 165f40acd7
commit f980619046
5 files changed
+131 -13

No files matched your search

+48
View File
@@ -127,3 +127,51 @@ for (const status of [403, 500]) {
expect(control.posts).toEqual([])
})
}
for (const kind of ["iface", "peer"] as const) {
test("WireGuard: подтверждение удаления и повтор после ошибки " + kind, async ({ page }) => {
await setup(page, "/wireguard?server=1&interface=*%2F2")
let attempts = 0
let release: (() => void) | undefined
const gate = new Promise<void>(resolve => { release = resolve })
await page.route("**/api/wireguard/" + (kind === "iface" ? "interfaces" : "peers") + "/**", async route => {
expect(route.request().method()).toBe("DELETE")
expect(decodeURIComponent(new URL(route.request().url()).pathname)).toBe(
kind === "iface" ? "/api/wireguard/interfaces/1/*/2" : "/api/wireguard/peers/1/*P",
)
attempts++
if (attempts === 1) {
await gate
await route.fulfill({ status: 403, json: { error: "Нет доступа к удалению" } })
} else if (attempts === 2) {
await route.fulfill({ json: { ok: false } })
} else {
await route.fulfill({ json: { ok: true } })
}
})
await expect(page.locator("tr[data-row-id]")).toHaveCount(1)
if (kind === "iface") {
await page.getByRole("button", { name: "Действия: wg-same" }).click()
await page.getByRole("menuitem", { name: /Удалить/ }).click()
} else {
await page.getByRole("tab", { name: /Пиры/ }).click()
await page.getByRole("button", { name: "Удалить пира", exact: true }).click()
}
const dialog = page.getByRole("alertdialog")
await expect(dialog).toContainText("Источник")
await dialog.getByRole("button", { name: "Удалить", exact: true }).click()
await expect(dialog.getByRole("button", { name: "Удаление…" })).toBeDisabled()
await expect(dialog.getByRole("button", { name: "Отмена" })).toBeDisabled()
await page.keyboard.press("Escape")
await expect(dialog).toBeVisible()
await expect(dialog.getByRole("status")).toContainText("Ожидание подтверждения")
expect(attempts).toBe(1)
release!()
await expect(dialog.getByRole("alert")).toContainText("Нет доступа")
await dialog.getByRole("button", { name: "Удалить", exact: true }).click()
await expect(dialog.getByRole("alert")).toContainText("Сервер не подтвердил удаление")
await dialog.getByRole("button", { name: "Удалить", exact: true }).click()
await expect(dialog).toHaveCount(0)
expect(attempts).toBe(3)
})
}