using System.IO; using ClaudeDo.Localization; using ClaudeDo.Ui.Localization; using ClaudeDo.Ui.Services; using ClaudeDo.Ui.ViewModels.Modals.Settings; namespace ClaudeDo.Ui.Tests.ViewModels; public class WorktreesSettingsTabViewModelTests { public WorktreesSettingsTabViewModelTests() { var dir = AppContext.BaseDirectory; while (dir is not null && !Directory.Exists(Path.Combine(dir, "src", "ClaudeDo.Localization", "locales"))) dir = Path.GetDirectoryName(dir); Loc.Current = new Localizer( LocaleStore.Load(Path.Combine(dir!, "src", "ClaudeDo.Localization", "locales")), "en"); } private sealed class ThrowingWorker : StubWorkerClient { public string ExceptionMessage { get; init; } = "disk full"; public override Task CleanupFinishedWorktreesAsync(string? listId = null) => throw new Exception(ExceptionMessage); public override Task ResetAllWorktreesAsync() => throw new Exception(ExceptionMessage); } [Fact] public async Task CleanupWorktrees_WhenWorkerThrows_ShowsExceptionMessage() { var worker = new ThrowingWorker(); var vm = new WorktreesSettingsTabViewModel(worker); await vm.CleanupWorktreesCommand.ExecuteAsync(null); Assert.Contains(worker.ExceptionMessage, vm.StatusMessage); Assert.False(vm.IsBusy); } [Fact] public async Task ConfirmResetAll_WhenWorkerThrows_ShowsExceptionMessage() { var worker = new ThrowingWorker(); var vm = new WorktreesSettingsTabViewModel(worker); await vm.ConfirmResetAllCommand.ExecuteAsync(null); Assert.Contains(worker.ExceptionMessage, vm.StatusMessage); Assert.False(vm.ResetStatus.IsRunning); Assert.False(vm.ShowResetConfirm); } }