66 lines
1.6 KiB
TypeScript
66 lines
1.6 KiB
TypeScript
import { describe, expect, it } from "bun:test";
|
|
import type { ClassifierHitEvent } from "@islandflow/types";
|
|
import { scoreAlert } from "../src/alert-scoring";
|
|
import { buildFlowPacket } from "./helpers";
|
|
|
|
const hit = (confidence: number): ClassifierHitEvent =>
|
|
({
|
|
source_ts: 1,
|
|
ingest_ts: 1,
|
|
seq: 1,
|
|
trace_id: `hit:${confidence}`,
|
|
classifier_id: "test",
|
|
confidence,
|
|
direction: "neutral",
|
|
explanations: ["test"]
|
|
}) satisfies ClassifierHitEvent;
|
|
|
|
describe("alert scoring", () => {
|
|
it("classifies <45 as low", () => {
|
|
const packet = buildFlowPacket({
|
|
features: {
|
|
total_premium: 44_000
|
|
}
|
|
});
|
|
|
|
const result = scoreAlert(packet, []);
|
|
expect(result.score).toBe(44);
|
|
expect(result.severity).toBe("low");
|
|
});
|
|
|
|
it("classifies >=45 as medium", () => {
|
|
const packet = buildFlowPacket({
|
|
features: {
|
|
total_premium: 45_000
|
|
}
|
|
});
|
|
|
|
const result = scoreAlert(packet, []);
|
|
expect(result.score).toBe(45);
|
|
expect(result.severity).toBe("medium");
|
|
});
|
|
|
|
it("classifies >=80 as high", () => {
|
|
const packet = buildFlowPacket({
|
|
features: {
|
|
total_premium: 65_000
|
|
}
|
|
});
|
|
|
|
const result = scoreAlert(packet, [hit(0.5)]);
|
|
expect(result.score).toBe(80);
|
|
expect(result.severity).toBe("high");
|
|
});
|
|
|
|
it("keeps 79 as medium", () => {
|
|
const packet = buildFlowPacket({
|
|
features: {
|
|
total_premium: 64_000
|
|
}
|
|
});
|
|
|
|
const result = scoreAlert(packet, [hit(0.5)]);
|
|
expect(result.score).toBe(79);
|
|
expect(result.severity).toBe("medium");
|
|
});
|
|
});
|