71 lines
2.7 KiB
TypeScript
71 lines
2.7 KiB
TypeScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import { scoreSentences } from "../../../open-sse/services/compression/engines/relevance/scorer.ts";
|
|
|
|
const DEFAULT_CFG = {
|
|
enabled: false,
|
|
overlapThreshold: 0.1,
|
|
budgetPercent: 0.5,
|
|
boilerplateWeight: 0.5,
|
|
};
|
|
|
|
test("relevant sentence scores higher than irrelevant sentence", () => {
|
|
const sentences = [
|
|
"The quick brown fox jumps over the lazy dog",
|
|
"How do I configure the database connection?",
|
|
];
|
|
const query = "configure database connection settings";
|
|
const scores = scoreSentences(sentences, query, DEFAULT_CFG);
|
|
assert.equal(scores.length, 2);
|
|
assert.ok(scores[1] > scores[0], `expected scores[1]=${scores[1]} > scores[0]=${scores[0]}`);
|
|
});
|
|
|
|
test("boilerplate sentences are penalized relative to content sentences", () => {
|
|
const sentences = [
|
|
"Please note that this is very important information.",
|
|
"Use db.connect() with host and port parameters.",
|
|
];
|
|
const query = "connect database host port";
|
|
const scores = scoreSentences(sentences, query, DEFAULT_CFG);
|
|
assert.equal(scores.length, 2);
|
|
assert.ok(
|
|
scores[1] > scores[0],
|
|
`content sentence (${scores[1]}) should score higher than boilerplate (${scores[0]})`
|
|
);
|
|
});
|
|
|
|
test("ReDoS-safe: query with special regex characters does not throw", () => {
|
|
const sentences = ["Some normal sentence here.", "Another sentence with content."];
|
|
const maliciousQuery = "((a+)+)$ [.*+?^=!:${}()|[\\]/\\\\] test+++";
|
|
assert.doesNotThrow(() => {
|
|
const scores = scoreSentences(sentences, maliciousQuery, DEFAULT_CFG);
|
|
assert.equal(scores.length, 2);
|
|
});
|
|
});
|
|
|
|
test("empty query returns array of zeros with same length as sentences", () => {
|
|
const sentences = ["First sentence.", "Second sentence.", "Third sentence."];
|
|
const scores = scoreSentences(sentences, "", DEFAULT_CFG);
|
|
assert.equal(scores.length, 3);
|
|
assert.ok(scores.every((s) => s === 0), `all scores should be 0, got: ${scores}`);
|
|
});
|
|
|
|
test("empty sentences array returns empty array", () => {
|
|
const scores = scoreSentences([], "some query", DEFAULT_CFG);
|
|
assert.deepEqual(scores, []);
|
|
});
|
|
|
|
test("single sentence returns array of length 1", () => {
|
|
const scores = scoreSentences(["Only one sentence."], "query text", DEFAULT_CFG);
|
|
assert.equal(scores.length, 1);
|
|
assert.ok(typeof scores[0] === "number");
|
|
});
|
|
|
|
test("identical query and sentence tokens produce high score", () => {
|
|
const sentences = ["configure database connection", "unrelated random words"];
|
|
const query = "configure database connection";
|
|
const scores = scoreSentences(sentences, query, DEFAULT_CFG);
|
|
assert.ok(scores[0] > 0.5, `exact match should score above 0.5, got ${scores[0]}`);
|
|
assert.ok(scores[0] > scores[1]);
|
|
});
|