51 lines
5.1 KiB
TypeScript
51 lines
5.1 KiB
TypeScript
import { test, expect, type Page } from "@playwright/test"
|
|
import { certificateState, server } from "./fixtures/certificates"
|
|
const renew = { enabled: true, intervalSec: 21600, renewBeforeDays: 30 }
|
|
const interval = (page: Page) => page.getByRole("textbox", { name: "Интервал проверки сертификатов", exact: true })
|
|
const save = (page: Page) => page.getByRole("button", { name: "Сохранить расписание", exact: true })
|
|
const toggle = (page: Page) => page.getByRole("switch", { name: "Автообновление сертификатов", exact: true })
|
|
test.beforeEach(async ({ page }) => {
|
|
await page.route("**/health", r => r.fulfill({ json: { ok: true } }))
|
|
await page.route("**/api/**", r => {
|
|
const path = new URL(r.request().url()).pathname
|
|
return r.fulfill({ json: path === "/api/auth/config" ? { required: false } : path === "/api/servers" ? [server] : path === "/api/certificates/state" ? certificateState() : path === "/api/certificates/renew-settings" ? renew : { directoryUrl: "https://acme.example.test/directory", tokenConfigured: false } })
|
|
})
|
|
})
|
|
for (const malformed of [false, true]) test("Автообновление: первоначальный отказ " + malformed + " не разрешает defaults", async ({ page }) => {
|
|
let fail = true
|
|
await page.route("**/api/certificates/renew-settings", r => r.fulfill(fail ? malformed ? { json: {} } : { status: 503, json: { error: "Отказ расписания" } } : { json: renew }))
|
|
await page.goto("/certificates")
|
|
await expect(page.getByRole("alert", { name: "Настройки автообновления" })).toBeVisible()
|
|
await expect(toggle(page)).toBeDisabled(); await expect(save(page)).toBeDisabled(); await expect(interval(page)).toHaveValue("")
|
|
fail = false; await page.getByRole("button", { name: "Перечитать настройки автообновления" }).click()
|
|
await expect(interval(page)).toHaveValue("21600"); await expect(toggle(page)).toBeChecked()
|
|
})
|
|
for (const malformed of [false, true]) test("Автообновление: отказ сохранения " + malformed + " сохраняет черновик", async ({ page }) => {
|
|
await page.route("**/api/certificates/renew-settings", r => r.request().method() === "PUT" ? r.fulfill(malformed ? { json: {} } : { status: 503, json: { error: "Сохранение отказало" } }) : r.fulfill({ json: renew }))
|
|
await page.goto("/certificates"); await expect(interval(page)).toHaveValue("21600")
|
|
await interval(page).fill("900"); await save(page).click()
|
|
await expect(page.getByRole("alert", { name: "Настройки автообновления" })).toContainText("результат операции не подтверждён")
|
|
await expect(interval(page)).toHaveValue("900"); await expect(toggle(page)).toBeChecked()
|
|
await expect(page.getByText("Расписание автообновления сохранено", { exact: true })).toHaveCount(0)
|
|
})
|
|
for (const value of ["bad", "299", "300oops", "1.5"]) test("Автообновление: invalid interval " + value + " не подменяется default", async ({ page }) => {
|
|
let writes = 0; await page.route("**/api/certificates/renew-settings", r => { if (r.request().method() === "PUT") writes++; return r.fulfill({ json: renew }) })
|
|
await page.goto("/certificates"); await expect(interval(page)).toHaveValue("21600")
|
|
await interval(page).fill(value); await save(page).click()
|
|
await expect(page.getByRole("alert", { name: "Настройки автообновления" })).toContainText("Введите целые числа")
|
|
expect(writes).toBe(0); await expect(interval(page)).toHaveValue(value)
|
|
})
|
|
test("Автообновление: single flight переключателя и подтверждённый false", async ({ page }) => {
|
|
let writes = 0; let release!: () => void; const gate = new Promise<void>(r => release = r)
|
|
await page.route("**/api/certificates/renew-settings", async r => { if (r.request().method() === "GET") return r.fulfill({ json: renew }); writes++; await gate; await r.fulfill({ json: { ...renew, enabled: false } }) })
|
|
await page.goto("/certificates"); await expect(toggle(page)).toBeChecked(); await toggle(page).click()
|
|
await expect(toggle(page)).toBeDisabled(); await expect(save(page)).toBeDisabled(); expect(writes).toBe(1)
|
|
release(); await expect(toggle(page)).not.toBeChecked(); await expect(page.getByText("Автообновление выключено", { exact: true })).toBeVisible()
|
|
})
|
|
test("Автообновление: фоновое чтение не стирает dirty черновик", async ({ page }) => {
|
|
let second = false; await page.route("**/api/certificates/renew-settings", r => r.fulfill({ json: { ...renew, intervalSec: second ? 7200 : 21600 } }))
|
|
await page.goto("/certificates"); await expect(interval(page)).toHaveValue("21600"); await interval(page).fill("900")
|
|
second = true; await page.getByRole("button", { name: "Перечитать настройки автообновления" }).click()
|
|
await expect(interval(page)).toBeEnabled(); await expect(interval(page)).toHaveValue("900")
|
|
})
|