Skip to content

Commit c041e05

Browse files
bosdbosd
authored andcommitted
[IMP]: Coverage of checker.py
1 parent ab37558 commit c041e05

File tree

1 file changed

+112
-0
lines changed

1 file changed

+112
-0
lines changed

tests/test_checker.py

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
"""Test the data quality checker functions."""
2+
3+
from unittest.mock import MagicMock, patch
4+
5+
from odoo_data_flow.lib import checker
6+
7+
8+
class TestCheckers:
9+
"""Test suite for the checker functions."""
10+
11+
def test_id_validity_checker_success(self) -> None:
12+
"""Tests that id_validity_checker returns True for valid data."""
13+
header = ["id", "name"]
14+
data = [["SKU-001", "A"], ["SKU-002", "B"], ["NULL", "C"]]
15+
check_func = checker.id_validity_checker("id", r"^SKU-\d{3}$")
16+
assert check_func(header, data) is True
17+
18+
@patch("odoo_data_flow.lib.checker.log.warning")
19+
def test_id_validity_checker_failure(self, mock_log_warning: MagicMock) -> None:
20+
"""Tests that id_validity_checker returns False for invalid data."""
21+
header = ["id", "name"]
22+
data = [["SKU-001", "A"], ["BAD-ID", "B"]]
23+
check_func = checker.id_validity_checker("id", r"^SKU-\d{3}$")
24+
assert check_func(header, data) is False
25+
mock_log_warning.assert_called_once()
26+
assert "does not match pattern" in mock_log_warning.call_args[0][0]
27+
28+
@patch("odoo_data_flow.lib.checker.log.error")
29+
def test_id_validity_checker_bad_regex(self, mock_log_error: MagicMock) -> None:
30+
"""Tests that id_validity_checker handles an invalid regex pattern."""
31+
header = ["id", "name"]
32+
data = [["SKU-001", "A"]]
33+
# This regex has an unclosed parenthesis, which is invalid
34+
check_func = checker.id_validity_checker("id", r"^SKU-(\d{3}$")
35+
assert check_func(header, data) is False
36+
mock_log_error.assert_called_once()
37+
assert "Invalid regex pattern" in mock_log_error.call_args[0][0]
38+
39+
def test_id_validity_checker_with_custom_null_values(self) -> None:
40+
"""Tests the checker with a custom list of null values."""
41+
header = ["id", "name"]
42+
# This data would fail if "N/A" were not treated as a null value
43+
data = [["SKU-001", "A"], ["N/A", "B"]]
44+
check_func = checker.id_validity_checker(
45+
"id", r"^SKU-\d{3}$", null_values=["N/A"]
46+
)
47+
# The check should pass because the "N/A" row is skipped
48+
assert check_func(header, data) is True
49+
50+
def test_line_length_checker_success(self) -> None:
51+
"""Tests that line_length_checker returns True for valid data."""
52+
header = ["id", "name"]
53+
data = [["1", "A"], ["2", "B"]]
54+
check_func = checker.line_length_checker(2)
55+
assert check_func(header, data) is True
56+
57+
@patch("odoo_data_flow.lib.checker.log.warning")
58+
def test_line_length_checker_failure(self, mock_log_warning: MagicMock) -> None:
59+
"""Tests that line_length_checker returns False for invalid data."""
60+
header = ["id", "name"]
61+
data = [["1", "A"], ["2", "B", "extra_col"]] # This line is too long
62+
check_func = checker.line_length_checker(2)
63+
assert check_func(header, data) is False
64+
mock_log_warning.assert_called_once()
65+
assert "Expected 2 columns, but found 3" in mock_log_warning.call_args[0][0]
66+
67+
def test_line_number_checker_success(self) -> None:
68+
"""Tests that line_number_checker returns True for valid data."""
69+
header = ["id"]
70+
data = [["1"], ["2"]]
71+
check_func = checker.line_number_checker(2)
72+
assert check_func(header, data) is True
73+
74+
@patch("odoo_data_flow.lib.checker.log.warning")
75+
def test_line_number_checker_failure(self, mock_log_warning: MagicMock) -> None:
76+
"""Tests that line_number_checker returns False for invalid data."""
77+
header = ["id"]
78+
data = [["1"]]
79+
check_func = checker.line_number_checker(5) # Expects 5 rows
80+
assert check_func(header, data) is False
81+
mock_log_warning.assert_called_once()
82+
assert "Expected 5 data rows, but found 1" in mock_log_warning.call_args[0][0]
83+
84+
def test_cell_len_checker_success(self) -> None:
85+
"""Tests that cell_len_checker returns True for valid data."""
86+
header = ["id", "name"]
87+
data = [["1", "short"], ["2", "short"]]
88+
check_func = checker.cell_len_checker(10)
89+
assert check_func(header, data) is True
90+
91+
@patch("odoo_data_flow.lib.checker.log.warning")
92+
def test_cell_len_checker_failure(self, mock_log_warning: MagicMock) -> None:
93+
"""Tests that cell_len_checker returns False for invalid data."""
94+
header = ["id", "description"]
95+
data = [["1", "This description is definitely way too long"]]
96+
check_func = checker.cell_len_checker(20)
97+
assert check_func(header, data) is False
98+
mock_log_warning.assert_called_once()
99+
assert "exceeds the max of 20" in mock_log_warning.call_args[0][0]
100+
101+
@patch("odoo_data_flow.lib.checker.log.warning")
102+
def test_cell_len_checker_failure_no_header(
103+
self, mock_log_warning: MagicMock
104+
) -> None:
105+
"""Tests cell_len_checker failure when header is shorter than data row."""
106+
header = ["id"] # Header is too short for the data row
107+
data = [["1", "This cell causes the error"]]
108+
check_func = checker.cell_len_checker(5)
109+
assert check_func(header, data) is False
110+
mock_log_warning.assert_called_once()
111+
# Should fall back to reporting the column number
112+
assert "column 2" in mock_log_warning.call_args[0][0]

0 commit comments

Comments
 (0)