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

> 56 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-credo-parser-test-ts
Source text: https://banes-lab.com/source/testing/test.govlab/quality/core/parsers/tool.credo.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.clj-kondo.parser.test.ts](https://banes-lab.com/source/testing/test.govlab/quality/core/parsers/tool.clj-kondo.parser.test.ts.md) and before [test.govlab/quality/core/parsers/tool.depcheck.parser.test.ts](https://banes-lab.com/source/testing/test.govlab/quality/core/parsers/tool.depcheck.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 { parseCredoOutput } from "@govlab/quality/core/parsers/tool.credo.parser.ts";

const EXPECTED_COUNT = 2;

const RECORDED = `Compiling 1 file (.ex)
Generated bad app
{
  "issues": [
    {
      "category": "readability",
      "check": "Credo.Check.Readability.ModuleDoc",
      "column": 11,
      "column_end": 14,
      "filename": "lib/bad.ex",
      "line_no": 1,
      "message": "Modules should have a @moduledoc tag.",
      "priority": 1,
      "scope": "Bad"
    },
    {
      "category": "warning",
      "check": "Credo.Check.Warning.UnusedEnumOperation",
      "column": 5,
      "filename": "lib/bad.ex",
      "line_no": 3,
      "message": "There should be no unused return values."
    }
  ]
}`;

describe("parseCredoOutput", () => {
    it("extracts the JSON object from noisy stdout and maps issues to advisory findings keyed by check", () => {
        const findings = parseCredoOutput(RECORDED, "elixir");
        expect(findings).toHaveLength(EXPECTED_COUNT);
        expect(findings[0]).toMatchObject({
            advisory: true,
            column: 11,
            ecosystem: "elixir",
            file: "lib/bad.ex",
            line: 1,
            message: "Modules should have a @moduledoc tag.",
            ruleId: "Credo.Check.Readability.ModuleDoc",
            severity: "error",
            tool: "credo",
        });
        expect(findings[1]).toMatchObject({
            advisory: true,
            line: 3,
            ruleId: "Credo.Check.Warning.UnusedEnumOperation",
            severity: "error",
        });
    });

    it("returns [] when there is no JSON object or on malformed JSON", () => {
        expect(parseCredoOutput("", "elixir")).toEqual([]);
        expect(parseCredoOutput("Compiling... no json here", "elixir")).toEqual([]);
        expect(parseCredoOutput("{ not valid json", "elixir")).toEqual([]);
    });
});
```
