fix(ui): silent no-ops raise ErrorReported instead of swallowing failures (UX-Audit #1)

Stop/Enqueue/Dequeue/Reset&Retry (DetailsIslandViewModel), status/cancel/reject
commands (TasksIslandViewModel), Mission Control's drag-enqueue and queue
refresh, and "Open findings folder" (ListsIslandViewModel) used to catch {}
or silently return on a blocked precondition. They now report through the
existing ErrorReported -> FlashFooterError path, with new en/de locale keys
and Ui.Tests covering each converted command.
This commit is contained in:
mika kuns
2026-08-21 09:13:00 +02:00
parent fdd0e1e56a
commit 99bb5be5da
10 changed files with 468 additions and 20 deletions
@@ -278,14 +278,40 @@ public class MissionControlViewModelTests : IDisposable
using var vm = BuildVm(worker);
await vm.OpenConPtySessionAsync("t1");
string? error = null;
vm.ErrorReported += msg => error = msg;
await vm.EnqueueTaskAsync("t1");
Assert.Empty(worker.QueuedTaskIds);
Assert.NotNull(error);
await using var verify = NewContext();
var entity = await verify.Tasks.FirstAsync(t => t.Id == "t1");
Assert.Equal(TaskStatus.Idle, entity.Status);
}
private sealed class ThrowingSetStatusWorkerClient : StubWorkerClient
{
public Exception Error { get; init; } = new Exception("enqueue offline");
public override Task<BaseDirtyWarningDto?> SetTaskStatusAsync(string taskId, TaskStatus status) =>
throw Error;
}
[Fact]
public async Task EnqueueTaskAsync_WhenWorkerThrows_RaisesErrorReported()
{
var worker = new ThrowingSetStatusWorkerClient();
using var vm = BuildVm(worker);
string? error = null;
vm.ErrorReported += msg => error = msg;
await vm.EnqueueTaskAsync("t1");
Assert.NotNull(error);
Assert.Contains("enqueue offline", error);
}
private sealed class ThrowingLaunchSpecWorker : StubWorkerClient
{
public override Task<LaunchSpec> GetInteractiveLaunchSpecAsync(string taskId, CancellationToken ct = default)