Files
MikrotikManager/backend/src/services/alert-engine/confirm-stability.test.ts
T
DenozordecandCursor 5f31bb47fb chore: synchronize pending app/backend updates and repository hygiene
Includes current frontend and backend work in progress and removes generated artifacts from tracking to keep the repository clean for дальнейшая разработка.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-07 12:29:04 +07:00

72 lines
2.2 KiB
TypeScript

import assert from "node:assert/strict"
import { eq } from "drizzle-orm"
import { db } from "../../db/index.js"
import { alertEngineConfirmPending } from "../../db/schema.js"
import type { ApiAlertRule } from "../alerts-service.js"
import { computeStabilityReadyMap, deleteConfirmPending } from "./confirm-stability.js"
const ruleId = "test-confirm-stability-recovery-bypass"
deleteConfirmPending(ruleId)
const baseRule: ApiAlertRule = {
id: ruleId,
name: "Server transition",
type: "server",
target: "core-1",
targets: ["core-1"],
groupId: null,
condition: "перешёл в offline · восстановился",
conditions: ["перешёл в offline", "восстановился"],
severity: "critical",
enabled: true,
cooldown: "5м",
confirmStabilitySec: 120,
recoveryMode: "always",
recoveryStabilitySec: null,
chatId: "",
lastFiredAt: null,
}
const problemHit = {
ruleId,
ruleName: baseRule.name,
severity: baseRule.severity,
message: "Сервер: core-1 — перешёл в offline",
transition: "problem" as const,
payloadHash: "problem-1",
}
const recoveryHit = {
ruleId,
ruleName: baseRule.name,
severity: baseRule.severity,
message: "Сервер: core-1 — восстановился",
transition: "recovery" as const,
payloadHash: "recovery-1",
}
{
const m = computeStabilityReadyMap([baseRule], new Map([[ruleId, problemHit]]))
assert.equal(m.get(ruleId), false, "проблемный переход должен ждать confirmStabilitySec")
}
{
const m = computeStabilityReadyMap([baseRule], new Map([[ruleId, recoveryHit]]))
assert.equal(m.get(ruleId), true, "восстановление должно отправляться без задержки")
}
{
const m = computeStabilityReadyMap([baseRule], new Map([[ruleId, null]]))
assert.equal(m.get(ruleId), false, "без hit отправка не готова")
const left = db
.select()
.from(alertEngineConfirmPending)
.where(eq(alertEngineConfirmPending.ruleId, ruleId))
.limit(1)
.all()[0]
assert.equal(left, undefined, "pending должен очищаться после отсутствия hit")
}
console.log("alert-engine confirm-stability tests ok")