Coverage for tests / unit / parsers / streaming / test_parser_class.py: 100%
40 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 StreamingParser class."""
3from __future__ import annotations
5import pytest
6from assertpy import assert_that
8from lintro.parsers.base_issue import BaseIssue
9from lintro.parsers.streaming import StreamingParser
10from tests.unit.parsers.streaming.conftest import SimpleIssue
13def test_stream_json_lines_uses_parse_item() -> None:
14 """StreamingParser.stream_json_lines uses parse_item method."""
16 class TestParser(StreamingParser):
17 def parse_item(self, item: dict[str, object]) -> BaseIssue | None:
18 file_val = item.get("file")
19 return SimpleIssue(
20 file=str(file_val) if file_val else "",
21 )
23 parser = TestParser("test")
24 output = '{"file": "a.py"}\n{"file": "b.py"}\n'
25 results: list[BaseIssue] = list(parser.stream_json_lines(output))
27 assert_that(results).is_length(2)
30def test_stream_text_lines_uses_parse_line() -> None:
31 """StreamingParser.stream_text_lines uses parse_line method."""
33 class TestParser(StreamingParser):
34 def parse_line(self, line: str) -> BaseIssue | None:
35 if line.startswith("E:"):
36 return SimpleIssue(message=line[2:].strip())
37 return None
39 parser = TestParser("test")
40 output = "I: info\nE: error\nI: more\n"
41 results: list[BaseIssue] = list(parser.stream_text_lines(output))
43 assert_that(results).is_length(1)
44 assert_that(results[0].message).is_equal_to("error")
47def test_stream_json_array_uses_parse_item() -> None:
48 """StreamingParser.stream_json_array uses parse_item method."""
50 class TestParser(StreamingParser):
51 def parse_item(self, item: dict[str, object]) -> BaseIssue | None:
52 file_val = item.get("file")
53 return SimpleIssue(
54 file=str(file_val) if file_val else "",
55 )
57 parser = TestParser("test")
58 output = '[{"file": "a.py"}]'
59 results: list[BaseIssue] = list(parser.stream_json_array(output))
61 assert_that(results).is_length(1)
64@pytest.mark.parametrize(
65 ("method", "args"),
66 [
67 ("parse_item", ({},)),
68 ("parse_line", ("test",)),
69 ],
70)
71def test_methods_raise_not_implemented(
72 method: str,
73 args: tuple[object, ...],
74) -> None:
75 """parse_item and parse_line raise NotImplementedError by default.
77 Args:
78 method: The method name to test.
79 args: Arguments to pass to the method.
80 """
81 parser = StreamingParser("test")
83 with pytest.raises(NotImplementedError):
84 getattr(parser, method)(*args)