26 lines · 1.1 KB
import { describe, expect, test } from "bun:test";
import { MAX_TOPICS, normalizeTopics, parseTopics, TopicError } from "./topics";

describe("repository topics", () => {
  test("normalizes case, separators and duplicates", () => {
    expect(normalizeTopics("Rust, web_assembly  cli,rust")).toEqual(["rust", "web-assembly", "cli"]);
    expect(normalizeTopics(["Machine Learning", "", "ml"])).toEqual(["machine-learning", "ml"]);
  });

  test("rejects invalid, overlong and too many topics", () => {
    expect(() => normalizeTopics(["-leading"])).toThrow(TopicError);
    expect(() => normalizeTopics(["c++"])).toThrow(TopicError);
    expect(() => normalizeTopics(["a".repeat(51)])).toThrow(TopicError);
    expect(() => normalizeTopics(Array.from({ length: MAX_TOPICS + 1 }, (_, index) => `t${index}`))).toThrow(
      TopicError,
    );
  });

  test("parses the stored column defensively", () => {
    expect(parseTopics('["a","b"]')).toEqual(["a", "b"]);
    expect(parseTopics("not json")).toEqual([]);
    expect(parseTopics('{"a":1}')).toEqual([]);
    expect(parseTopics(null)).toEqual([]);
  });
});