Skip to content

Commit b4929b2

Browse files
committed
Adding tests
1 parent f9e3fdf commit b4929b2

8 files changed

Lines changed: 744 additions & 48 deletions

File tree

file_utils.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -239,17 +239,15 @@ def load_linked_resources(template_dirs: list[str], resources_list):
239239
content = open_from(template_dirs, file_name)
240240

241241
if content is None:
242-
raise FileNotFoundError(
243-
f"""
242+
raise FileNotFoundError(f"""
244243
Resource file {file_name} not found. Resource files are searched in the following order (highest to lowest precedence):
245244
246245
1. The directory containing your .plain file
247246
2. The directory specified by --template-dir (if provided)
248247
3. The built-in 'standard_template_library' directory
249248
250249
Please ensure that the resource exists in one of these locations, or specify the correct --template-dir if using custom templates.
251-
"""
252-
)
250+
""")
253251

254252
linked_resources[file_name] = content
255253

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
***implementation reqs***
2+
3+
- Leaf implementation requirement.
4+
5+
***functional specs***
6+
7+
- Leaf functionality one.
8+
9+
- Leaf functionality two.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
---
2+
requires:
3+
- pr_leaf
4+
---
5+
6+
***implementation reqs***
7+
8+
- Middle implementation requirement.
9+
10+
***functional specs***
11+
12+
- Middle functionality one.
13+
14+
- Middle functionality two.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
---
2+
requires:
3+
- pr_middle
4+
---
5+
6+
***implementation reqs***
7+
8+
- Root implementation requirement.
9+
10+
***functional specs***
11+
12+
- Root functionality one.
13+
14+
- Root functionality two.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
***implementation reqs***
2+
3+
- Solo implementation requirement.
4+
5+
***functional specs***
6+
7+
- Solo functionality one.
8+
9+
- Solo functionality two.
10+
11+
- Solo functionality three.

tests/test_git_utils.py

Lines changed: 93 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
REFACTORED_CODE_COMMIT_MESSAGE,
1313
add_all_files_and_commit,
1414
diff,
15+
get_last_finished_frid,
1516
init_git_repo,
1617
revert_changes,
1718
revert_to_commit_with_frid,
@@ -63,17 +64,15 @@ def test_single_file_change(temp_repo):
6364
result = diff(temp_repo, "1.1")
6465

6566
assert "test.txt" in result
66-
expected_diff = dedent(
67-
"""
67+
expected_diff = dedent("""
6868
--- a/test.txt
6969
+++ b/test.txt
7070
@@ -1,3 +1,3 @@
7171
-initial content
7272
+modified content
7373
line2
7474
line3
75-
"""
76-
).strip()
75+
""").strip()
7776
assert result["test.txt"] == expected_diff
7877

7978

@@ -98,31 +97,27 @@ def test_multiple_file_changes(temp_repo):
9897

9998
# Check first file
10099
assert "test.txt" in result
101-
expected_diff1 = dedent(
102-
"""
100+
expected_diff1 = dedent("""
103101
--- a/test.txt
104102
+++ b/test.txt
105103
@@ -1,3 +1,2 @@
106104
-initial content
107105
+file1 modified
108106
line2
109107
-line3
110-
"""
111-
).strip()
108+
""").strip()
112109
assert result["test.txt"] == expected_diff1
113110

114111
# Check second file
115112
assert "file2.txt" in result
116-
expected_diff2 = dedent(
117-
"""
113+
expected_diff2 = dedent("""
118114
--- /dev/null
119115
+++ b/file2.txt
120116
@@ -0,0 +1,2 @@
121117
+file2 modified
122118
+line2
123119
\\ No newline at end of file
124-
"""
125-
).strip()
120+
""").strip()
126121
assert result["file2.txt"] == expected_diff2
127122

128123

@@ -157,44 +152,38 @@ def test_multiple_commits_diff(temp_repo):
157152

158153
# Check first file
159154
assert "test.txt" in result
160-
expected_diff1 = dedent(
161-
"""
155+
expected_diff1 = dedent("""
162156
--- a/test.txt
163157
+++ b/test.txt
164158
@@ -1,3 +1,2 @@
165159
-initial content
166160
+file1 frid1.2 refactored version
167161
line2
168162
-line3
169-
"""
170-
).strip()
163+
""").strip()
171164
assert result["test.txt"] == expected_diff1
172165

173166
# Check second file
174167
assert "file2.txt" in result
175-
expected_diff2 = dedent(
176-
"""
168+
expected_diff2 = dedent("""
177169
--- a/file2.txt
178170
+++ b/file2.txt
179171
@@ -1,2 +1,2 @@
180172
-file2 frid1.1 refactored version
181173
+file2 frid1.2 version
182174
line2
183-
"""
184-
).strip()
175+
""").strip()
185176
assert result["file2.txt"] == expected_diff2
186177

187178
# Check third file
188179
assert "file3.txt" in result
189-
expected_diff3 = dedent(
190-
"""
180+
expected_diff3 = dedent("""
191181
--- /dev/null
192182
+++ b/file3.txt
193183
@@ -0,0 +1,2 @@
194184
+file3 frid1.2 new file
195185
+line2
196-
"""
197-
).strip()
186+
""").strip()
198187
assert result["file3.txt"] == expected_diff3
199188

200189

@@ -213,27 +202,23 @@ def test_diff_without_previous_frid_and_no_base_folder(empty_repo):
213202
result = diff(empty_repo)
214203

215204
assert "new.txt" in result
216-
expected_diff = dedent(
217-
"""
205+
expected_diff = dedent("""
218206
--- /dev/null
219207
+++ b/new.txt
220208
@@ -0,0 +1,2 @@
221209
+new file content
222210
+line2
223-
"""
224-
).strip()
211+
""").strip()
225212
assert result["new.txt"] == expected_diff
226213

227214
assert "new2.txt" in result
228-
expected_diff2 = dedent(
229-
"""
215+
expected_diff2 = dedent("""
230216
--- /dev/null
231217
+++ b/new2.txt
232218
@@ -0,0 +1,2 @@
233219
+new file content
234220
+line2
235-
"""
236-
).strip()
221+
""").strip()
237222
assert result["new2.txt"] == expected_diff2
238223

239224

@@ -251,16 +236,14 @@ def test_diff_without_previous_frid_and_base_folder(temp_repo):
251236
result = diff(temp_repo)
252237

253238
assert "new.txt" in result
254-
expected_diff = dedent(
255-
"""
239+
expected_diff = dedent("""
256240
--- a/new.txt
257241
+++ b/new.txt
258242
@@ -1,2 +1,2 @@
259243
-base folder content
260244
+updated base folder content
261245
line2
262-
"""
263-
).strip()
246+
""").strip()
264247
assert result["new.txt"] == expected_diff
265248

266249

@@ -276,15 +259,13 @@ def test_new_file(temp_repo):
276259
result = diff(temp_repo, "1.1")
277260

278261
assert "new.txt" in result
279-
expected_diff = dedent(
280-
"""
262+
expected_diff = dedent("""
281263
--- /dev/null
282264
+++ b/new.txt
283265
@@ -0,0 +1,2 @@
284266
+new file content
285267
+line2
286-
"""
287-
).strip()
268+
""").strip()
288269
assert result["new.txt"] == expected_diff
289270

290271

@@ -300,16 +281,14 @@ def test_deleted_file(temp_repo):
300281
result = diff(temp_repo, "1.1")
301282

302283
assert "test.txt" in result
303-
expected_diff = dedent(
304-
"""
284+
expected_diff = dedent("""
305285
--- a/test.txt
306286
+++ /dev/null
307287
@@ -1,3 +0,0 @@
308288
-initial content
309289
-line2
310290
-line3
311-
"""
312-
).strip()
291+
""").strip()
313292
assert result["test.txt"] == expected_diff
314293

315294

@@ -456,3 +435,73 @@ def test_revert_to_base_folder_no_commit(temp_repo):
456435
assert repo.active_branch.name == "main"
457436
assert len(list(repo.iter_commits())) == 1 # initial commit
458437
assert not file_path.exists()
438+
439+
440+
def test_get_last_finished_frid_non_existent_path():
441+
"""Return (None, None) when the repo path doesn't exist."""
442+
assert get_last_finished_frid("/path/that/does/not/exist") == (None, None)
443+
444+
445+
def test_get_last_finished_frid_empty_repo(empty_repo):
446+
"""Return (None, None) when no FRID-finished commit exists."""
447+
assert get_last_finished_frid(empty_repo) == (None, None)
448+
449+
450+
def test_get_last_finished_frid_returns_latest(empty_repo):
451+
"""Return the module name and frid from the most recent finished-frid commit."""
452+
file_path = Path(empty_repo) / "a.txt"
453+
file_path.write_text("v1")
454+
add_all_files_and_commit(
455+
empty_repo,
456+
FUNCTIONAL_REQUIREMENT_FINISHED_COMMIT_MESSAGE.format("1"),
457+
module_name="module_a",
458+
frid="1",
459+
)
460+
461+
file_path.write_text("v2")
462+
add_all_files_and_commit(
463+
empty_repo,
464+
FUNCTIONAL_REQUIREMENT_FINISHED_COMMIT_MESSAGE.format("2"),
465+
module_name="module_a",
466+
frid="2",
467+
)
468+
469+
assert get_last_finished_frid(empty_repo) == ("module_a", "2")
470+
471+
472+
def test_get_last_finished_frid_ignores_non_finished_commits(empty_repo):
473+
"""Commits that aren't finished-frid checkpoints must be skipped."""
474+
file_path = Path(empty_repo) / "a.txt"
475+
file_path.write_text("v1")
476+
add_all_files_and_commit(
477+
empty_repo,
478+
FUNCTIONAL_REQUIREMENT_FINISHED_COMMIT_MESSAGE.format("1"),
479+
module_name="module_a",
480+
frid="1",
481+
)
482+
483+
# A refactor commit (not a finished-frid checkpoint) comes after.
484+
file_path.write_text("v2")
485+
add_all_files_and_commit(
486+
empty_repo,
487+
REFACTORED_CODE_COMMIT_MESSAGE.format("2"),
488+
module_name="module_a",
489+
frid="2",
490+
)
491+
492+
# The last *finished* FRID is still 1
493+
assert get_last_finished_frid(empty_repo) == ("module_a", "1")
494+
495+
496+
def test_get_last_finished_frid_without_module_name(empty_repo):
497+
"""If the commit omits the module name line, return None for the module."""
498+
file_path = Path(empty_repo) / "a.txt"
499+
file_path.write_text("v1")
500+
add_all_files_and_commit(
501+
empty_repo,
502+
FUNCTIONAL_REQUIREMENT_FINISHED_COMMIT_MESSAGE.format("7"),
503+
module_name=None,
504+
frid="7",
505+
)
506+
507+
assert get_last_finished_frid(empty_repo) == (None, "7")

0 commit comments

Comments
 (0)