using ClaudeDo.Ui.Services; using ClaudeDo.Ui.ViewModels.Modals; namespace ClaudeDo.Ui.Tests.ViewModels; public sealed class WorkerConnectionModalViewModelTests { private sealed class FakeWorkerLocator(string? path) : WorkerLocator { public override string? Find() => path; } private sealed class FakeInstallerLocator(string? path) : InstallerLocator { public override string? Find() => path; } [Fact] public void StartWorker_ExeNotFound_ShowsErrorAndKeepsDialogOpen() { var vm = new WorkerConnectionModalViewModel(new FakeWorkerLocator(null), new FakeInstallerLocator(null)); var closed = false; vm.CloseAction = () => closed = true; vm.StartWorkerCommand.Execute(null); Assert.False(closed); Assert.False(string.IsNullOrEmpty(vm.ErrorText)); } [Fact] public void StartWorker_ProcessStartThrows_ShowsErrorAndKeepsDialogOpen() { var vm = new WorkerConnectionModalViewModel(new FakeWorkerLocator(@"C:\fake\ClaudeDo.Worker.exe"), new FakeInstallerLocator(null)) { ProcessStarter = _ => throw new InvalidOperationException("blocked by AV") }; var closed = false; vm.CloseAction = () => closed = true; vm.StartWorkerCommand.Execute(null); Assert.False(closed); Assert.Contains("blocked by AV", vm.ErrorText); } [Fact] public void StartWorker_Success_ClearsErrorAndClosesDialog() { var vm = new WorkerConnectionModalViewModel(new FakeWorkerLocator(@"C:\fake\ClaudeDo.Worker.exe"), new FakeInstallerLocator(null)) { ProcessStarter = _ => { } }; var closed = false; vm.CloseAction = () => closed = true; vm.StartWorkerCommand.Execute(null); Assert.True(closed); Assert.Null(vm.ErrorText); } [Fact] public void RerunInstaller_NotFound_ShowsErrorAndDoesNotThrow() { var vm = new WorkerConnectionModalViewModel(new FakeWorkerLocator(null), new FakeInstallerLocator(null)); vm.RerunInstallerCommand.Execute(null); Assert.False(string.IsNullOrEmpty(vm.ErrorText)); } [Fact] public void RerunInstaller_ProcessStartThrows_ShowsError() { var vm = new WorkerConnectionModalViewModel(new FakeWorkerLocator(null), new FakeInstallerLocator(@"C:\fake\ClaudeDo.Installer.exe")) { ProcessStarter = _ => throw new InvalidOperationException("blocked by AV") }; vm.RerunInstallerCommand.Execute(null); Assert.Contains("blocked by AV", vm.ErrorText); } }