Merge task branch for: fix(worker): deleting the last non-terminal child leaves the parent stuck in WaitingForChildren

This commit is contained in:
mika kuns
2026-07-23 18:00:48 +02:00
5 changed files with 36 additions and 7 deletions
@@ -104,7 +104,8 @@ public sealed class ExternalMcpServiceTests : IDisposable
return id;
}
private async Task<TaskEntity> SeedTaskAsync(string listId, string title = "t", TaskStatus status = TaskStatus.Idle)
private async Task<TaskEntity> SeedTaskAsync(
string listId, string title = "t", TaskStatus status = TaskStatus.Idle, string? parentId = null)
{
var task = new TaskEntity
{
@@ -112,6 +113,7 @@ public sealed class ExternalMcpServiceTests : IDisposable
ListId = listId,
Title = title,
Status = status,
ParentTaskId = parentId,
CreatedAt = DateTime.UtcNow,
CommitType = "chore",
};
@@ -284,6 +286,21 @@ public sealed class ExternalMcpServiceTests : IDisposable
sut.DeleteTask("does-not-exist", CancellationToken.None));
}
[Fact]
public async Task DeleteTask_LastNonTerminalChild_AdvancesParentToWaitingForReview()
{
var listId = await SeedListAsync();
var parent = await SeedTaskAsync(listId, status: TaskStatus.WaitingForChildren);
await SeedTaskAsync(listId, status: TaskStatus.Done, parentId: parent.Id);
var lastChild = await SeedTaskAsync(listId, status: TaskStatus.Idle, parentId: parent.Id);
var sut = BuildSut(CreateQueue());
await sut.DeleteTask(lastChild.Id, CancellationToken.None);
var reloadedParent = await _tasks.GetByIdAsync(parent.Id);
Assert.Equal(TaskStatus.WaitingForReview, reloadedParent!.Status);
}
private ExternalMcpService NewService() => BuildSut(CreateQueue());
private async Task<string> SeedIdleTask(string title = "t")