test.govlab/quality/core/parsers/tool.gosec.parser.test.ts
test.govlab/quality/core/parsers/tool.gosec.parser.test.ts is a file in Codebase Testing. 36 lines of code and 0 definitions.
import { describe, expect, it } from "vitest";
import { parseGosecOutput } from "@govlab/quality/core/parsers/tool.gosec.parser.ts";
const EXPECTED_COUNT = 2;
const RECORDED =
'{"Issues":[' +
'{"column":"9","confidence":"HIGH","details":"Subprocess launched with variable","file":"main.go","line":"6","rule_id":"G204","severity":"MEDIUM"},' +
'{"column":"5","confidence":"LOW","details":"Potential hardcoded credentials","file":"secrets.go","line":"3","rule_id":"G101","severity":"HIGH"}' +
'],"Stats":{"files":1,"lines":12}}';
const MISSING_POS = '{"Issues":[{"details":"file path from variable","rule_id":"G304","severity":"MEDIUM"}]}';
describe("parseGosecOutput", () => {
it("maps every issue to an ADVISORY finding (advisory:true, never gates), coercing string line/column", () => {
const findings = parseGosecOutput(RECORDED, "go");
expect(findings).toHaveLength(EXPECTED_COUNT);
expect(findings.every((finding) => finding.advisory)).toBe(true);
expect(findings[0]).toMatchObject({
advisory: true,
column: 9,
ecosystem: "go",
file: "main.go",
line: 6,
ruleId: "G204",
severity: "error",
tool: "gosec",
});
expect(findings[1]).toMatchObject({ advisory: true, line: 3, ruleId: "G101", severity: "error" });
});
it("falls back to POSITION when line/column are missing or non-numeric", () => {
const findings = parseGosecOutput(MISSING_POS, "go");
expect(findings[0]).toMatchObject({ column: 1, line: 1, ruleId: "G304" });
});
it("returns [] on empty, no-Issues, or non-JSON output", () => {
expect(parseGosecOutput("", "go")).toEqual([]);
expect(parseGosecOutput("{}", "go")).toEqual([]);
expect(parseGosecOutput("not json", "go")).toEqual([]);
});
});