@@ -10,6 +10,8 @@ const (
1010 cmdList = "list"
1111
1212 branchListArchived = "main\n feature/archived-task\n feature/active-task"
13+
14+ wtListMainOnly = "worktree /repo\n HEAD abc\n branch refs/heads/main\n "
1315)
1416
1517func TestFindArchivedBranch (t * testing.T ) {
@@ -27,7 +29,7 @@ func TestFindArchivedBranch(t *testing.T) {
2729 runInDir : noopRunInDir ,
2830 }
2931
30- branch , err := FindArchivedBranch (mr , "archived-task" )
32+ branch , err := FindArchivedBranch (mr , "" , " archived-task" )
3133 if err != nil {
3234 t .Fatalf ("FindArchivedBranch: %v" , err )
3335 }
@@ -51,7 +53,7 @@ func TestFindArchivedBranchNotFound(t *testing.T) {
5153 runInDir : noopRunInDir ,
5254 }
5355
54- _ , err := FindArchivedBranch (mr , "nonexistent" )
56+ _ , err := FindArchivedBranch (mr , "" , " nonexistent" )
5557 if err == nil {
5658 t .Fatal ("expected error for nonexistent archived branch" )
5759 }
@@ -64,14 +66,14 @@ func TestFindArchivedBranchExactMatch(t *testing.T) {
6466 case args [0 ] == cmdBranch :
6567 return "main\n my-custom-branch" , nil
6668 case args [0 ] == cmdWorktreeTest && args [1 ] == cmdList :
67- return "worktree /repo \n HEAD abc \n branch refs/heads/main \n " , nil
69+ return wtListMainOnly , nil
6870 }
6971 return "" , nil
7072 },
7173 runInDir : noopRunInDir ,
7274 }
7375
74- branch , err := FindArchivedBranch (mr , "my-custom-branch" )
76+ branch , err := FindArchivedBranch (mr , "" , " my-custom-branch" )
7577 if err != nil {
7678 t .Fatalf ("FindArchivedBranch: %v" , err )
7779 }
@@ -87,14 +89,14 @@ func TestFindArchivedBranchByTaskExtraction(t *testing.T) {
8789 case args [0 ] == cmdBranch :
8890 return "main\n bugfix/some-task" , nil
8991 case args [0 ] == cmdWorktreeTest && args [1 ] == cmdList :
90- return "worktree /repo \n HEAD abc \n branch refs/heads/main \n " , nil
92+ return wtListMainOnly , nil
9193 }
9294 return "" , nil
9395 },
9496 runInDir : noopRunInDir ,
9597 }
9698
97- branch , err := FindArchivedBranch (mr , "some-task" )
99+ branch , err := FindArchivedBranch (mr , "" , " some-task" )
98100 if err != nil {
99101 t .Fatalf ("FindArchivedBranch: %v" , err )
100102 }
@@ -121,7 +123,7 @@ func TestFindArchivedBranchExactMatchSkipsActive(t *testing.T) {
121123 runInDir : noopRunInDir ,
122124 }
123125
124- branch , err := FindArchivedBranch (mr , "my-task" )
126+ branch , err := FindArchivedBranch (mr , "" , " my-task" )
125127 if err != nil {
126128 t .Fatalf ("FindArchivedBranch: %v" , err )
127129 }
@@ -148,7 +150,7 @@ func TestFindArchivedBranchPrefixMatchSkipsActive(t *testing.T) {
148150 runInDir : noopRunInDir ,
149151 }
150152
151- branch , err := FindArchivedBranch (mr , "task-x" )
153+ branch , err := FindArchivedBranch (mr , "" , " task-x" )
152154 if err != nil {
153155 t .Fatalf ("FindArchivedBranch: %v" , err )
154156 }
@@ -175,7 +177,7 @@ func TestFindArchivedBranchSkipsActiveInFallback(t *testing.T) {
175177 runInDir : noopRunInDir ,
176178 }
177179
178- _ , err := FindArchivedBranch (mr , "some-task" )
180+ _ , err := FindArchivedBranch (mr , "" , " some-task" )
179181 if err == nil {
180182 t .Fatal ("expected error when only matching branch is active" )
181183 }
@@ -192,7 +194,7 @@ func TestFindArchivedBranchError(t *testing.T) {
192194 runInDir : noopRunInDir ,
193195 }
194196
195- _ , err := FindArchivedBranch (mr , "any" )
197+ _ , err := FindArchivedBranch (mr , "" , " any" )
196198 if err == nil {
197199 t .Fatal ("expected error from LocalBranches failure" )
198200 }
@@ -212,7 +214,7 @@ func TestFindArchivedBranchWorktreeError(t *testing.T) {
212214 runInDir : noopRunInDir ,
213215 }
214216
215- _ , err := FindArchivedBranch (mr , "task" )
217+ _ , err := FindArchivedBranch (mr , "" , " task" )
216218 if err == nil {
217219 t .Fatal ("expected error from ListWorktrees failure" )
218220 }
@@ -281,3 +283,93 @@ func TestListArchivedBranchesWorktreeError(t *testing.T) {
281283 t .Fatal ("expected error from ListWorktrees failure" )
282284 }
283285}
286+
287+ func TestFindArchivedBranchMonorepoByPrefix (t * testing.T ) {
288+ mr := & mockRunner {
289+ run : func (args ... string ) (string , error ) {
290+ switch {
291+ case args [0 ] == cmdBranch :
292+ return "main\n auth-api/feature/login" , nil
293+ case args [0 ] == cmdWorktreeTest && args [1 ] == cmdList :
294+ return wtListMainOnly , nil
295+ }
296+ return "" , nil
297+ },
298+ runInDir : noopRunInDir ,
299+ }
300+
301+ branch , err := FindArchivedBranch (mr , "auth-api" , "login" )
302+ if err != nil {
303+ t .Fatalf ("FindArchivedBranch: %v" , err )
304+ }
305+ if branch != "auth-api/feature/login" {
306+ t .Errorf ("branch = %q, want %q" , branch , "auth-api/feature/login" )
307+ }
308+ }
309+
310+ func TestFindArchivedBranchMonorepoByTaskExtraction (t * testing.T ) {
311+ mr := & mockRunner {
312+ run : func (args ... string ) (string , error ) {
313+ switch {
314+ case args [0 ] == cmdBranch :
315+ return "main\n auth-api/bugfix/login" , nil
316+ case args [0 ] == cmdWorktreeTest && args [1 ] == cmdList :
317+ return wtListMainOnly , nil
318+ }
319+ return "" , nil
320+ },
321+ runInDir : noopRunInDir ,
322+ }
323+
324+ branch , err := FindArchivedBranch (mr , "auth-api" , "login" )
325+ if err != nil {
326+ t .Fatalf ("FindArchivedBranch: %v" , err )
327+ }
328+ if branch != "auth-api/bugfix/login" {
329+ t .Errorf ("branch = %q, want %q" , branch , "auth-api/bugfix/login" )
330+ }
331+ }
332+
333+ func TestFindArchivedBranchMonorepoWrongServiceNoMatch (t * testing.T ) {
334+ mr := & mockRunner {
335+ run : func (args ... string ) (string , error ) {
336+ switch {
337+ case args [0 ] == cmdBranch :
338+ return "main\n web-api/feature/login" , nil
339+ case args [0 ] == cmdWorktreeTest && args [1 ] == cmdList :
340+ return wtListMainOnly , nil
341+ }
342+ return "" , nil
343+ },
344+ runInDir : noopRunInDir ,
345+ }
346+
347+ _ , err := FindArchivedBranch (mr , "auth-api" , "login" )
348+ if err == nil {
349+ t .Fatal ("expected error when service does not match" )
350+ }
351+ }
352+
353+ func TestFindArchivedBranchNonMonorepoRegression (t * testing.T ) {
354+ mr := & mockRunner {
355+ run : func (args ... string ) (string , error ) {
356+ switch {
357+ case args [0 ] == cmdBranch :
358+ return branchListArchived , nil
359+ case args [0 ] == cmdWorktreeTest && args [1 ] == cmdList :
360+ return "worktree /repo\n HEAD abc\n branch refs/heads/main\n \n " +
361+ "worktree /wt/feature-active-task\n HEAD abc\n branch refs/heads/feature/active-task\n " , nil
362+ }
363+ return "" , nil
364+ },
365+ runInDir : noopRunInDir ,
366+ }
367+
368+ branch , err := FindArchivedBranch (mr , "" , "archived-task" )
369+ if err != nil {
370+ t .Fatalf ("FindArchivedBranch: %v" , err )
371+ }
372+ if branch != "feature/archived-task" {
373+ t .Errorf ("branch = %q, want %q" , branch , "feature/archived-task" )
374+ }
375+ }
0 commit comments