Coverage for tests/test_convert_lists.py: 100%
24 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-05-25 21:42 +0000
« prev ^ index » next coverage.py v7.8.0, created at 2025-05-25 21:42 +0000
1import pytest
2from datetime import datetime
3from src.convert_lists import converter
4from src.convert_lists import compare_lists_by_tuples
5import copy
6from src.convert_lists import get_list_from_three_norm_del_add
8class TestConverter:
9 @pytest.mark.parametrize(
10 "input_list,expected",
11 [
12 (
13 ["100", datetime(2024, 6, 1, 14, 30), "FirmX", "John Doe ", "Note", "12345", "123456789", "wenz1", "1", 0],
14 ["100", "14:30", "FirmX", "John Doe", "Note", "12345", "123456789", "wenz1", True, 0]
15 ),
16 (
17 [None, datetime(2024, 6, 1, 8, 0), None, "", None, None, None, None, None, 1],
18 ["", "08:00", "", "", "", "", "", None, False, 1]
19 ),
20 (
21 [" 200 ", datetime(2024, 6, 1, 9, 15), " Firm None ", " Alice ", "None", " 54321 ", " 987654321 ", "wenz2", "None", 2],
22 ["200", "09:15", "Firm", "Alice", "", "54321", "987654321", "wenz2", False, 2]
23 ),
24 (
25 ["300", datetime(2024, 6, 1, 10, 45), "FirmY", "Bob", "Remark", "67890", 123456789.0, "wenz3", "0", 3],
26 ["300", "10:45", "FirmY", "Bob", "Remark", "67890", "123456789", "wenz3", True, 3]
27 ),
28 (
29 ["400", datetime(2024, 6, 1, 12, 0), "FirmZ", "Eve", "Info", "11111", "555555555", "wenz4", "501", 4],
30 ["400", "12:00", "FirmZ", "Eve", "Info", "11111", "555555555", "wenz4", False, 4]
31 ),
32 (
33 ["500", datetime(2024, 6, 1, 13, 0), "FirmA", "Carl", "None", "22222", "666666666", "wenz5", "", 5],
34 ["500", "13:00", "FirmA", "Carl", "", "22222", "666666666", "wenz5", False, 5]
35 ),
36 ]
37 )
38 def test_converter(self, input_list, expected):
39 result = converter(input_list)
40 assert result == expected
43class TestCompareListsByTuples:
44 @pytest.mark.parametrize(
45 "del_lista, add_lista, expected_del, expected_add",
46 [
47 # No matches, lists unchanged
48 (
49 [
50 ["100", "14:30", "FirmX", "John", "Note", "12345", "123456789", "wenz1", True, 1],
51 ["200", "15:00", "FirmY", "Alice", "Note2", "54321", "987654321", "wenz2", False, 1],
52 ],
53 [
54 ["300", "16:00", "FirmZ", "Bob", "Note3", "67890", "555555555", "wenz3", True, 2],
55 ],
56 [
57 ["100", "14:30", "FirmX", "John", "Note", "12345", "123456789", "wenz1", True, 1],
58 ["200", "15:00", "FirmY", "Alice", "Note2", "54321", "987654321", "wenz2", False, 1],
59 ],
60 [
61 ["300", "16:00", "FirmZ", "Bob", "Note3", "67890", "555555555", "wenz3", True, 2],
62 ],
63 ),
64 # One match, one field differs, HTML tags applied, add_lista element removed
65 (
66 [
67 ["100", "14:30", "FirmX", "John", "Note", "12345", "123456789", "wenz1", True, 1],
68 ],
69 [
70 ["100", "14:30", "FirmX", "Johnny", "Note", "12345", "123456789", "wenz1", True, 2],
71 ],
72 [
73 [
74 "100",
75 "14:30",
76 "FirmX",
77 '<span style="color: rgb(238, 36, 36); font-weight: bold; text-decoration: line-through;">John</span> <span style="color: rgb(0, 139, 7); font-weight: bold;">Johnny</span>',
78 "Note",
79 "12345",
80 "123456789",
81 "wenz1",
82 True,
83 0,
84 ]
85 ],
86 [],
87 ),
88 # Multiple matches, multiple fields differ
89 (
90 [
91 ["100", "14:30", "FirmX", "John", "Note", "12345", "123456789", "wenz1", True, 1],
92 ["200", "15:00", "FirmY", "Alice", "Note2", "54321", "987654321", "wenz2", False, 1],
93 ],
94 [
95 ["100", "14:30", "FirmX", "Johnny", "Note", "12345", "123456789", "wenz1", True, 2],
96 ["200", "15:00", "FirmY", "Alicia", "Note2", "54321", "987654321", "wenz2", True, 2],
97 ],
98 [
99 [
100 "100",
101 "14:30",
102 "FirmX",
103 '<span style="color: rgb(238, 36, 36); font-weight: bold; text-decoration: line-through;">John</span> <span style="color: rgb(0, 139, 7); font-weight: bold;">Johnny</span>',
104 "Note",
105 "12345",
106 "123456789",
107 "wenz1",
108 True,
109 0,
110 ],
111 [
112 "200",
113 "15:00",
114 "FirmY",
115 '<span style="color: rgb(238, 36, 36); font-weight: bold; text-decoration: line-through;">Alice</span> <span style="color: rgb(0, 139, 7); font-weight: bold;">Alicia</span>',
116 "Note2",
117 "54321",
118 "987654321",
119 "wenz2",
120 False,
121 0,
122 ],
123 ],
124 [],
125 ),
126 # Partial match, only one tuple matches
127 (
128 [
129 ["100", "14:30", "FirmX", "John", "Note", "12345", "123456789", "wenz1", True, 1],
130 ["200", "15:00", "FirmY", "Alice", "Note2", "54321", "987654321", "wenz2", False, 1],
131 ],
132 [
133 ["100", "14:30", "FirmX", "Johnny", "Note", "12345", "123456789", "wenz1", True, 2],
134 ["300", "16:00", "FirmZ", "Bob", "Note3", "67890", "555555555", "wenz3", True, 2],
135 ],
136 [
137 [
138 "100",
139 "14:30",
140 "FirmX",
141 '<span style="color: rgb(238, 36, 36); font-weight: bold; text-decoration: line-through;">John</span> <span style="color: rgb(0, 139, 7); font-weight: bold;">Johnny</span>',
142 "Note",
143 "12345",
144 "123456789",
145 "wenz1",
146 True,
147 0,
148 ],
149 ["200", "15:00", "FirmY", "Alice", "Note2", "54321", "987654321", "wenz2", False, 1],
150 ],
151 [
152 ["300", "16:00", "FirmZ", "Bob", "Note3", "67890", "555555555", "wenz3", True, 2],
153 ],
154 ),
155 ]
156 )
157 def test_compare_lists_by_tuples(self, del_lista, add_lista, expected_del, expected_add):
158 # Deepcopy to avoid mutation side effects
159 del_copy = copy.deepcopy(del_lista)
160 add_copy = copy.deepcopy(add_lista)
161 result_del, result_add = compare_lists_by_tuples(del_copy, add_copy)
162 assert result_del == expected_del
163 assert result_add == expected_add
166class TestGetListFromThreeNormDelAdd:
167 @pytest.mark.parametrize(
168 "lista_norm, lista_del, lista_add, expected",
169 [
170 # All lists empty
171 ([], [], [], []),
173 # Only norm list has items
174 (
175 [
176 ("100", datetime(2024, 6, 1, 14, 30), "FirmX", "John", "Note ", "12345", " 123456789", "wenz1", "1"),
177 ],
178 [],
179 [],
180 [
181 ["100", "14:30", "FirmX", "John", "Note", "12345", "123456789", "wenz1", True, 0],
182 ],
183 ),
185 # Only del list has items
186 (
187 [],
188 [
189 ("200", datetime(2024, 6, 1, 15, 0), "FirmY", "Alice", "Note 2", "54321", "987654321", "wenz2", None),
190 ],
191 [],
192 [
193 ["200", "15:00", "FirmY", "Alice", "Note 2", "54321", "987654321", "wenz2", False, 1],
194 ],
195 ),
197 # Only add list has items
198 (
199 [("300", datetime(2024, 6, 1, 16, 0), "FirmZ", "Bob", "Note3", "67890", "555555555", "wenz3", "hsjhdaj"),],
200 [],
201 [
202 ("300", datetime(2024, 6, 1, 16, 0), "FirmZ", "Bob", "Note3", "67890", "555555555", "wenz3", "hsjhdaj"),
203 ],
204 [
205 ["300", "16:00", "FirmZ", "Bob", "Note3", "67890", "555555555", "wenz3", True, 2],
206 ],
207 ),
209 # All lists have unique items
210 (
211 [
212 ("100", datetime(2024, 6, 1, 14, 30), "FirmX", "John", "Note", "12345", "123456789", "wenz1", "saddaccas"),
213 ("200", datetime(2024, 6, 1, 15, 0), "FirmY", "Alice", "Note2", "54321", "987654321", "wenz2", "501"),
214 ("300", datetime(2024, 6, 1, 16, 0), "FirmZ", "Bob", "Note3", "67890", "555555555", "wenz3", "1"),
215 ],
216 [
217 ("200", datetime(2024, 6, 1, 15, 0), "FirmY", "Alice", "Note2", "54321", "987654321", "wenz2", "501"),
218 ],
219 [
220 ("300", datetime(2024, 6, 1, 16, 0), "FirmZ", "Bob", "Note3", "67890", "555555555", "wenz3", "1"),
221 ],
222 [
223 ["100", "14:30", "FirmX", "John", "Note", "12345", "123456789", "wenz1", True, 0],
224 ["200", "15:00", "FirmY", "Alice", "Note2", "54321", "987654321", "wenz2", False, 1],
225 ["300", "16:00", "FirmZ", "Bob", "Note3", "67890", "555555555", "wenz3", True, 2],
226 ],
227 ),
229 # Overlapping: norm and add have same tuple (should prefer add version)
230 (
231 [
232 ("100", datetime(2024, 6, 1, 14, 30), "FirmX", "Johnny", "Note", "12345", "123456789", "wenz1", None),
233 ],
234 [],
235 [
236 ("100", datetime(2024, 6, 1, 14, 30), "FirmX", "Johnny", "Note", "12345", "123456789", "wenz1", None),
237 ],
238 [
239 ["100", "14:30", "FirmX", "Johnny", "Note", "12345", "123456789", "wenz1", False, 2],
240 ],
241 ),
243 # Overlapping: del and add have same first 3 elements, should merge with HTML and remove from add
244 (
245 [
246 ("100", datetime(2024, 6, 1, 14, 30), "FirmX", "Johnny", "Note", "12345", "123456789", "wenz1", "1"),
247 ],
248 [
249 ("100", datetime(2024, 6, 1, 14, 30), "FirmX", "John", "Note", "12345", "", "wenz1", "1"),
250 ],
251 [
252 ("100", datetime(2024, 6, 1, 14, 30), "FirmX", "Johnny", "Note", "12345", "123456789", "wenz1", "1"),
253 ],
254 [
255 [
256 "100",
257 "14:30",
258 "FirmX",
259 '<span style="color: rgb(238, 36, 36); font-weight: bold; text-decoration: line-through;">John</span> <span style="color: rgb(0, 139, 7); font-weight: bold;">Johnny</span>',
260 "Note",
261 "12345",
262 '<span style="color: rgb(238, 36, 36); font-weight: bold; text-decoration: line-through;"></span> <span style="color: rgb(0, 139, 7); font-weight: bold;">123456789</span>',
263 "wenz1",
264 True,
265 0,
266 ]
267 ],
268 ),
271 ]
272 )
273 def test_get_list_from_three_norm_del_add(self, lista_norm, lista_del, lista_add, expected):
274 result = get_list_from_three_norm_del_add(lista_norm, lista_del, lista_add)
275 assert result == expected