Files
MikrotikManager/backend/src/services/ipsec-peer-delete.test.ts
T

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")