feat(worker): add review_task MCP tool and status reference updates

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
mika kuns
2026-06-01 17:17:56 +02:00
parent 9c1f20f2d9
commit c88ed9d5eb
2 changed files with 88 additions and 6 deletions

View File

@@ -171,6 +171,54 @@ public sealed class ExternalMcpServiceTests : IDisposable
sut.UpdateTask("does-not-exist", "x", null, null, CancellationToken.None));
}
[Fact]
public async Task ReviewTask_Approve_SetsDone()
{
var listId = await SeedListAsync();
var task = await SeedTaskAsync(listId, status: TaskStatus.WaitingForReview);
var sut = BuildSut(CreateQueue());
var dto = await sut.ReviewTask(task.Id, "approve", null, CancellationToken.None);
Assert.Equal("Done", dto.Status);
}
[Fact]
public async Task ReviewTask_RejectRerun_WithoutFeedback_Throws()
{
var listId = await SeedListAsync();
var task = await SeedTaskAsync(listId, status: TaskStatus.WaitingForReview);
var sut = BuildSut(CreateQueue());
await Assert.ThrowsAsync<InvalidOperationException>(() =>
sut.ReviewTask(task.Id, "reject_rerun", null, CancellationToken.None));
}
[Fact]
public async Task ReviewTask_RejectRerun_QueuesAndStoresFeedback()
{
var listId = await SeedListAsync();
var task = await SeedTaskAsync(listId, status: TaskStatus.WaitingForReview);
var sut = BuildSut(CreateQueue());
var dto = await sut.ReviewTask(task.Id, "reject_rerun", "fix it", CancellationToken.None);
Assert.Equal("Queued", dto.Status);
var loaded = await new TaskRepository(_db.CreateContext()).GetByIdAsync(task.Id);
Assert.Equal("fix it", loaded!.ReviewFeedback);
}
[Fact]
public async Task ReviewTask_UnknownDecision_Throws()
{
var listId = await SeedListAsync();
var task = await SeedTaskAsync(listId, status: TaskStatus.WaitingForReview);
var sut = BuildSut(CreateQueue());
await Assert.ThrowsAsync<InvalidOperationException>(() =>
sut.ReviewTask(task.Id, "bogus", null, CancellationToken.None));
}
[Fact]
public async Task DeleteTask_RemovesTask()
{