fix(claude-do): merge Status-Force-Bypässe auf laufende Tasks schließen (MCP + UI-

ClaudeDo-Task: 3b2c4015-226b-41a1-80c4-3a8d5537f2a5
This commit is contained in:
Mika Kuns
2026-08-26 15:45:56 +02:00
7 changed files with 183 additions and 11 deletions
@@ -900,6 +900,21 @@ public sealed class ExternalMcpServiceTests : IDisposable
sut.DeleteTask(task.Id, CancellationToken.None));
}
[Fact]
public async Task DeleteTask_WithChildren_ThrowsUnderstandableMessage()
{
var listId = await SeedListAsync();
var parent = await SeedTaskAsync(listId, status: TaskStatus.WaitingForChildren);
await SeedTaskAsync(listId, status: TaskStatus.Idle, parentId: parent.Id);
var sut = BuildSut(CreateQueue());
var ex = await Assert.ThrowsAsync<InvalidOperationException>(() =>
sut.DeleteTask(parent.Id, CancellationToken.None));
Assert.Contains("child task", ex.Message, StringComparison.OrdinalIgnoreCase);
Assert.NotNull(await _tasks.GetByIdAsync(parent.Id));
}
[Fact]
public async Task DeleteTask_NotFound_Throws()
{
@@ -981,6 +996,35 @@ public sealed class ExternalMcpServiceTests : IDisposable
Assert.Equal(TaskStatus.WaitingForReview, loaded!.Status);
}
[Fact]
public async Task UpdateTaskStatus_Idle_OnRunningTask_Throws()
{
var listId = await SeedListAsync();
var task = await SeedTaskAsync(listId, status: TaskStatus.Running);
var sut = BuildSut(CreateQueue());
await Assert.ThrowsAsync<InvalidOperationException>(
() => sut.UpdateTaskStatus(task.Id, "Idle", CancellationToken.None));
var loaded = await _tasks.GetByIdAsync(task.Id);
Assert.Equal(TaskStatus.Running, loaded!.Status);
}
[Fact]
public async Task UpdateTaskStatus_Done_OnRunningTask_Throws()
{
var listId = await SeedListAsync();
var task = await SeedTaskAsync(listId, status: TaskStatus.Running);
var sut = BuildSut(CreateQueue());
var ex = await Assert.ThrowsAsync<InvalidOperationException>(
() => sut.UpdateTaskStatus(task.Id, "Done", CancellationToken.None));
Assert.Contains("running", ex.Message, StringComparison.OrdinalIgnoreCase);
var loaded = await _tasks.GetByIdAsync(task.Id);
Assert.Equal(TaskStatus.Running, loaded!.Status);
}
private ExternalMcpService NewService() => BuildSut(CreateQueue());
private async Task<string> SeedIdleTask(string title = "t")