24 lines
2.5 KiB
TypeScript
24 lines
2.5 KiB
TypeScript
import assert from "node:assert/strict"
|
|
import { ipsecPeerDeletePaths, ipsecPeerDeleteRows, ipsecPeerDeleteTarget, ipsecPeerDeleteValue, projectIpsecPeerDelete, type IpsecPeerDeleteState } from "./ipsec-peer-delete.js"
|
|
const state: IpsecPeerDeleteState = { source: "private-source", proof: "private-proof", protections: [], catalogs: Object.fromEntries(ipsecPeerDeletePaths.map(path => [path, []])) }
|
|
state.catalogs["/ip/ipsec/peer"] = [{ ".id": "*a1", name: "selected", disabled: "true", opaque: "private" }, { ".id": "*a2", name: "preserve" }]
|
|
state.catalogs["/ip/ipsec/identity"] = [{ ".id": "*b1", peer: "selected", secret: "NEVER_SECRET", comment: "identity" }]
|
|
assert.throws(() => ipsecPeerDeleteTarget(state, "selected", true), /native ID/)
|
|
assert.throws(() => ipsecPeerDeleteTarget(state, "*a1"), /identity/)
|
|
assert.equal(ipsecPeerDeleteTarget(state, "*a1", true).linked.length, 1)
|
|
const reflected=structuredClone(state);reflected.catalogs["/ip/ipsec/identity"][0].comment="NEVER_SECRET"
|
|
assert.throws(()=>ipsecPeerDeleteTarget(reflected,"*a1"),error=>error instanceof Error&&!error.message.includes("NEVER_SECRET"))
|
|
const projected = projectIpsecPeerDelete(state, "*a1")
|
|
assert.deepEqual(projected.catalogs["/ip/ipsec/identity"], state.catalogs["/ip/ipsec/identity"])
|
|
assert.deepEqual(projected.catalogs["/ip/ipsec/peer"], [state.catalogs["/ip/ipsec/peer"][1]])
|
|
assert.equal(state.catalogs["/ip/ipsec/peer"].length, 2)
|
|
assert.throws(() => ipsecPeerDeleteRows([{ ".id": "*1" }, { ".id": "*1" }]), /Повторяющийся/)
|
|
assert.throws(() => ipsecPeerDeleteRows([{ ".id": "*1", secret: {} }]), /Неполный/)
|
|
assert.throws(() => ipsecPeerDeleteRows(Array.from({ length: 2001 }, (_, n) => ({ ".id": "*" + n }))), /Неполный/)
|
|
const runtime = structuredClone(state); runtime.catalogs["/ip/ipsec/active-peers"] = [{ ".id": "*e1", uptime: "5" }]
|
|
assert.deepEqual(ipsecPeerDeleteValue(runtime), ipsecPeerDeleteValue(state))
|
|
const opaque = structuredClone(state); opaque.catalogs["/ip/ipsec/identity"][0].secret = "different"
|
|
assert.notDeepEqual(ipsecPeerDeleteValue(opaque), ipsecPeerDeleteValue(state))
|
|
for (const flag of ["dynamic", "builtin", "default"]) { const guarded = structuredClone(state); guarded.catalogs["/ip/ipsec/peer"][0][flag] = "unknown"; assert.throws(() => ipsecPeerDeleteTarget(guarded, "*a1", true), /Системный/) }
|
|
console.log("✓ IPsec peer deletion exact native ID, force noncascade, malformed/duplicate/oversized catalogs, private opaque preservation, runtime exclusions and system guards")
|