fix(ui): stop the merge-helper tick from re-ticking unticked candidates

This commit is contained in:
mika kuns
2026-08-11 08:32:52 +02:00
parent 7106bf754f
commit d3ba279b54
2 changed files with 94 additions and 7 deletions
@@ -89,6 +89,73 @@ public class MergeHelperSelectionModalViewModelTests : IDisposable
Assert.False(vm.Tasks.Single(t => t.Id == "t-children").IsSelected);
}
[Fact]
public async Task ReconcileTick_KeepsBothTicksAndUnticks_AndDefaultsOnlyNewRows()
{
await SeedAllStatusesAsync();
var vm = BuildVm();
vm.Configure("L1", "Work");
await vm.LoadAsync();
// The user's own choices, both directions, against the defaults.
vm.Tasks.Single(t => t.Id == "t-idle").IsSelected = false; // default true -> off
vm.Tasks.Single(t => t.Id == "t-running").IsSelected = true; // default false -> on
await using (var db = NewContext())
{
db.Tasks.Add(new TaskEntity
{
Id = "t-new", ListId = "L1", Title = "arrived later",
Status = TaskStatus.Idle, CreatedAt = DateTime.UtcNow, SortOrder = 99,
});
await db.SaveChangesAsync();
}
await vm.ReconcileTickAsync();
Assert.False(vm.Tasks.Single(t => t.Id == "t-idle").IsSelected);
Assert.True(vm.Tasks.Single(t => t.Id == "t-running").IsSelected);
Assert.True(vm.Tasks.Single(t => t.Id == "t-queued").IsSelected); // untouched, keeps default
Assert.True(vm.Tasks.Single(t => t.Id == "t-new").IsSelected); // new row gets the default
}
[Fact]
public async Task ReconcileTick_DoesNotCascadeParentStateOverAnUntickedChild()
{
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", ParentTaskId = "parent",
Status = TaskStatus.Idle, CreatedAt = DateTime.UtcNow, SortOrder = 1,
});
db.Tasks.Add(new TaskEntity
{
Id = "child2", ListId = "L1", Title = "child2", ParentTaskId = "parent",
Status = TaskStatus.Idle, CreatedAt = DateTime.UtcNow, SortOrder = 2,
});
await db.SaveChangesAsync();
}
var vm = BuildVm();
vm.Configure("L1", "Work");
await vm.LoadAsync();
vm.Tasks.Single(t => t.Id == "child1").IsSelected = false; // parent stays ticked
await vm.ReconcileTickAsync();
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);
}
[Fact]
public async Task Load_PerListScope_FiltersToThatList()
{