Coverage for tests / unit / parsers / shellcheck_parser / test_field_extraction.py: 100%
36 statements
« prev ^ index » next coverage.py v7.13.0, created at 2026-04-03 18:53 +0000
« prev ^ index » next coverage.py v7.13.0, created at 2026-04-03 18:53 +0000
1"""Tests for shellcheck parser field extraction."""
3from __future__ import annotations
5import pytest
6from assertpy import assert_that
8from lintro.parsers.shellcheck.shellcheck_parser import parse_shellcheck_output
10from .conftest import make_issue, make_shellcheck_output
13@pytest.mark.parametrize(
14 ("level", "code"),
15 [
16 ("error", 1072),
17 ("warning", 2086),
18 ("info", 2034),
19 ("style", 2129),
20 ],
21)
22def test_parse_severity_levels(level: str, code: int) -> None:
23 """Parse issues with different severity levels.
25 Args:
26 level: The expected severity level.
27 code: The expected error code.
28 """
29 output = make_shellcheck_output([make_issue(level=level, code=code)])
30 result = parse_shellcheck_output(output=output)
32 assert_that(result).is_length(1)
33 assert_that(result[0].level).is_equal_to(level)
34 assert_that(result[0].code).is_equal_to(f"SC{code}")
37def test_parse_extracts_all_fields() -> None:
38 """Parse issue extracts all fields correctly."""
39 output = make_shellcheck_output(
40 [
41 make_issue(
42 file="script.sh",
43 line=10,
44 column=5,
45 level="warning",
46 code=2086,
47 message="Double quote to prevent globbing and word splitting.",
48 end_line=12,
49 end_column=15,
50 ),
51 ],
52 )
53 result = parse_shellcheck_output(output=output)
55 assert_that(result).is_length(1)
56 issue = result[0]
57 assert_that(issue.file).is_equal_to("script.sh")
58 assert_that(issue.line).is_equal_to(10)
59 assert_that(issue.end_line).is_equal_to(12)
60 assert_that(issue.column).is_equal_to(5)
61 assert_that(issue.end_column).is_equal_to(15)
62 assert_that(issue.level).is_equal_to("warning")
63 assert_that(issue.code).is_equal_to("SC2086")
64 assert_that(issue.message).is_equal_to(
65 "Double quote to prevent globbing and word splitting.",
66 )
69def test_parse_handles_missing_optional_fields() -> None:
70 """Parse issue with missing optional fields uses defaults."""
71 output = make_shellcheck_output([make_issue()])
72 result = parse_shellcheck_output(output=output)
74 assert_that(result).is_length(1)
75 assert_that(result[0].end_line).is_equal_to(0)
76 assert_that(result[0].end_column).is_equal_to(0)
79def test_parse_code_as_string() -> None:
80 """Parse handles code as string (edge case)."""
81 output = make_shellcheck_output([make_issue(code="SC2086")])
82 result = parse_shellcheck_output(output=output)
84 assert_that(result).is_length(1)
85 assert_that(result[0].code).is_equal_to("SC2086")