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