feat(claude-do): merge feat(ui): "Worktree öffnen" im Kontextmenü der Task-Zeile

ClaudeDo-Task: 9be17e29e0b54f42ba9385b0cebe89d5
This commit is contained in:
mika kuns
2026-08-21 18:14:45 +02:00
6 changed files with 92 additions and 2 deletions
@@ -64,6 +64,60 @@ public class TaskRowViewModelTests
Assert.Contains(nameof(TaskRowViewModel.ShowNumberBadge), raised);
}
[Fact]
public void CanOpenWorktree_True_And_ReasonNull_When_Path_Present()
{
var vm = new TaskRowViewModel { Id = "t" };
vm.WorktreePath = @"C:\repo\worktrees\t";
Assert.True(vm.CanOpenWorktree);
Assert.Null(vm.OpenWorktreeDisabledReason);
}
[Theory]
[InlineData(null)]
[InlineData("")]
[InlineData(" ")]
public void CanOpenWorktree_False_And_ReasonSet_When_Path_Missing(string? path)
{
var vm = new TaskRowViewModel { Id = "t" };
vm.WorktreePath = path;
Assert.False(vm.CanOpenWorktree);
Assert.NotNull(vm.OpenWorktreeDisabledReason);
}
[Fact]
public void OpenWorktreeGate_Raises_PropertyChanged_On_WorktreePath_Change()
{
var vm = new TaskRowViewModel { Id = "t" };
var raised = new List<string?>();
vm.PropertyChanged += (_, e) => raised.Add(e.PropertyName);
vm.WorktreePath = @"C:\repo\worktrees\t";
Assert.Contains(nameof(TaskRowViewModel.CanOpenWorktree), raised);
Assert.Contains(nameof(TaskRowViewModel.OpenWorktreeDisabledReason), raised);
}
[Fact]
public void WorktreePath_SetFromEntity_MapsFromWorktreePath()
{
var entity = new TaskEntity
{
Id = "t", ListId = "l1", Title = "Task", CreatedAt = DateTime.UtcNow,
Worktree = new WorktreeEntity
{
TaskId = "t", Path = @"C:\repo\worktrees\t", BranchName = "b",
BaseCommit = "abc123", CreatedAt = DateTime.UtcNow,
},
};
var vm = TaskRowViewModel.FromEntity(entity);
Assert.Equal(@"C:\repo\worktrees\t", vm.WorktreePath);
Assert.True(vm.CanOpenWorktree);
}
[Fact]
public void IsDropTarget_Follows_Either_DropHint_And_Raises_PropertyChanged()
{