fix(ui): показывать неопределённый исход speed и сверять историю

This commit is contained in:
Denozordec committed 2026-10-08 08:57:54 +07:00
1 parent 96fa910804
commit 8782054078
8 files changed
+145 -11

No files matched your search

+65
View File
@@ -0,0 +1,65 @@
import { test, expect } from "@playwright/test"
import { server } from "./fixtures/users"
for (const confirmedStatus of ["done", "error"] as const) {
test(`Speed: unknown receipt сохраняет snapshot и сверяется по runId/${confirmedStatus}`, async ({ page }) => {
let runId = ""
let confirmed = false
let writes = 0
const probe = {
id: "probe-unknown", srcServerId: "1", dstServerId: "2",
srcInterface: "ether1", dstInterface: "ether1", protocol: "tcp", direction: "transmit",
durationSec: "3", enabled: true, lastStatus: "done", lastRunAt: "2026-10-03T00:00:00Z",
lastTxAvgMbps: 42, lastRxAvgMbps: null, lastError: null,
}
await page.route("**/health", route => route.fulfill({ json: { ok: true } }))
await page.route("**/api/**", route => {
const path = new URL(route.request().url()).pathname
if (path === "/api/uptime/speed-test" && route.request().method() === "POST") {
writes++
runId = route.request().postDataJSON().runId
return route.fulfill({ status: 502, json: {
outcome: "unknown", runId,
error: `Сетевой тест завершён, сохранение результата не подтверждено. Проверьте историю по runId ${runId} перед повтором`,
} })
}
return route.fulfill({ json:
path === "/api/auth/config" ? { required: false } :
path === "/api/servers" ? [server, { ...server, id: 2, name: "Приёмник", host: "192.0.2.2" }] :
path === "/api/uptime/overview" ? { probes: [], resources: [] } :
path === "/api/uptime/speed-probes" ? { probes: [probe] } :
path === "/api/uptime/speed-test/runs" ? { runs: confirmed ? [{
id: runId, srcServerId: "1", dstServerId: "2", srcInterface: "ether1", dstInterface: "ether1",
protocol: "tcp", direction: "transmit", durationSec: 3, status: confirmedStatus,
txAvgMbps: confirmedStatus === "done" ? 84 : null, rxAvgMbps: null,
error: confirmedStatus === "error" ? "Подтверждённая ошибка" : null,
createdAt: new Date().toISOString(),
}] : [] } : {},
})
})
await page.goto("/uptime?tab=speed")
await page.getByRole("button", { name: "Пауза", exact: true }).click()
const launch = page.getByRole("button", { name: "Запустить", exact: true })
const card = launch.locator("xpath=../../..")
await expect(card).toContainText("42 Мбит/с")
await launch.click()
await expect(page.getByText("Сохранение не подтверждено", { exact: true })).toBeVisible()
const row = page.locator(`tr[data-row-id="${runId}"]`)
await expect(row).toContainText(`runId: ${runId}`)
await expect(row).not.toContainText("error")
await expect(card).toContainText("42 Мбит/с")
await page.setViewportSize({ width: 320, height: 1000 })
expect(await page.evaluate(() => document.documentElement.scrollWidth <= innerWidth)).toBe(true)
await page.getByRole("button", { name: "Обновить", exact: true }).click()
await expect(row).toContainText("Сохранение не подтверждено")
await expect(card).toContainText("42 Мбит/с")
expect(writes).toBe(1)
confirmed = true
await page.getByRole("button", { name: "Обновить", exact: true }).click()
await expect(row).toContainText(confirmedStatus)
await expect(page.getByText("Сохранение не подтверждено", { exact: true })).toHaveCount(0)
await expect(page.getByText(/Проверьте историю по runId/)).toHaveCount(0)
if (confirmedStatus === "done") await expect(row).toContainText("84 Мбит/с")
expect(writes).toBe(1)
})
}