28 lines
2.6 KiB
TypeScript
28 lines
2.6 KiB
TypeScript
import assert from "node:assert/strict"
|
|
import {test} from "node:test"
|
|
import {parseDashboardProbes} from "./dashboard-probes"
|
|
import {buildLatencySeriesByProbeSource} from "./dashboard-latency"
|
|
const start="2026-10-03T00:00:00Z",end="2026-10-03T01:00:00Z"
|
|
const base={id:"p1",srcServerId:"1",name:"Проверка",target:"192.0.2.1",filter:"main",rtt:0,loss:0,status:"up",series:[0],enabled:true,showOnDashboard:true}
|
|
const sampled={sampledAt:"2026-10-03T00:30:00Z",rtt:0,loss:0,status:"up"}
|
|
const payload=(samples:unknown[])=>({rangeStartAt:start,rangeEndAt:end,probes:[{...base,observations:{samples}}]})
|
|
test("ping legacy and empty samples do not prove up, down, loss or historical zero",()=>{
|
|
for(const raw of [{probes:[base]},payload([])]){const p=parseDashboardProbes(raw).probes[0];assert.equal(p.status,"unknown");assert.equal(p.rtt,null);assert.equal(p.loss,null);assert.ok(p.series.every(v=>v===null))}
|
|
assert.deepEqual(parseDashboardProbes({probes:[]}),{probes:[],sampledAt:null})
|
|
})
|
|
test("ping observed zero and failure retain independent measurement values and sparse time axis",()=>{
|
|
const p=parseDashboardProbes(payload([sampled])).probes[0];assert.equal(p.status,"up");assert.equal(p.rtt,0);assert.equal(p.loss,0);assert.equal(p.series[30],0);assert.equal(p.series.filter(v=>v!==null).length,1)
|
|
const failed=parseDashboardProbes(payload([sampled,{...sampled,sampledAt:"2026-10-03T00:31:00Z",rtt:null,loss:100,status:"down"}])).probes[0];assert.equal(failed.status,"down");assert.equal(failed.loss,100);assert.equal(failed.series[31],null)
|
|
assert.deepEqual(buildLatencySeriesByProbeSource([p],[]).series["src-1"],p.series)
|
|
assert.deepEqual(buildLatencySeriesByProbeSource([p,{...p,srcServerId:"1",series:Array(60).fill(null)}],[]).series,{})
|
|
})
|
|
test("ping invalid time axis, duplicate or out of range samples cannot replace cache",()=>{
|
|
for(const raw of [payload([sampled,sampled]),payload([{...sampled,sampledAt:"invalid"}]),payload([{...sampled,sampledAt:"2026-10-02T00:00:00Z"}]),{...payload([sampled]),rangeEndAt:start},{...payload([sampled]),rangeStartAt:undefined},payload([{...sampled,loss:101}])])assert.throws(()=>parseDashboardProbes(raw))
|
|
})
|
|
test("failed execution is an unknown observation, while measured 100 percent loss remains down",()=>{
|
|
const failed={...sampled,sampledAt:"2026-10-03T00:31:00Z",rtt:null,loss:null,status:"unknown",error:"API denied"}
|
|
const p=parseDashboardProbes(payload([sampled,failed])).probes[0]
|
|
assert.equal(p.status,"unknown");assert.equal(p.rtt,null);assert.equal(p.loss,null);assert.equal(p.observationError,"API denied");assert.equal(p.series[31],null)
|
|
assert.throws(()=>parseDashboardProbes(payload([{...failed,loss:100}])))
|
|
})
|