31 lines · 1.3 KB
import { describe, expect, test } from "bun:test";
import { attributesFor, parseAttributes } from "./gitattributes";

describe("gitattributes", () => {
  const rules = parseAttributes(
    [
      "# comment",
      "*.js linguist-language=TypeScript",
      "vendor/ linguist-vendored",
      "/docs/** linguist-documentation",
      "generated/*.ts linguist-generated -diff",
      "vendor/keep.js -linguist-vendored",
      "*.lock !linguist-generated",
    ].join("\n"),
    100,
  );

  test("later rules win per attribute, with set, unset, value and unspecified forms", () => {
    expect(Object.fromEntries(attributesFor(rules, "src/app.js"))).toEqual({ "linguist-language": "TypeScript" });
    expect(attributesFor(rules, "lib/vendor/x/y.c").get("linguist-vendored")).toBe(true);
    expect(attributesFor(rules, "vendor/keep.js").get("linguist-vendored")).toBe(false);
    expect(attributesFor(rules, "docs/a/b.md").get("linguist-documentation")).toBe(true);
    expect(attributesFor(rules, "src/docs/b.md").has("linguist-documentation")).toBe(false);
    expect(Object.fromEntries(attributesFor(rules, "generated/a.ts"))).toEqual({
      "linguist-generated": true,
      diff: false,
    });
    expect(attributesFor(rules, "bun.lock").get("linguist-generated")).toBeNull();
  });
});