Docker images / prepare-release (push) Successful in 12s
Docker images / backend-test (push) Successful in 2m20s
Docker images / frontend-image (push) Successful in 2m51s
Docker images / updater-image (push) Successful in 44s
Docker images / backend-image (push) Successful in 2m49s
Docker images / notify-webhook (push) Skipped
Docker images / publish-release (push) Successful in 12s
- Added configuration history management for Firewall, GRE, and WireGuard pages, enabling users to view and restore previous configurations. - Introduced new components for displaying configuration history and integrated them into the respective pages. - Enhanced API routes to support fetching and restoring configuration revisions, ensuring data consistency across the application. - Updated state management to handle loading and restoring states effectively, improving user experience during data operations. - Enhanced tests to cover new functionalities and ensure reliability. Co-authored-by: Cursor <[email protected]>
102 lines
3.0 KiB
TypeScript
102 lines
3.0 KiB
TypeScript
import assert from "node:assert/strict"
|
|
import { withPgOrSkip } from "../test/pg.js"
|
|
import { dbQuery } from "../db/index.js"
|
|
import {
|
|
appendRevisionIfChanged,
|
|
fingerprintPayload,
|
|
getRevisionById,
|
|
listRevisions,
|
|
pruneRevisions,
|
|
} from "./config-revisions.js"
|
|
|
|
if (!(await withPgOrSkip())) {
|
|
console.log("config-revisions.test.ts: skip")
|
|
process.exit(0)
|
|
}
|
|
|
|
const tag = `rev-test-${Date.now()}`
|
|
await dbQuery(`INSERT INTO servers (name, host) VALUES ($1, '127.0.0.1')`, [tag])
|
|
const { rows } = await dbQuery<{ id: number }>(`SELECT id FROM servers WHERE name = $1 LIMIT 1`, [tag])
|
|
const serverId = rows[0]?.id
|
|
assert.ok(serverId)
|
|
|
|
try {
|
|
const payloadA = [{ community: "1:1", action: "route" }]
|
|
const first = await appendRevisionIfChanged({
|
|
serverId,
|
|
section: "filters",
|
|
source: "apply",
|
|
payload: payloadA,
|
|
})
|
|
assert.equal(first.created, true)
|
|
assert.equal(first.revision.source, "apply")
|
|
|
|
const dup = await appendRevisionIfChanged({
|
|
serverId,
|
|
section: "filters",
|
|
source: "observed",
|
|
payload: payloadA,
|
|
})
|
|
assert.equal(dup.created, false)
|
|
assert.equal(dup.revision.id, first.revision.id)
|
|
|
|
const payloadB = [{ community: "1:2", action: "blackhole" }]
|
|
const second = await appendRevisionIfChanged({
|
|
serverId,
|
|
section: "filters",
|
|
source: "rollback",
|
|
payload: payloadB,
|
|
})
|
|
assert.equal(second.created, true)
|
|
assert.equal(second.revision.source, "rollback")
|
|
assert.notEqual(second.revision.fingerprint, first.revision.fingerprint)
|
|
|
|
const listed = await listRevisions(serverId, "filters")
|
|
assert.equal(listed.length, 2)
|
|
assert.equal(listed[0]?.source, "rollback")
|
|
|
|
const stored = await getRevisionById(second.revision.id)
|
|
assert.ok(stored)
|
|
assert.equal(fingerprintPayload(stored.payload), second.revision.fingerprint)
|
|
|
|
const objPayload = { rules: [{ chain: "input" }], addressLists: [{ list: "vip" }] }
|
|
const objRev = await appendRevisionIfChanged({
|
|
serverId,
|
|
section: "firewall",
|
|
source: "apply",
|
|
payload: objPayload,
|
|
})
|
|
assert.equal(objRev.created, true)
|
|
assert.equal(objRev.revision.itemCount, 2)
|
|
const objStored = await getRevisionById(objRev.revision.id)
|
|
assert.ok(objStored)
|
|
assert.ok(!Array.isArray(objStored.payload))
|
|
assert.equal(fingerprintPayload(objStored.payload), objRev.revision.fingerprint)
|
|
|
|
const objDup = await appendRevisionIfChanged({
|
|
serverId,
|
|
section: "firewall",
|
|
source: "rollback",
|
|
payload: objPayload,
|
|
})
|
|
assert.equal(objDup.created, false)
|
|
assert.equal(objDup.revision.source, "apply")
|
|
|
|
for (let i = 0; i < 4; i++) {
|
|
await appendRevisionIfChanged({
|
|
serverId,
|
|
section: "filters",
|
|
source: "apply",
|
|
payload: [{ community: `9:${i}`, action: "route" }],
|
|
})
|
|
}
|
|
const pruned = await pruneRevisions(serverId, "filters", 3)
|
|
assert.ok(pruned >= 1)
|
|
const after = await listRevisions(serverId, "filters")
|
|
assert.equal(after.length, 3)
|
|
} finally {
|
|
await dbQuery(`DELETE FROM servers WHERE id = $1`, [serverId])
|
|
}
|
|
|
|
console.log("config-revisions.test.ts: ok")
|