← 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}`);
});