fix(ui): сохранять фильтры серверов в адресе страницы

This commit is contained in:
Denozordec committed 2026-09-21 09:50:47 +07:00
1 parent b64e6834a9
commit dfb993e1a3
7 files changed
+256 -10

No files matched your search

+79
View File
@@ -362,3 +362,82 @@ test("изменение подключения сбрасывает резул
await page.getByPlaceholder("api-user", { exact: true }).fill("changed-user")
await expect(page.getByText("Проверено тестовым API", { exact: true })).toHaveCount(0)
})
test("URL серверов: поиск, тип, история, reload и сохранение контекста", async ({ page }) => {
const writes: string[] = []
await setup(page, async (route) => { if (!["GET", "HEAD"].includes(route.request().method())) writes.push(route.request().method()); return false }, 2, "/servers?server=2&keep=1")
const search = page.getByPlaceholder("Поиск по имени, хосту…")
await search.fill("Проверка 2")
await page.getByRole("button", { name: /JumpHost/ }).click()
await expect(page).toHaveURL(/type=jump-host/)
await expect(page.locator("tr[data-row-id]")).toHaveCount(0)
await page.goBack()
await expect(search).toHaveValue("Проверка 2")
await expect(page.locator("tr[data-row-id]")).toHaveCount(1)
await page.goForward()
await expect(page.locator("tr[data-row-id]")).toHaveCount(0)
await page.reload()
await expect(search).toHaveValue("Проверка 2")
await expect(page.locator("tr[data-row-id]")).toHaveCount(0)
await page.setViewportSize({ width: 390, height: 844 })
const reset = page.getByRole("button", { name: "Сбросить фильтры списка", exact: true })
await reset.scrollIntoViewIfNeeded()
const bounds = await reset.boundingBox()
expect(bounds!.x + bounds!.width).toBeLessThanOrEqual(390)
await page.screenshot({ path: "test-results/server-url-mobile.png", animations: "disabled" })
await page.getByRole("button", { name: "Сбросить фильтры списка", exact: true }).click()
await expect(page).toHaveURL(/\/servers\?server=2&keep=1$/)
await expect(page.locator("tr[data-row-id]")).toHaveCount(1)
expect(writes).toEqual([])
})
test("URL серверов: дерево OR и negated восстанавливает строки и контролы", async ({ page }) => {
const query = { id: "root", type: "group", combinator: "or", rules: [
{ id: "country", type: "rule", path: ["country"], operator: "is", value: "DE", negated: true },
{ id: "status", type: "rule", path: ["status"], operator: "is", value: "online" },
] }
await setup(page, undefined, 2, "/servers?" + new URLSearchParams({ filters: JSON.stringify({ v: 1, query }) }))
await expect(page.locator("tr[data-row-id]")).toHaveCount(1)
await expect(page.locator("tr[data-row-id]")).toContainText("Проверка 1")
await page.reload()
await expect(page.locator("tr[data-row-id]")).toHaveCount(1)
await expect(page.getByRole("button", { name: "DE", exact: true })).toBeVisible()
await page.getByRole("button", { name: "Очистить", exact: true }).click()
await expect(page.locator("tr[data-row-id]")).toHaveCount(2)
await expect(page).toHaveURL(/\/servers$/)
})
for (const value of ["{", JSON.stringify({ v: 99 }), "x".repeat(8193)]) {
test("URL серверов: ошибочный filters длиной " + value.length, async ({ page }) => {
await setup(page, undefined, 2, "/servers?" + new URLSearchParams({ filters: value, server: "1", keep: "1" }))
await expect(page.getByRole("alert").filter({ hasText: "Фильтры требуют внимания" })).toContainText("Не удалось прочитать фильтры")
await expect(page.locator("tr[data-row-id]")).toHaveCount(0)
await page.getByRole("button", { name: "Сбросить фильтры списка", exact: true }).click()
await expect(page).toHaveURL(/server=1&keep=1$/)
await expect(page.locator("tr[data-row-id]")).toHaveCount(1)
})
}
test("URL серверов: черновик не публикуется, быстрый поиск не затирает фильтр", async ({ page }) => {
let reads = 0
await setup(page, async (_route, path) => { if (path === "/api/servers") reads++; return false })
const initialReads = reads
await page.getByRole("button", { name: "Фильтры", exact: true }).click()
await page.getByRole("option", { name: "Страна", exact: true }).click()
await page.getByRole("option", { name: "равно", exact: true }).click()
expect(new URL(page.url()).searchParams.has("filters")).toBe(false)
await page.getByRole("option", { name: "DE", exact: true }).click()
await expect.poll(() => new URL(page.url()).searchParams.has("filters")).toBe(true)
const filters = new URL(page.url()).searchParams.get("filters")
const search = page.getByPlaceholder("Поиск по имени, хосту…")
await search.pressSequentially("192.0.2.2", { delay: 0 })
await expect(search).toHaveValue("192.0.2.2")
await expect.poll(() => new URL(page.url()).searchParams.get("q")).toBe("192.0.2.2")
expect(new URL(page.url()).searchParams.get("filters")).toBe(filters)
await expect(page.locator("tr[data-row-id]")).toHaveCount(1)
expect(reads).toBe(initialReads)
await page.reload()
await expect(page.getByRole("button", { name: "DE", exact: true })).toBeVisible()
await expect(search).toHaveValue("192.0.2.2")
await expect(page.locator("tr[data-row-id]")).toHaveCount(1)
})