← back to Trademarks Copyright
tests/scoring.test.ts
72 lines
import { test } from "node:test";
import assert from "node:assert/strict";
import { scoreItem, yearsExpired } from "../src/lib/scoring";
test("scoreItem — max-out inputs land near 100", () => {
const s = scoreItem({
distinctiveness_score: 100,
recognition_score: 100,
domain_available: true,
competing_active_marks: 0,
monetization_breadth: 100,
expired_date: new Date(Date.now() - 8 * 365 * 86400_000).toISOString(),
});
assert.ok(s > 95, `expected > 95, got ${s}`);
});
test("scoreItem — min inputs land near 0", () => {
const s = scoreItem({
distinctiveness_score: 0,
recognition_score: 0,
domain_available: false,
competing_active_marks: 50,
monetization_breadth: 0,
expired_date: new Date().toISOString(),
});
assert.ok(s < 15, `expected < 15, got ${s}`);
});
test("scoreItem — very new expiration penalised for revival risk", () => {
const inputs = {
distinctiveness_score: 80,
recognition_score: 70,
domain_available: true,
competing_active_marks: 1,
monetization_breadth: 60,
};
const veryNew = scoreItem({ ...inputs, expired_date: new Date(Date.now() - 1 * 30 * 86400_000).toISOString() });
const sweetSpot = scoreItem({ ...inputs, expired_date: new Date(Date.now() - 6 * 365 * 86400_000).toISOString() });
assert.ok(sweetSpot > veryNew, `sweet-spot (${sweetSpot}) should beat very-new (${veryNew})`);
});
test("scoreItem — unknown domain availability sits between yes/no", () => {
const inputs = {
distinctiveness_score: 80,
recognition_score: 70,
competing_active_marks: 2,
monetization_breadth: 60,
expired_date: new Date(Date.now() - 6 * 365 * 86400_000).toISOString(),
};
const yes = scoreItem({ ...inputs, domain_available: true });
const no = scoreItem({ ...inputs, domain_available: false });
const unk = scoreItem({ ...inputs, domain_available: null });
assert.ok(yes > unk && unk > no, `expected yes>unk>no, got ${yes}/${unk}/${no}`);
});
test("scoreItem — competing marks are linearly penalising", () => {
const base = {
distinctiveness_score: 70, recognition_score: 60,
domain_available: true, monetization_breadth: 50,
expired_date: new Date(Date.now() - 5 * 365 * 86400_000).toISOString(),
};
const clean = scoreItem({ ...base, competing_active_marks: 0 });
const some = scoreItem({ ...base, competing_active_marks: 3 });
const many = scoreItem({ ...base, competing_active_marks: 10 });
assert.ok(clean > some && some > many, `clean>some>many, got ${clean}/${some}/${many}`);
});
test("yearsExpired returns positive years rounded to 2 decimals", () => {
const y = yearsExpired({ expired_date: new Date(Date.now() - 365 * 86400_000).toISOString() } as never);
assert.ok(y > 0.9 && y < 1.1, `expected ~1 year, got ${y}`);
});