using System.Collections.Generic; using ClaudeDo.Data.Models; using ClaudeDo.Ui.ViewModels.Islands; using Xunit; using TaskStatus = ClaudeDo.Data.Models.TaskStatus; namespace ClaudeDo.Worker.Tests.UiVm; public class TaskRowViewModelTests { [Theory] [InlineData(TaskStatus.Running, "running")] [InlineData(TaskStatus.WaitingForReview, "review")] [InlineData(TaskStatus.Failed, "error")] [InlineData(TaskStatus.Done, "done")] [InlineData(TaskStatus.Queued, "queued")] [InlineData(TaskStatus.Idle, "idle")] public void StatusChipClass_Maps_Correctly(TaskStatus s, string expected) { var vm = new TaskRowViewModel { Id = "t" }; vm.Status = s; Assert.Equal(expected, vm.StatusChipClass); } [Fact] public void Number_SetFromEntity_SurvivesUpdateFromEntity() { var entity = new TaskEntity { Id = "t", ListId = "l1", Title = "Task", Number = 123, CreatedAt = DateTime.UtcNow, }; var vm = TaskRowViewModel.FromEntity(entity); Assert.Equal(123, vm.Number); // Simulates the TaskUpdated refresh path: the entity is re-fetched and the same // row is updated in place rather than replaced. entity.Title = "Task (edited)"; vm.UpdateFromEntity(entity); Assert.Equal(123, vm.Number); } [Fact] public void IsDropTarget_Follows_Either_DropHint_And_Raises_PropertyChanged() { var vm = new TaskRowViewModel { Id = "t" }; var raised = new List(); vm.PropertyChanged += (_, e) => raised.Add(e.PropertyName); Assert.False(vm.IsDropTarget); vm.DropHintAbove = true; Assert.True(vm.IsDropTarget); Assert.Contains(nameof(TaskRowViewModel.IsDropTarget), raised); vm.DropHintAbove = false; vm.DropHintBelow = true; Assert.True(vm.IsDropTarget); vm.DropHintBelow = false; Assert.False(vm.IsDropTarget); } }