feat(worktrees): add GetOverviewAsync for overview modal
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -250,4 +250,124 @@ public class WorktreeMaintenanceServiceTests : IDisposable
|
||||
Assert.Single(remaining);
|
||||
Assert.Equal(taskB.Id, remaining[0].TaskId);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetOverview_Returns_All_When_ListId_Null()
|
||||
{
|
||||
if (!GitAvailable) { Assert.True(true, "git not available -- skipping"); return; }
|
||||
|
||||
var repo = NewRepo();
|
||||
var git = new GitService();
|
||||
var db = NewDb();
|
||||
|
||||
var (listA, taskA) = MakeEntities(repo.RepoDir);
|
||||
var (listB, taskB) = MakeEntities(repo.RepoDir);
|
||||
var wtA = await CreateWorktreeAsync(git, repo.RepoDir, taskA.Id);
|
||||
var wtB = await CreateWorktreeAsync(git, repo.RepoDir, taskB.Id);
|
||||
|
||||
using (var ctx = db.CreateContext())
|
||||
{
|
||||
await new ListRepository(ctx).AddAsync(listA);
|
||||
await new ListRepository(ctx).AddAsync(listB);
|
||||
await new TaskRepository(ctx).AddAsync(taskA);
|
||||
await new TaskRepository(ctx).AddAsync(taskB);
|
||||
var wtRepo = new WorktreeRepository(ctx);
|
||||
await wtRepo.AddAsync(new WorktreeEntity
|
||||
{
|
||||
TaskId = taskA.Id, Path = wtA, BranchName = $"test/{taskA.Id}",
|
||||
BaseCommit = repo.BaseCommit, State = WorktreeState.Active, CreatedAt = DateTime.UtcNow,
|
||||
});
|
||||
await wtRepo.AddAsync(new WorktreeEntity
|
||||
{
|
||||
TaskId = taskB.Id, Path = wtB, BranchName = $"test/{taskB.Id}",
|
||||
BaseCommit = repo.BaseCommit, State = WorktreeState.Merged, CreatedAt = DateTime.UtcNow,
|
||||
});
|
||||
}
|
||||
|
||||
var svc = new WorktreeMaintenanceService(
|
||||
db.CreateFactory(), git, NullLogger<WorktreeMaintenanceService>.Instance);
|
||||
|
||||
var rows = await svc.GetOverviewAsync(null, CancellationToken.None);
|
||||
|
||||
Assert.Equal(2, rows.Count);
|
||||
Assert.Contains(rows, r => r.TaskId == taskA.Id && r.PathExistsOnDisk);
|
||||
Assert.Contains(rows, r => r.TaskId == taskB.Id && r.PathExistsOnDisk);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetOverview_Filters_By_ListId()
|
||||
{
|
||||
if (!GitAvailable) { Assert.True(true, "git not available -- skipping"); return; }
|
||||
|
||||
var repo = NewRepo();
|
||||
var git = new GitService();
|
||||
var db = NewDb();
|
||||
|
||||
var (listA, taskA) = MakeEntities(repo.RepoDir);
|
||||
var (listB, taskB) = MakeEntities(repo.RepoDir);
|
||||
var wtA = await CreateWorktreeAsync(git, repo.RepoDir, taskA.Id);
|
||||
var wtB = await CreateWorktreeAsync(git, repo.RepoDir, taskB.Id);
|
||||
|
||||
using (var ctx = db.CreateContext())
|
||||
{
|
||||
await new ListRepository(ctx).AddAsync(listA);
|
||||
await new ListRepository(ctx).AddAsync(listB);
|
||||
await new TaskRepository(ctx).AddAsync(taskA);
|
||||
await new TaskRepository(ctx).AddAsync(taskB);
|
||||
var wtRepo = new WorktreeRepository(ctx);
|
||||
await wtRepo.AddAsync(new WorktreeEntity
|
||||
{
|
||||
TaskId = taskA.Id, Path = wtA, BranchName = $"test/{taskA.Id}",
|
||||
BaseCommit = repo.BaseCommit, State = WorktreeState.Active, CreatedAt = DateTime.UtcNow,
|
||||
});
|
||||
await wtRepo.AddAsync(new WorktreeEntity
|
||||
{
|
||||
TaskId = taskB.Id, Path = wtB, BranchName = $"test/{taskB.Id}",
|
||||
BaseCommit = repo.BaseCommit, State = WorktreeState.Active, CreatedAt = DateTime.UtcNow,
|
||||
});
|
||||
}
|
||||
|
||||
var svc = new WorktreeMaintenanceService(
|
||||
db.CreateFactory(), git, NullLogger<WorktreeMaintenanceService>.Instance);
|
||||
|
||||
var rows = await svc.GetOverviewAsync(listA.Id, CancellationToken.None);
|
||||
|
||||
Assert.Single(rows);
|
||||
Assert.Equal(taskA.Id, rows[0].TaskId);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetOverview_Flags_PathExistsOnDisk_False_For_Phantom_Row()
|
||||
{
|
||||
if (!GitAvailable) { Assert.True(true, "git not available -- skipping"); return; }
|
||||
|
||||
var repo = NewRepo();
|
||||
var git = new GitService();
|
||||
var db = NewDb();
|
||||
|
||||
var (list, task) = MakeEntities(repo.RepoDir);
|
||||
var wt = await CreateWorktreeAsync(git, repo.RepoDir, task.Id);
|
||||
|
||||
try { await git.WorktreeRemoveAsync(repo.RepoDir, wt, force: true); } catch { }
|
||||
if (Directory.Exists(wt)) Directory.Delete(wt, recursive: true);
|
||||
|
||||
using (var ctx = db.CreateContext())
|
||||
{
|
||||
await new ListRepository(ctx).AddAsync(list);
|
||||
await new TaskRepository(ctx).AddAsync(task);
|
||||
await new WorktreeRepository(ctx).AddAsync(new WorktreeEntity
|
||||
{
|
||||
TaskId = task.Id, Path = wt, BranchName = $"test/{task.Id}",
|
||||
BaseCommit = repo.BaseCommit, State = WorktreeState.Active, CreatedAt = DateTime.UtcNow,
|
||||
});
|
||||
}
|
||||
|
||||
var svc = new WorktreeMaintenanceService(
|
||||
db.CreateFactory(), git, NullLogger<WorktreeMaintenanceService>.Instance);
|
||||
|
||||
var rows = await svc.GetOverviewAsync(null, CancellationToken.None);
|
||||
|
||||
Assert.Single(rows);
|
||||
Assert.False(rows[0].PathExistsOnDisk);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user