feat(ui): single approve action merges the whole unit
Approve & Merge is now the only review+merge entry. For a parent with children it drives the unit merge via the worker (conflicts still surface through the existing PlanningMergeConflict dialog); the separate Merge All Subtasks button, MergeAllCommand, CanMergeAll plumbing, and the dead MergeAllPlanningAsync client method are removed. Combined-diff preview and conflict continue/abort are kept. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -78,72 +78,6 @@ public class DetailsIslandPlanningTests : IDisposable
|
||||
Task.FromException<MergeResultDto?>(new InvalidOperationException("Task is not waiting for review; cannot approve."));
|
||||
}
|
||||
|
||||
private static SubtaskRowViewModel MakeSubtask(TaskStatus status, WorktreeState wt = WorktreeState.Active) =>
|
||||
new() { Id = Guid.NewGuid().ToString(), Title = "t", Status = status, WorktreeState = wt };
|
||||
|
||||
// ── CanMergeAll tests exercising the real VM ─────────────────────────────
|
||||
|
||||
[Fact]
|
||||
public void CanMergeAll_AllChildrenDoneActiveWorktrees_True()
|
||||
{
|
||||
var vm = BuildVm(new FakeWorkerClient());
|
||||
vm.Subtasks.Add(MakeSubtask(TaskStatus.Done, WorktreeState.Active));
|
||||
vm.Subtasks.Add(MakeSubtask(TaskStatus.Done, WorktreeState.Active));
|
||||
|
||||
vm.RecomputeCanMergeAll();
|
||||
|
||||
Assert.True(vm.CanMergeAll);
|
||||
Assert.Null(vm.MergeAllDisabledReason);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void CanMergeAll_AnyChildNotDone_FalseWithReason()
|
||||
{
|
||||
var vm = BuildVm(new FakeWorkerClient());
|
||||
vm.Subtasks.Add(MakeSubtask(TaskStatus.Done, WorktreeState.Active));
|
||||
vm.Subtasks.Add(MakeSubtask(TaskStatus.Done, WorktreeState.Active));
|
||||
vm.Subtasks.Add(MakeSubtask(TaskStatus.Running, WorktreeState.Active));
|
||||
|
||||
vm.RecomputeCanMergeAll();
|
||||
|
||||
Assert.False(vm.CanMergeAll);
|
||||
Assert.NotNull(vm.MergeAllDisabledReason);
|
||||
Assert.Contains("1 subtask", vm.MergeAllDisabledReason, StringComparison.OrdinalIgnoreCase);
|
||||
Assert.Contains("not done", vm.MergeAllDisabledReason, StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void CanMergeAll_AnyChildDiscarded_FalseWithReason()
|
||||
{
|
||||
var vm = BuildVm(new FakeWorkerClient());
|
||||
vm.Subtasks.Add(MakeSubtask(TaskStatus.Done, WorktreeState.Active));
|
||||
vm.Subtasks.Add(MakeSubtask(TaskStatus.Done, WorktreeState.Discarded));
|
||||
|
||||
vm.RecomputeCanMergeAll();
|
||||
|
||||
Assert.False(vm.CanMergeAll);
|
||||
Assert.NotNull(vm.MergeAllDisabledReason);
|
||||
Assert.True(
|
||||
vm.MergeAllDisabledReason!.Contains("discarded", StringComparison.OrdinalIgnoreCase) ||
|
||||
vm.MergeAllDisabledReason.Contains("kept", StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void CanMergeAll_AnyChildKept_FalseWithReason()
|
||||
{
|
||||
var vm = BuildVm(new FakeWorkerClient());
|
||||
vm.Subtasks.Add(MakeSubtask(TaskStatus.Done, WorktreeState.Active));
|
||||
vm.Subtasks.Add(MakeSubtask(TaskStatus.Done, WorktreeState.Kept));
|
||||
|
||||
vm.RecomputeCanMergeAll();
|
||||
|
||||
Assert.False(vm.CanMergeAll);
|
||||
Assert.NotNull(vm.MergeAllDisabledReason);
|
||||
Assert.True(
|
||||
vm.MergeAllDisabledReason!.Contains("kept", StringComparison.OrdinalIgnoreCase) ||
|
||||
vm.MergeAllDisabledReason.Contains("discarded", StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
|
||||
// ── Review-action resilience: a failing hub call must not crash the app ───
|
||||
|
||||
[Fact]
|
||||
|
||||
Reference in New Issue
Block a user