Merge claudedo/c4930a56575e45b2ae9be47b1c49eb39

This commit is contained in:
mika kuns
2026-08-06 13:47:11 +02:00
11 changed files with 324 additions and 12 deletions
@@ -498,4 +498,42 @@ public sealed class TaskStateServiceTests : IDisposable
Assert.Equal(TaskStatus.Queued, t2.Status);
Assert.Equal(c1, t2.BlockedByTaskId);
}
// ─── TryAdvanceParentAsync ────────────────────────────────────────────
[Fact]
public async Task TryAdvanceParentAsync_ZeroChildren_AdvancesToWaitingForReview()
{
// Mirrors deleting the last remaining child: no terminal transition fires for it,
// so the caller invokes TryAdvanceParentAsync directly with zero children left.
var parent = await SeedTaskAsync(TaskStatus.WaitingForChildren, phase: PlanningPhase.Finalized);
await _sut.TryAdvanceParentAsync(parent);
Assert.Equal(TaskStatus.WaitingForReview, await GetStatusAsync(parent));
}
[Fact]
public async Task TryAdvanceParentAsync_AllChildrenTerminal_AdvancesToWaitingForReview()
{
var parent = await SeedTaskAsync(TaskStatus.WaitingForChildren, phase: PlanningPhase.Finalized);
await SeedTaskAsync(TaskStatus.Done, parentId: parent);
await SeedTaskAsync(TaskStatus.Done, parentId: parent);
await _sut.TryAdvanceParentAsync(parent);
Assert.Equal(TaskStatus.WaitingForReview, await GetStatusAsync(parent));
}
[Fact]
public async Task TryAdvanceParentAsync_SomeChildrenStillRunning_DoesNotAdvance()
{
var parent = await SeedTaskAsync(TaskStatus.WaitingForChildren, phase: PlanningPhase.Finalized);
await SeedTaskAsync(TaskStatus.Done, parentId: parent);
await SeedTaskAsync(TaskStatus.Running, parentId: parent);
await _sut.TryAdvanceParentAsync(parent);
Assert.Equal(TaskStatus.WaitingForChildren, await GetStatusAsync(parent));
}
}