33 lines
2.7 KiB
TypeScript
33 lines
2.7 KiB
TypeScript
import assert from "node:assert/strict"
|
|
import { test } from "node:test"
|
|
import { parseEvoCatalogRaw, aggregateCommunityRouteCounts } from "./evobgp-catalog.js"
|
|
const empty = { modules:{items:[]}, domains:{items:[]}, ip_ranges:{items:[]}, asns:{items:[]}, communities:{items:[]} }
|
|
const asn = {module_id:"m",entry:{id:"a",asn:64512,community_id:"c"}}
|
|
|
|
test("upstream catalog requires every collection; known empty stays empty", () => {
|
|
assert.deepEqual(parseEvoCatalogRaw(empty),empty)
|
|
for(const section of Object.keys(empty)) {
|
|
for(const bad of [undefined,null,{}, {items:null}]) assert.throws(()=>parseEvoCatalogRaw({...empty,[section]:bad}), /не подтверждён/)
|
|
}
|
|
for(const raw of [null,{},[],{error:"upstream unavailable"}]) assert.throws(()=>parseEvoCatalogRaw(raw), /не подтверждён/)
|
|
})
|
|
test("row identities, ASN range and integral counts are checked before mapping", () => {
|
|
for(const entry of [{...asn.entry,id:""},{...asn.entry,asn:0},{...asn.entry,asn:4294967296},...[-1,1.5,Number.MAX_SAFE_INTEGER+1,"5"].map(prefix_count=>({...asn.entry,prefix_count}))]) assert.throws(()=>parseEvoCatalogRaw({...empty,asns:{items:[{...asn,entry}]}}), /не подтверждён/)
|
|
assert.throws(()=>parseEvoCatalogRaw({...empty,asns:{items:[asn,asn]}}))
|
|
assert.throws(()=>parseEvoCatalogRaw({...empty,domains:{items:[{module_id:"m",entry:{id:"d"}}]}}))
|
|
assert.throws(()=>parseEvoCatalogRaw({...empty,modules:{items:[{id:"m",name:"module"}]}}))
|
|
assert.equal(parseEvoCatalogRaw({...empty,asns:{items:[asn,{...asn,module_id:"other"}]}}).asns.items.length,2)
|
|
})
|
|
test("unknown ASN count propagates to its community, known zero stays zero", () => {
|
|
for(const prefix_count of [undefined,null]) {
|
|
const raw={...empty,domains:{items:[{module_id:"m",entry:{id:"d",fqdn:"example.test",community_id:"c"}}]},asns:{items:[{...asn,entry:{...asn.entry,prefix_count}},{...asn,entry:{...asn.entry,id:"zero",community_id:"z",prefix_count:0}}]}}
|
|
const totals=aggregateCommunityRouteCounts(parseEvoCatalogRaw(raw))
|
|
assert.equal(totals.get("c"),null);assert.equal(totals.get("z"),0)
|
|
}
|
|
})
|
|
test("known sums include domains, CIDR and prefixes; safe integer overflow fails", () => {
|
|
const raw={...empty,domains:{items:[{module_id:"m",entry:{id:"d",fqdn:"example.test",community_id:"c"}}]},ip_ranges:{items:[{module_id:"m",entry:{id:"r",prefix:"192.0.2.0/24",community_id:"c"}}]},asns:{items:[{...asn,entry:{...asn.entry,prefix_count:5}}]}}
|
|
assert.equal(aggregateCommunityRouteCounts(parseEvoCatalogRaw(raw)).get("c"),7)
|
|
assert.throws(()=>aggregateCommunityRouteCounts(parseEvoCatalogRaw({...raw,asns:{items:[{...asn,entry:{...asn.entry,prefix_count:Number.MAX_SAFE_INTEGER}}]}})), /вне допустимого диапазона/)
|
|
})
|