fix(traffic): сохранять точность объёмов и обозначать бинарные единицы

This commit is contained in:
Denozordec committed 2026-10-12 21:59:50 +07:00
1 parent 2358ecef60
commit 2b3d583e3b
29 files changed
+1452 -39

No files matched your search

+1
View File
@@ -4,6 +4,7 @@ export function observedTrafficFixturePayload(value: unknown): unknown {
if (!value || typeof value !== "object") return value
const r = Object.fromEntries(Object.entries(value).map(([key, v]) => [key, observedTrafficFixturePayload(v)]))
if ("rxNow" in r && "txNow" in r && "rxTotal" in r && "txTotal" in r && Array.isArray(r.rxSeries) && Array.isArray(r.txSeries) && !("observations" in r)) {
r.volumeUnit = "GiB"
r.observations = { rxNow: true, txNow: true, sampledAt: "2026-10-12T12:00:00Z",
rxSeries: r.rxSeries.map(v => typeof v === "number" && Number.isFinite(v) && v >= 0),
txSeries: r.txSeries.map(v => typeof v === "number" && Number.isFinite(v) && v >= 0) }
+19
View File
@@ -0,0 +1,19 @@
import { test, expect } from "@playwright/test"
for(const width of[1440,320])test(`Объём трафика: положительные байты/бинарные единицы/неизвестная единица ${width}`,async({page})=>{
await page.setViewportSize({width,height:1000});let unit=true,rxTotal=1/1024,txTotal=1/1024**3
const server=()=>({id:"1",name:"Объём CHR",site:"TEST",country:"RU",status:"online",rxNow:0,txNow:0,rxPeak:0,txPeak:0,rxTotal,txTotal,rxSeries:[0,0],txSeries:[0,0],sessions:1,...(unit?{volumeUnit:"GiB"}:{}),observations:{rxNow:true,txNow:true,rxSeries:[false,true],txSeries:[false,true],sampledAt:"2026-10-12T12:00:00Z"}})
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.endsWith("/live"))return r.fulfill({status:503,json:{error:"Fixture без live"}})
return r.fulfill({json:path==="/api/auth/config"?{required:false}:path==="/api/traffic/servers"?{servers:[server()]}:path==="/api/traffic/servers/1"?{server:server()}:path.endsWith("/interfaces")||path==="/api/traffic/bound-interfaces"?{interfaces:[]}:path==="/api/traffic/users"?{users:[]}:path==="/api/servers"?[]:{}})
});await page.goto("/traffic")
const volume=page.getByRole("group",{name:"Учтённый объём по измерениям"})
await expect(volume).toContainText("1 МиБ");await expect(volume).toContainText("1 Б")
await volume.screenshot({path:`docs/ux-ui/screens/traffic-volume-${width}-2026-10-12.png`})
rxTotal=1;txTotal=1024;await page.getByRole("button",{name:"15м",exact:true}).click()
await expect(volume).toContainText("1 ГиБ");await expect(volume).toContainText("1 ТиБ")
unit=false;await page.getByRole("button",{name:"24ч",exact:true}).click()
await expect(volume.getByText("—",{exact:true})).toHaveCount(2)
unit=true;rxTotal=0;txTotal=0;await page.getByRole("button",{name:"4ч",exact:true}).click()
await expect(volume.getByText("0 Б",{exact:true})).toHaveCount(2)
expect(await page.evaluate(()=>document.documentElement.scrollWidth<=innerWidth+1)).toBe(true)
})