@@ -219,4 +219,136 @@ describe("WorktreeManager", () => {
219219 ) ;
220220 } ) ;
221221 } ) ;
222+
223+ describe ( "findWorktreeByName" , ( ) => {
224+ test ( "should find worktree by exact branch name" , async ( ) => {
225+ mockGit . raw . mockImplementation ( ( args ) => {
226+ if ( args [ 0 ] === "config" ) {
227+ return Promise . resolve ( "false" ) ;
228+ }
229+ if ( args [ 0 ] === "worktree" && args [ 1 ] === "list" ) {
230+ return Promise . resolve (
231+ "worktree /home/user/repo/main\n" +
232+ "HEAD abc123\n" +
233+ "branch refs/heads/main\n" +
234+ "\n" +
235+ "worktree /home/user/repo/feature-branch\n" +
236+ "HEAD def456\n" +
237+ "branch refs/heads/feature-branch\n"
238+ ) ;
239+ }
240+ return Promise . resolve ( "" ) ;
241+ } ) ;
242+ mockGit . status . mockImplementation ( ( ) =>
243+ Promise . resolve ( { isClean : ( ) => true } )
244+ ) ;
245+
246+ const result = await manager . findWorktreeByName ( "feature-branch" ) ;
247+
248+ expect ( result ) . toBeDefined ( ) ;
249+ expect ( result ?. branch ) . toBe ( "feature-branch" ) ;
250+ expect ( result ?. path ) . toBe ( "/home/user/repo/feature-branch" ) ;
251+ } ) ;
252+
253+ test ( "should find worktree by directory name" , async ( ) => {
254+ mockGit . raw . mockImplementation ( ( args ) => {
255+ if ( args [ 0 ] === "config" ) {
256+ return Promise . resolve ( "false" ) ;
257+ }
258+ if ( args [ 0 ] === "worktree" && args [ 1 ] === "list" ) {
259+ return Promise . resolve (
260+ "worktree /home/user/repo/my-worktree\n" +
261+ "HEAD abc123\n" +
262+ "branch refs/heads/feature/some-feature\n"
263+ ) ;
264+ }
265+ return Promise . resolve ( "" ) ;
266+ } ) ;
267+ mockGit . status . mockImplementation ( ( ) =>
268+ Promise . resolve ( { isClean : ( ) => true } )
269+ ) ;
270+
271+ const result = await manager . findWorktreeByName ( "my-worktree" ) ;
272+
273+ expect ( result ) . toBeDefined ( ) ;
274+ expect ( result ?. branch ) . toBe ( "feature/some-feature" ) ;
275+ expect ( result ?. path ) . toBe ( "/home/user/repo/my-worktree" ) ;
276+ } ) ;
277+
278+ test ( "should find worktree by partial branch name suffix" , async ( ) => {
279+ mockGit . raw . mockImplementation ( ( args ) => {
280+ if ( args [ 0 ] === "config" ) {
281+ return Promise . resolve ( "false" ) ;
282+ }
283+ if ( args [ 0 ] === "worktree" && args [ 1 ] === "list" ) {
284+ return Promise . resolve (
285+ "worktree /home/user/repo/feature/my-feature\n" +
286+ "HEAD abc123\n" +
287+ "branch refs/heads/feature/my-feature\n"
288+ ) ;
289+ }
290+ return Promise . resolve ( "" ) ;
291+ } ) ;
292+ mockGit . status . mockImplementation ( ( ) =>
293+ Promise . resolve ( { isClean : ( ) => true } )
294+ ) ;
295+
296+ const result = await manager . findWorktreeByName ( "my-feature" ) ;
297+
298+ expect ( result ) . toBeDefined ( ) ;
299+ expect ( result ?. branch ) . toBe ( "feature/my-feature" ) ;
300+ } ) ;
301+
302+ test ( "should return undefined when worktree not found" , async ( ) => {
303+ mockGit . raw . mockImplementation ( ( args ) => {
304+ if ( args [ 0 ] === "config" ) {
305+ return Promise . resolve ( "false" ) ;
306+ }
307+ if ( args [ 0 ] === "worktree" && args [ 1 ] === "list" ) {
308+ return Promise . resolve (
309+ "worktree /home/user/repo/main\n" +
310+ "HEAD abc123\n" +
311+ "branch refs/heads/main\n"
312+ ) ;
313+ }
314+ return Promise . resolve ( "" ) ;
315+ } ) ;
316+ mockGit . status . mockImplementation ( ( ) =>
317+ Promise . resolve ( { isClean : ( ) => true } )
318+ ) ;
319+
320+ const result = await manager . findWorktreeByName ( "non-existent" ) ;
321+
322+ expect ( result ) . toBeUndefined ( ) ;
323+ } ) ;
324+
325+ test ( "should prefer exact branch name match over directory name" , async ( ) => {
326+ mockGit . raw . mockImplementation ( ( args ) => {
327+ if ( args [ 0 ] === "config" ) {
328+ return Promise . resolve ( "false" ) ;
329+ }
330+ if ( args [ 0 ] === "worktree" && args [ 1 ] === "list" ) {
331+ return Promise . resolve (
332+ "worktree /home/user/repo/feature-branch\n" +
333+ "HEAD abc123\n" +
334+ "branch refs/heads/other-branch\n" +
335+ "\n" +
336+ "worktree /home/user/repo/other-dir\n" +
337+ "HEAD def456\n" +
338+ "branch refs/heads/feature-branch\n"
339+ ) ;
340+ }
341+ return Promise . resolve ( "" ) ;
342+ } ) ;
343+ mockGit . status . mockImplementation ( ( ) =>
344+ Promise . resolve ( { isClean : ( ) => true } )
345+ ) ;
346+
347+ const result = await manager . findWorktreeByName ( "feature-branch" ) ;
348+
349+ expect ( result ) . toBeDefined ( ) ;
350+ expect ( result ?. branch ) . toBe ( "feature-branch" ) ;
351+ expect ( result ?. path ) . toBe ( "/home/user/repo/other-dir" ) ;
352+ } ) ;
353+ } ) ;
222354} ) ;
0 commit comments