Coverage for tests / unit / parsers / pydoclint_parser / test_edge_cases.py: 100%

53 statements  

« prev     ^ index     » next       coverage.py v7.13.0, created at 2026-04-03 18:53 +0000

1"""Tests for pydoclint parser edge cases.""" 

2 

3from __future__ import annotations 

4 

5from assertpy import assert_that 

6 

7from lintro.parsers.pydoclint.pydoclint_parser import parse_pydoclint_output 

8 

9 

10def test_parse_unicode_path() -> None: 

11 """Parse issue with unicode characters in path.""" 

12 output = """src/模块/helper.py 

13 10: DOC101: Test message""" 

14 result = parse_pydoclint_output(output=output) 

15 

16 assert_that(result).is_length(1) 

17 assert_that(result[0].file).is_equal_to("src/模块/helper.py") 

18 

19 

20def test_parse_path_with_spaces() -> None: 

21 """Parse issue with spaces in file path. 

22 

23 Note: pydoclint file path pattern requires the path to end with .py/.pyi. 

24 Paths with spaces are preserved as-is. 

25 """ 

26 output = """src/my module/helper file.py 

27 10: DOC101: Test message""" 

28 result = parse_pydoclint_output(output=output) 

29 

30 assert_that(result).is_length(1) 

31 assert_that(result[0].file).is_equal_to("src/my module/helper file.py") 

32 

33 

34def test_parse_message_with_special_characters() -> None: 

35 """Parse issue with special characters in message.""" 

36 output = """test.py 

37 10: DOC101: Function `foo` has 'special' chars: [a, b]""" 

38 result = parse_pydoclint_output(output=output) 

39 

40 assert_that(result).is_length(1) 

41 assert_that(result[0].message).is_equal_to( 

42 "Function `foo` has 'special' chars: [a, b]", 

43 ) 

44 

45 

46def test_parse_very_long_message() -> None: 

47 """Parse issue with very long message.""" 

48 long_message = "A" * 1000 

49 output = f"""test.py 

50 10: DOC101: {long_message}""" 

51 result = parse_pydoclint_output(output=output) 

52 

53 assert_that(result).is_length(1) 

54 assert_that(result[0].message).is_equal_to(long_message) 

55 

56 

57def test_parse_high_line_numbers() -> None: 

58 """Parse issue with high line numbers. 

59 

60 Note: pydoclint doesn't provide column information, so column is always 0. 

61 """ 

62 output = """test.py 

63 99999: DOC101: Test message""" 

64 result = parse_pydoclint_output(output=output) 

65 

66 assert_that(result).is_length(1) 

67 assert_that(result[0].line).is_equal_to(99999) 

68 assert_that(result[0].column).is_equal_to(0) # pydoclint doesn't report columns 

69 

70 

71def test_parse_nested_path() -> None: 

72 """Parse issue with nested directory path.""" 

73 output = """src/module/test.py 

74 10: DOC101: Test message""" 

75 result = parse_pydoclint_output(output=output) 

76 

77 assert_that(result).is_length(1) 

78 assert_that(result[0].file).is_equal_to("src/module/test.py") 

79 

80 

81def test_parse_multiple_colons_in_message() -> None: 

82 """Parse issue with colons in the message.""" 

83 output = """test.py 

84 10: DOC101: Error: Function `foo`: missing args: [x, y]""" 

85 result = parse_pydoclint_output(output=output) 

86 

87 assert_that(result).is_length(1) 

88 assert_that(result[0].message).is_equal_to( 

89 "Error: Function `foo`: missing args: [x, y]", 

90 ) 

91 

92 

93def test_parse_empty_lines_between_issues() -> None: 

94 """Parse output with empty lines between issues.""" 

95 output = """test.py 

96 10: DOC101: First issue 

97 

98 20: DOC201: Second issue 

99 

100""" 

101 result = parse_pydoclint_output(output=output) 

102 

103 assert_that(result).is_length(2) 

104 assert_that(result[0].code).is_equal_to("DOC101") 

105 assert_that(result[1].code).is_equal_to("DOC201") 

106 

107 

108def test_parse_multiple_files() -> None: 

109 """Parse output with issues from multiple files.""" 

110 output = """src/module_a.py 

111 10: DOC101: First issue 

112 20: DOC102: Second issue 

113src/module_b.py 

114 5: DOC201: Third issue""" 

115 result = parse_pydoclint_output(output=output) 

116 

117 assert_that(result).is_length(3) 

118 assert_that(result[0].file).is_equal_to("src/module_a.py") 

119 assert_that(result[1].file).is_equal_to("src/module_a.py") 

120 assert_that(result[2].file).is_equal_to("src/module_b.py")