chore(claude-do): [A3] Settings + Update-Check: OperationStatus für Skill-Inst

Vorgaben: `docs/superpowers/plans/2026-08-11-operation-feedback.md`, Gruppe A, Entwurf A3. P0-1 ist gemergt: `src/ClaudeDo.Ui/Services/OperationStatus.cs` + `src/ClaudeDo.Ui/Views/Controls/OperationIndicator.axaml`.

SCOPE-ÄNDERUNG (Nutzer, 2026-08-12): OnlineInbox Sign-In/Sign-Out ist AUS DEM SCOPE GENOMMEN — vorerst unwichtig. `ViewModels/Modals/Settings/OnlineInboxSettingsViewModel.cs` und die

ClaudeDo-Task: 2356806f-f16e-4652-b615-4562e95c3a65
This commit is contained in:
Mika Kuns
2026-08-12 09:55:04 +02:00
parent 5fca459579
commit ec4cbcbaf9
12 changed files with 201 additions and 54 deletions
@@ -10,9 +10,11 @@ public class UpdateCheckServiceTests
{
public GiteaRelease? Release { get; set; }
public bool Throw { get; set; }
public TaskCompletionSource<GiteaRelease?>? Gate { get; set; }
public Task<GiteaRelease?> GetLatestReleaseAsync(CancellationToken ct)
{
if (Gate is not null) return Gate.Task;
if (Throw) throw new HttpRequestException();
return Task.FromResult(Release);
}
@@ -58,5 +60,22 @@ public class UpdateCheckServiceTests
var svc = new UpdateCheckService(new FakeReleaseClient { Throw = true }, "0.1.0");
await svc.CheckNowAsync(CancellationToken.None);
Assert.Equal(UpdateCheckStatus.CheckFailed, svc.LastCheckStatus);
Assert.False(svc.Op.IsRunning);
}
[Fact]
public async Task CheckNowAsync_WhileRunning_OpIsRunningTrue_ThenResetAfterCompletion()
{
var releases = new FakeReleaseClient { Gate = new TaskCompletionSource<GiteaRelease?>() };
var svc = new UpdateCheckService(releases, "0.1.0");
var check = svc.CheckNowAsync(CancellationToken.None);
Assert.True(svc.Op.IsRunning);
releases.Gate.SetResult(new GiteaRelease("v0.1.0", "r", new[] { new ReleaseAsset("ClaudeDo-0.1.0-win-x64.zip", "u", 1) }));
await check;
Assert.False(svc.Op.IsRunning);
}
}