feat(ui): "Worktree öffnen" im Kontextmenü der Task-Zeile
Group 1 of the task-row context menu gets a fourth gated entry, right after "Open interactive session": it opens the task's worktree folder via Process.Start/UseShellExecute, mirroring ListsIslandViewModel's OpenInExplorer. Missing worktree greys the item out with a tooltip reason instead of hiding it, keeping Group 1's fixed length. Failures report through TasksIslandViewModel.ErrorReported (footer strip), not a silent catch.
This commit is contained in:
@@ -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()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user