test.govlab/quality/core/parsers/report.parser.test.ts

test.govlab/quality/core/parsers/report.parser.test.ts is a file in Codebase Testing. 88 lines of code and 0 definitions.

import { describe, expect, it } from "vitest";
import { parseSarifReport } from "@govlab/quality/core/parsers/report.parser.ts";

const EXPECTED_COUNT = 2;

const sarifOf = function sarifOf(uri: string, ruleId: string, line: number, column: number): string {
    return JSON.stringify({
        runs: [
            {
                results: [
                    {
                        level: "warning",
                        locations: [
                            {
                                physicalLocation: {
                                    artifactLocation: { uri },
                                    region: { startColumn: column, startLine: line },
                                },
                            },
                        ],
                        message: { text: "A rule reported a defect." },
                        ruleId,
                    },
                ],
            },
        ],
    });
};

const TWO_RESULTS = JSON.stringify({
    runs: [
        {
            results: [
                {
                    locations: [
                        {
                            physicalLocation: {
                                artifactLocation: { uri: "Bad.java" },
                                region: { startColumn: 1, startLine: 1 },
                            },
                        },
                    ],
                    message: { text: "Missing a Javadoc comment." },
                    ruleId: "javadoc.missing",
                },
                {
                    locations: [
                        {
                            physicalLocation: {
                                artifactLocation: { uri: "Bad.java" },
                                region: { startColumn: 10, startLine: 3 },
                            },
                        },
                    ],
                    message: { text: "'=' is not followed by whitespace." },
                    ruleId: "ws.notFollowed",
                },
            ],
        },
    ],
});

describe("parseSarifReport", () => {
    it("maps SARIF results to gating findings keyed to the named tool", () => {
        const findings = parseSarifReport(TWO_RESULTS, "java", "checkstyle");
        expect(findings).toHaveLength(EXPECTED_COUNT);
        expect(findings.every((finding) => !finding.advisory)).toBe(true);
        expect(findings[0]).toMatchObject({
            column: 1,
            ecosystem: "java",
            file: "Bad.java",
            line: 1,
            ruleId: "javadoc.missing",
            severity: "error",
            tool: "checkstyle",
        });
        expect(findings[1]).toMatchObject({ column: 10, line: 3, ruleId: "ws.notFollowed" });
    });

    it("strips every file URI scheme to a plain path", () => {
        expect(parseSarifReport(sarifOf("file:/D:/proj/A.java", "x", 1, 1), "java", "pmd")[0]?.file).toBe(
            "D:/proj/A.java",
        );
        expect(parseSarifReport(sarifOf("file:///D:/proj/Bad.kt", "x", 5, 5), "kotlin", "detekt")[0]?.file).toBe(
            "D:/proj/Bad.kt",
        );
    });

    it("returns [] on empty, no-runs, or non-JSON output", () => {
        expect(parseSarifReport("", "java", "pmd")).toEqual([]);
        expect(parseSarifReport(JSON.stringify({ runs: [] }), "java", "pmd")).toEqual([]);
        expect(parseSarifReport("not json", "java", "pmd")).toEqual([]);
    });
});