Merge claudedo/850c2e490711461a87467ca6743052e0
This commit is contained in:
@@ -162,6 +162,105 @@ public class MergeHelperSelectionModalViewModelTests : IDisposable
|
||||
Assert.True(closed);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Load_NestsChildUnderParent_InOrder()
|
||||
{
|
||||
await using (var db = NewContext())
|
||||
{
|
||||
db.Lists.Add(new ListEntity { Id = "L1", Name = "Work", CreatedAt = DateTime.UtcNow });
|
||||
db.Tasks.Add(new TaskEntity { Id = "parent", ListId = "L1", Title = "parent", Status = TaskStatus.Idle, CreatedAt = DateTime.UtcNow, SortOrder = 0 });
|
||||
db.Tasks.Add(new TaskEntity { Id = "sibling", ListId = "L1", Title = "sibling", Status = TaskStatus.Idle, CreatedAt = DateTime.UtcNow, SortOrder = 1 });
|
||||
db.Tasks.Add(new TaskEntity { Id = "child", ListId = "L1", Title = "child", Status = TaskStatus.Idle, CreatedAt = DateTime.UtcNow, SortOrder = 2, ParentTaskId = "parent" });
|
||||
await db.SaveChangesAsync();
|
||||
}
|
||||
|
||||
var vm = BuildVm();
|
||||
vm.Configure("L1", "Work");
|
||||
await vm.LoadAsync();
|
||||
|
||||
// Child is nested directly after its parent, ahead of the later sibling.
|
||||
Assert.Equal(new[] { "parent", "child", "sibling" }, vm.Tasks.Select(t => t.Id));
|
||||
Assert.True(vm.Tasks.Single(t => t.Id == "child").IsChild);
|
||||
Assert.False(vm.Tasks.Single(t => t.Id == "child").IsOrphanChild);
|
||||
Assert.False(vm.Tasks.Single(t => t.Id == "parent").IsChild);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Load_ChildOfFilteredOutParent_RendersTopLevelAsOrphan()
|
||||
{
|
||||
await using (var db = NewContext())
|
||||
{
|
||||
db.Lists.Add(new ListEntity { Id = "L1", Name = "Work", CreatedAt = DateTime.UtcNow });
|
||||
db.Tasks.Add(new TaskEntity { Id = "parent-done", ListId = "L1", Title = "parent", Status = TaskStatus.Done, CreatedAt = DateTime.UtcNow, SortOrder = 0 });
|
||||
db.Tasks.Add(new TaskEntity { Id = "child", ListId = "L1", Title = "child", Status = TaskStatus.Idle, CreatedAt = DateTime.UtcNow, SortOrder = 1, ParentTaskId = "parent-done" });
|
||||
await db.SaveChangesAsync();
|
||||
}
|
||||
|
||||
var vm = BuildVm();
|
||||
vm.Configure("L1", "Work");
|
||||
await vm.LoadAsync();
|
||||
|
||||
// The parent is Done and filtered out; the child must not disappear, and must be
|
||||
// flagged as an orphan instead of rendering as a (broken) child.
|
||||
Assert.Single(vm.Tasks);
|
||||
var row = vm.Tasks[0];
|
||||
Assert.Equal("child", row.Id);
|
||||
Assert.False(row.IsChild);
|
||||
Assert.True(row.IsOrphanChild);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Toggle_Parent_CascadesSelectionToChildren()
|
||||
{
|
||||
await using (var db = NewContext())
|
||||
{
|
||||
db.Lists.Add(new ListEntity { Id = "L1", Name = "Work", CreatedAt = DateTime.UtcNow });
|
||||
db.Tasks.Add(new TaskEntity { Id = "parent", ListId = "L1", Title = "parent", Status = TaskStatus.Idle, CreatedAt = DateTime.UtcNow, SortOrder = 0 });
|
||||
db.Tasks.Add(new TaskEntity { Id = "child1", ListId = "L1", Title = "child1", Status = TaskStatus.Idle, CreatedAt = DateTime.UtcNow, SortOrder = 1, ParentTaskId = "parent" });
|
||||
db.Tasks.Add(new TaskEntity { Id = "child2", ListId = "L1", Title = "child2", Status = TaskStatus.Idle, CreatedAt = DateTime.UtcNow, SortOrder = 2, ParentTaskId = "parent" });
|
||||
await db.SaveChangesAsync();
|
||||
}
|
||||
|
||||
var vm = BuildVm();
|
||||
vm.Configure("L1", "Work");
|
||||
await vm.LoadAsync();
|
||||
vm.SelectNoneCommand.Execute(null);
|
||||
Assert.All(vm.Tasks, t => Assert.False(t.IsSelected));
|
||||
|
||||
vm.Tasks.Single(t => t.Id == "parent").IsSelected = true;
|
||||
Assert.True(vm.Tasks.Single(t => t.Id == "child1").IsSelected);
|
||||
Assert.True(vm.Tasks.Single(t => t.Id == "child2").IsSelected);
|
||||
|
||||
// A child can be individually deselected afterwards without touching the parent.
|
||||
vm.Tasks.Single(t => t.Id == "child1").IsSelected = false;
|
||||
Assert.True(vm.Tasks.Single(t => t.Id == "parent").IsSelected);
|
||||
Assert.False(vm.Tasks.Single(t => t.Id == "child1").IsSelected);
|
||||
Assert.True(vm.Tasks.Single(t => t.Id == "child2").IsSelected);
|
||||
|
||||
vm.Tasks.Single(t => t.Id == "parent").IsSelected = false;
|
||||
Assert.False(vm.Tasks.Single(t => t.Id == "child2").IsSelected);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Confirm_ReturnsParentsBeforeChildren()
|
||||
{
|
||||
await using (var db = NewContext())
|
||||
{
|
||||
db.Lists.Add(new ListEntity { Id = "L1", Name = "Work", CreatedAt = DateTime.UtcNow });
|
||||
db.Tasks.Add(new TaskEntity { Id = "parent", ListId = "L1", Title = "parent", Status = TaskStatus.Idle, CreatedAt = DateTime.UtcNow, SortOrder = 0 });
|
||||
db.Tasks.Add(new TaskEntity { Id = "child", ListId = "L1", Title = "child", Status = TaskStatus.Idle, CreatedAt = DateTime.UtcNow, SortOrder = 1, ParentTaskId = "parent" });
|
||||
await db.SaveChangesAsync();
|
||||
}
|
||||
|
||||
var vm = BuildVm();
|
||||
vm.Configure("L1", "Work");
|
||||
await vm.LoadAsync();
|
||||
vm.ConfirmCommand.Execute(null);
|
||||
|
||||
var result = await vm.Result.Task;
|
||||
Assert.Equal(new[] { "parent", "child" }, result);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Load_NoCandidates_HasTasksFalse_CannotConfirm()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user