fix(collectors): разделить загрузку настроек и сохранить черновики
This commit is contained in:
1 parent
dd387cf379
commit
d453f2aec3
6 files changed
+169
-122
No files matched your search
@@ -0,0 +1,59 @@
|
||||
import { test, expect, type Page } from "@playwright/test"
|
||||
import { geoip } from "./fixtures/geoip"
|
||||
const common = { enabled: true, intervalSec: 300, retentionDays: 14, lastCollectedAt: null, lastDurationMs: 0, lastError: null }
|
||||
const values: Record<string, object> = {
|
||||
"/api/traffic/settings": { ...common, intervalSec: 45 },
|
||||
"/api/servers-api-ping/settings": { ...common, enabled: false, intervalSec: 120 },
|
||||
"/api/uptime/settings": { ...common, resourcesEnabled: true, pingEnabled: false, speedEnabled: false, probeIntervalSec: 15, speedIntervalSec: 60 },
|
||||
"/api/internet-path/settings": common,
|
||||
"/api/certificates/renew-settings": { enabled: false, intervalSec: 21600, renewBeforeDays: 30 },
|
||||
}
|
||||
async function setup(page: Page) {
|
||||
await page.route("**/health", r => r.fulfill({ json: { ok: true } }))
|
||||
await page.route("**/api/**", r => {
|
||||
const path = new URL(r.request().url()).pathname
|
||||
if (path === "/api/auth/config") return r.fulfill({ json: { required: false } })
|
||||
if (path === "/api/geoip") return r.fulfill({ json: geoip })
|
||||
if (path === "/api/scheduler/status") return r.fulfill({ json: { jobs: [] } })
|
||||
if (path === "/api/scheduler/runs") return r.fulfill({ json: { runs: [] } })
|
||||
if (values[path]) return r.fulfill({ json: values[path] })
|
||||
return r.fulfill({ status: 503, json: { error: "outside settings fixture" } })
|
||||
})
|
||||
}
|
||||
test("Настройки: неполный DTO не включает defaults и не разрешает запись", async ({ page }) => {
|
||||
await setup(page); await page.route("**/api/traffic/settings", r => r.fulfill({ json: {} }))
|
||||
await page.goto("/data-collection")
|
||||
await expect(page.getByTestId("settings-traffic")).toContainText("Настройки сборщика не подтверждены")
|
||||
await expect(page.getByRole("textbox", { name: "Интервал: Трафик", exact: true })).toHaveValue("")
|
||||
await expect(page.getByRole("textbox", { name: "Интервал: Трафик", exact: true })).toBeDisabled()
|
||||
await expect(page.getByRole("button", { name: "Сохранить настройки планировщика" })).toBeDisabled()
|
||||
await expect(page.getByTestId("settings-rest")).toContainText("настройки получены")
|
||||
})
|
||||
test("Настройки: медленный uptime не задерживает трафик и REST", async ({ page }) => {
|
||||
await setup(page); let started = false, release!: () => void; const gate = new Promise<void>(resolve => release = resolve)
|
||||
await page.route("**/api/uptime/settings", async r => { started = true; await gate; try { await r.fulfill({ json: values["/api/uptime/settings"] }) } catch {} })
|
||||
try {
|
||||
await page.goto("/data-collection"); await expect.poll(() => started).toBe(true)
|
||||
await expect(page.getByRole("textbox", { name: "Интервал: Трафик", exact: true })).toHaveValue("45")
|
||||
await expect(page.getByTestId("settings-rest")).toContainText("настройки получены")
|
||||
await expect(page.getByTestId("settings-uptime")).toContainText("настройки не получены")
|
||||
} finally { release() }
|
||||
})
|
||||
test("Настройки: фоновая ошибка сохраняет данные, время и черновик", async ({ page }) => {
|
||||
await setup(page); let fails = false
|
||||
await page.route("**/api/traffic/settings", r => r.fulfill(fails ? { status: 503, json: { error: "traffic unavailable" } } : { json: values["/api/traffic/settings"] }))
|
||||
await page.goto("/data-collection"); const field = page.getByRole("textbox", { name: "Интервал: Трафик", exact: true })
|
||||
await expect(field).toHaveValue("45"); await field.fill("99")
|
||||
const received = await page.getByTestId("settings-traffic").getByRole("status").textContent(); fails = true
|
||||
await expect(page.getByRole("button", { name: "Обновить", exact: true })).toBeEnabled(); await page.getByRole("button", { name: "Обновить", exact: true }).click()
|
||||
await expect(page.getByTestId("settings-traffic")).toContainText("traffic unavailable")
|
||||
await expect(field).toHaveValue("99"); await expect(page.getByTestId("settings-traffic").getByRole("status")).toHaveText(received!)
|
||||
})
|
||||
test("Настройки: успешное обновление не затирает черновик", async ({ page }) => {
|
||||
await setup(page); await page.goto("/data-collection"); const field = page.getByRole("textbox", { name: "Интервал: Трафик", exact: true })
|
||||
await expect(field).toHaveValue("45"); await field.fill("99")
|
||||
await page.getByRole("textbox", { name: "Хранение трафика", exact: true }).fill("21")
|
||||
await expect(page.getByRole("button", { name: "Обновить", exact: true })).toBeEnabled(); await page.getByRole("button", { name: "Обновить", exact: true }).click()
|
||||
await expect(page.getByRole("button", { name: "Обновить", exact: true })).toBeEnabled(); await expect(field).toHaveValue("99")
|
||||
await expect(page.getByRole("textbox", { name: "Хранение трафика", exact: true })).toHaveValue("21")
|
||||
})
|
||||
Reference in new issue
Block a user