fix(ui): сохранять фильтры серверов в адресе страницы
This commit is contained in:
1 parent
b64e6834a9
commit
dfb993e1a3
7 files changed
+256
-10
No files matched your search
@@ -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)
|
||||
})
|
||||
Reference in new issue
Block a user