@@ -33,9 +33,9 @@ func TestFindMergedCandidatesFound(t *testing.T) {
3333 "HEAD abc123" ,
3434 "branch refs/heads/main" ,
3535 "" ,
36- "worktree " + pathWtDone ,
36+ wtDone ,
3737 "HEAD def456" ,
38- "branch refs/heads/" + branchDone ,
38+ branchRefPrefix + branchDone ,
3939 "" ,
4040 "worktree /wt/feature-active" ,
4141 "HEAD ghi789" ,
@@ -44,9 +44,35 @@ func TestFindMergedCandidatesFound(t *testing.T) {
4444 }, "\n " )
4545
4646 r := mergedWorktreeRunner (" " + branchDone + "\n bugfix/old" , worktreeOut )
47- candidates , err := findMergedCandidates (r , branchMain )
47+ candidates , err := findMergedCandidates (r , branchMain , branchMain )
4848 if err != nil {
49- t .Fatalf ("findMergedCandidates: %v" , err )
49+ t .Fatalf (fatalFindMerged , err )
50+ }
51+ if len (candidates ) != 1 {
52+ t .Fatalf ("got %d candidates, want 1" , len (candidates ))
53+ }
54+ if candidates [0 ].branch != branchDone {
55+ t .Errorf ("branch = %q, want %q" , candidates [0 ].branch , branchDone )
56+ }
57+ }
58+
59+ func TestFindMergedCandidatesRemoteRef (t * testing.T ) {
60+ worktreeOut := strings .Join ([]string {
61+ wtRepo ,
62+ headABC123 ,
63+ branchRefMain ,
64+ "" ,
65+ wtDone ,
66+ headDEF456 ,
67+ branchRefPrefix + branchDone ,
68+ "" ,
69+ }, "\n " )
70+
71+ // mergeRef differs from mainBranch — simulates post-fetch scenario
72+ r := mergedWorktreeRunner (" " + branchDone + "\n main" , worktreeOut )
73+ candidates , err := findMergedCandidates (r , "origin/" + branchMain , branchMain )
74+ if err != nil {
75+ t .Fatalf (fatalFindMerged , err )
5076 }
5177 if len (candidates ) != 1 {
5278 t .Fatalf ("got %d candidates, want 1" , len (candidates ))
@@ -58,9 +84,9 @@ func TestFindMergedCandidatesFound(t *testing.T) {
5884
5985func TestFindMergedCandidatesNone (t * testing.T ) {
6086 r := mergedWorktreeRunner ("" , wtRepo + headMainBlock )
61- candidates , err := findMergedCandidates (r , branchMain )
87+ candidates , err := findMergedCandidates (r , branchMain , branchMain )
6288 if err != nil {
63- t .Fatalf ("findMergedCandidates: %v" , err )
89+ t .Fatalf (fatalFindMerged , err )
6490 }
6591 if len (candidates ) != 0 {
6692 t .Errorf ("expected 0 candidates, got %d" , len (candidates ))
@@ -78,7 +104,7 @@ func TestFindMergedCandidatesError(t *testing.T) {
78104 runInDir : noopRunInDir ,
79105 }
80106
81- _ , err := findMergedCandidates (r , branchMain )
107+ _ , err := findMergedCandidates (r , branchMain , branchMain )
82108 if err == nil {
83109 t .Fatal (errExpected )
84110 }
@@ -98,50 +124,94 @@ func TestFindMergedCandidatesWorktreeError(t *testing.T) {
98124 runInDir : noopRunInDir ,
99125 }
100126
101- _ , err := findMergedCandidates (r , branchMain )
127+ _ , err := findMergedCandidates (r , branchMain , branchMain )
102128 if err == nil {
103129 t .Fatal ("expected error from ListWorktrees failure" )
104130 }
105131}
106132
107- func fetchFailRunner (topLevel , worktreeOut string ) * mockRunner {
108- return & mockRunner {
133+ func TestCleanMergedFetchFails (t * testing.T ) {
134+ worktreeOut := cleanMergedWorktreeOut ()
135+ cmd , buf := newCleanMergedCmd ()
136+ _ = cmd .Flags ().Set (flagForce , "true" )
137+
138+ var mergedRef string
139+ r := & mockRunner {
109140 run : func (args ... string ) (string , error ) {
110141 if len (args ) >= 2 && args [1 ] == cmdShowToplevel {
111- return topLevel , nil
142+ return t . TempDir () , nil
112143 }
113144 if args [0 ] == cmdSymbolicRef {
114145 return refsRemotesOriginMain , nil
115146 }
116- if len ( args ) >= 1 && args [0 ] == "fetch" {
147+ if args [0 ] == cmdFetch {
117148 return "" , errors .New ("no remote" )
118149 }
119- if len (args ) >= 1 && args [0 ] == cmdBranch {
150+ if args [0 ] == cmdBranch {
151+ mergedRef = args [len (args )- 1 ]
120152 return "" , nil
121153 }
122- if len ( args ) >= 1 && args [0 ] == cmdWorktreeTest {
154+ if args [0 ] == cmdWorktreeTest {
123155 return worktreeOut , nil
124156 }
125157 return "" , nil
126158 },
127159 runInDir : noopRunInDir ,
128160 }
161+
162+ err := cleanMerged (cmd , r )
163+ if err != nil {
164+ t .Fatalf (fatalCleanMerged , err )
165+ }
166+ out := buf .String ()
167+ if ! strings .Contains (out , "Warning: fetch failed" ) {
168+ t .Errorf ("expected fetch warning, got %q" , out )
169+ }
170+ if mergedRef != branchMain {
171+ t .Errorf ("merged ref = %q, want %q (local fallback)" , mergedRef , branchMain )
172+ }
129173}
130174
131- func TestCleanMergedFetchFails (t * testing.T ) {
175+ func TestCleanMergedFetchSucceeds (t * testing.T ) {
132176 worktreeOut := cleanMergedWorktreeOut ()
133177 cmd , buf := newCleanMergedCmd ()
134178 _ = cmd .Flags ().Set (flagForce , "true" )
135179
136- r := fetchFailRunner (t .TempDir (), worktreeOut )
180+ var mergedRef string
181+ r := & mockRunner {
182+ run : func (args ... string ) (string , error ) {
183+ if len (args ) >= 2 && args [1 ] == cmdShowToplevel {
184+ return t .TempDir (), nil
185+ }
186+ if args [0 ] == cmdSymbolicRef {
187+ return refsRemotesOriginMain , nil
188+ }
189+ if args [0 ] == cmdFetch {
190+ return "" , nil // fetch succeeds
191+ }
192+ if args [0 ] == cmdBranch {
193+ mergedRef = args [len (args )- 1 ]
194+ return "" , nil
195+ }
196+ if args [0 ] == cmdWorktreeTest {
197+ return worktreeOut , nil
198+ }
199+ return "" , nil
200+ },
201+ runInDir : noopRunInDir ,
202+ }
137203
138204 err := cleanMerged (cmd , r )
139205 if err != nil {
140206 t .Fatalf (fatalCleanMerged , err )
141207 }
142208 out := buf .String ()
143- if ! strings .Contains (out , "Warning: fetch failed" ) {
144- t .Errorf ("expected fetch warning, got %q" , out )
209+ if strings .Contains (out , "Warning: fetch failed" ) {
210+ t .Errorf ("unexpected fetch warning in output: %q" , out )
211+ }
212+ wantRef := "origin/" + branchMain
213+ if mergedRef != wantRef {
214+ t .Errorf ("merged ref = %q, want %q" , mergedRef , wantRef )
145215 }
146216}
147217
@@ -343,7 +413,7 @@ func cleanMergedTestRunner(t *testing.T, mergedOut, worktreeOut string) *mockRun
343413 if len (args ) >= 1 && args [0 ] == cmdWorktreeTest {
344414 return worktreeOut , nil
345415 }
346- if len (args ) >= 1 && args [0 ] == "fetch" {
416+ if len (args ) >= 1 && args [0 ] == cmdFetch {
347417 return "" , errors .New ("no remote" )
348418 }
349419 return "" , nil
@@ -366,9 +436,9 @@ func cleanMergedWorktreeOut() string {
366436 "HEAD abc123" ,
367437 "branch refs/heads/main" ,
368438 "" ,
369- "worktree " + pathWtDone ,
439+ wtDone ,
370440 "HEAD def456" ,
371- "branch refs/heads/" + branchDone ,
441+ branchRefPrefix + branchDone ,
372442 "" ,
373443 }, "\n " )
374444}
0 commit comments