test.govlab/quality/core/converters/edit.converter.test.ts

test.govlab/quality/core/converters/edit.converter.test.ts is a file in Codebase Testing. 55 lines of code and 0 definitions.

import { describe, expect, it } from "vitest";
import type { CuratedResult } from "@govlab/quality/types/edit.types.ts";
import type { Linter } from "eslint";
import { applyCuratedSuggestions } from "@govlab/quality/core/converters/edit.converter.ts";

const RULE = "@typescript-eslint/explicit-member-accessibility";
const SOURCE = "class C {\n    foo() {}\n}\n";
const FOO_OFFSET = 14;
const SEVERITY_ERROR = 2;
const COLUMN = 5;
const LINE = 2;

const accessibilityMessage = (at: number): Linter.LintMessage => {
    const range: [number, number] = [at, at];
    return {
        column: COLUMN,
        line: LINE,
        message: "Missing accessibility modifier",
        messageId: "missingAccessibility",
        ruleId: RULE,
        severity: SEVERITY_ERROR,
        suggestions: [
            { desc: "Add 'public' accessibility modifier", fix: { range, text: "public " } },
            { desc: "Add 'private' accessibility modifier", fix: { range, text: "private " } },
        ],
    };
};

const resultOf = (messages: Linter.LintMessage[]): CuratedResult => ({ errorCount: messages.length, messages });

describe("applyCuratedSuggestions", () => {
    it("inserts the public modifier, prunes the consumed message, and decrements errorCount", () => {
        const result = resultOf([accessibilityMessage(FOO_OFFSET)]);
        const applied = applyCuratedSuggestions(result, SOURCE);
        expect(applied?.output).toBe("class C {\n    public foo() {}\n}\n");
        expect(applied?.appliedCount).toBe(1);
        expect(result.messages).toHaveLength(0);
        expect(result.errorCount).toBe(0);
    });

    it("selects the public suggestion, never private or protected", () => {
        const result = resultOf([accessibilityMessage(FOO_OFFSET)]);
        const applied = applyCuratedSuggestions(result, SOURCE);
        expect(applied?.output.includes("public foo")).toBe(true);
        expect(applied?.output.includes("private")).toBe(false);
    });

    it("returns null and leaves messages untouched when no curated rule matches", () => {
        const other: Linter.LintMessage = {
            column: COLUMN,
            line: LINE,
            message: "unexpected console statement",
            messageId: "x",
            ruleId: "no-console",
            severity: SEVERITY_ERROR,
        };
        const result = resultOf([other]);
        expect(applyCuratedSuggestions(result, SOURCE)).toBeNull();
        expect(result.messages).toHaveLength(1);
    });
});