fix(ui): drop stale delta refreshes so the newest task state wins
This commit is contained in:
@@ -122,4 +122,32 @@ public class TasksIslandDeltaResilienceTests : IDisposable
|
||||
|
||||
Assert.Equal(TaskStatus.Running, vm.Items.Single(r => r.Id == "T1").Status);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task A_stale_delta_result_does_not_overwrite_a_newer_one()
|
||||
{
|
||||
await SeedAsync();
|
||||
|
||||
var factory = new FlakyDbFactory(NewContext, failuresLeft: 0);
|
||||
var vm = new TasksIslandViewModel(factory, new FakeWorker());
|
||||
var list = UserList("L1", "Work");
|
||||
await LoadAndWaitAsync(vm, list);
|
||||
|
||||
// Start refresh #1 while the DB still says Queued, but do not await it yet.
|
||||
var first = vm.RefreshTaskFromWorkerAsync("T1");
|
||||
|
||||
await using (var db = NewContext())
|
||||
{
|
||||
var t = await db.Tasks.FirstAsync(x => x.Id == "T1");
|
||||
t.Status = TaskStatus.Running;
|
||||
await db.SaveChangesAsync();
|
||||
}
|
||||
|
||||
// Refresh #2 sees Running and must win, regardless of completion order.
|
||||
var second = vm.RefreshTaskFromWorkerAsync("T1");
|
||||
|
||||
await Task.WhenAll(first, second);
|
||||
|
||||
Assert.Equal(TaskStatus.Running, vm.Items.Single(r => r.Id == "T1").Status);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user