# test.govlab/quality/core/parsers/tool.clippy.parser.test.ts

> 66 lines of code and 0 definitions.

Tree: Codebase Testing
Language: typescript
Canonical: https://banes-lab.com/anatomy/testing#file-testing-test-govlab-quality-core-parsers-tool-clippy-parser-test-ts
Source text: https://banes-lab.com/source/testing/test.govlab/quality/core/parsers/tool.clippy.parser.test.ts.txt

Listed in [test.govlab/quality/core/parsers](https://banes-lab.com/api/source/testing/test.govlab/quality/core/parsers.md), after [test.govlab/quality/core/parsers/tool.clang-tidy.parser.test.ts](https://banes-lab.com/source/testing/test.govlab/quality/core/parsers/tool.clang-tidy.parser.test.ts.md) and before [test.govlab/quality/core/parsers/tool.clj-kondo.parser.test.ts](https://banes-lab.com/source/testing/test.govlab/quality/core/parsers/tool.clj-kondo.parser.test.ts.md).

## Contained in

- [test.govlab/quality/core/parsers](https://banes-lab.com/anatomy/testing/folder-testing-test-govlab-quality-core-parsers.md)

## Source

```typescript
import { describe, expect, it } from "vitest";
import { parseClippyOutput } from "@govlab/quality/core/parsers/tool.clippy.parser.ts";

const EXPECTED_COUNT = 2;

const RECORDED = [
    { reason: "compiler-artifact", target: { name: "polyglotfixture" } },
    {
        message: {
            code: { code: "clippy::too_many_arguments" },
            level: "warning",
            message: "this function has too many arguments (5/4)",
            spans: [{ column_start: 1, file_name: "src/main.rs", is_primary: true, line_start: 3 }],
        },
        reason: "compiler-message",
    },
    {
        message: {
            code: { code: "clippy::needless_return" },
            level: "warning",
            message: "unneeded return statement",
            spans: [
                {
                    column_start: 5,
                    file_name: "src/main.rs",
                    is_primary: true,
                    line_start: 5,
                    suggestion_applicability: "MachineApplicable",
                },
            ],
        },
        reason: "compiler-message",
    },
    { message: { code: null, level: "warning", message: "2 warnings emitted", spans: [] }, reason: "compiler-message" },
    { reason: "build-finished", success: true },
]
    .map((entry) => JSON.stringify(entry))
    .join("\n");

describe("parseClippyOutput", () => {
    it("maps only coded compiler-messages to gating (error, advisory:false) Findings", () => {
        const findings = parseClippyOutput(RECORDED, "rust");
        expect(findings).toHaveLength(EXPECTED_COUNT);
        expect(findings[0]).toMatchObject({
            advisory: false,
            column: 1,
            ecosystem: "rust",
            file: "src/main.rs",
            fixable: false,
            line: 3,
            ruleId: "clippy::too_many_arguments",
            severity: "error",
            tool: "clippy",
        });
    });

    it("marks a MachineApplicable diagnostic fixable", () => {
        const findings = parseClippyOutput(RECORDED, "rust");
        const needless = findings.find((finding) => finding.ruleId === "clippy::needless_return");
        expect(needless?.fixable).toBe(true);
    });

    it("drops control lines and codeless summary messages", () => {
        const findings = parseClippyOutput(RECORDED, "rust");
        expect(findings.every((finding) => finding.ruleId.startsWith("clippy::"))).toBe(true);
    });

    it("returns [] on empty or non-JSON output", () => {
        expect(parseClippyOutput("", "rust")).toEqual([]);
        expect(parseClippyOutput("not json\n{bad", "rust")).toEqual([]);
    });
});
```
