diff --git a/tests/ClaudeDo.Installer.Tests/WizardViewModelTests.cs b/tests/ClaudeDo.Installer.Tests/WizardViewModelTests.cs index 88c387cd..551319f3 100644 --- a/tests/ClaudeDo.Installer.Tests/WizardViewModelTests.cs +++ b/tests/ClaudeDo.Installer.Tests/WizardViewModelTests.cs @@ -1,3 +1,4 @@ +using ClaudeDo.Installer.Checks; using ClaudeDo.Installer.Core; using ClaudeDo.Installer.Pages.InstallPage; using ClaudeDo.Installer.Pages.PathsPage; @@ -5,6 +6,7 @@ using ClaudeDo.Installer.Pages.ServicePage; using ClaudeDo.Installer.Pages.SystemCheckPage; using ClaudeDo.Installer.Pages.UiSettingsPage; using ClaudeDo.Installer.Pages.WelcomePage; +using ClaudeDo.Installer.Tests.Pages.SystemCheckPage; using ClaudeDo.Installer.Views; using Microsoft.Extensions.DependencyInjection; @@ -50,4 +52,35 @@ public class WizardViewModelTests Assert.DoesNotContain(vm.Pages, p => p is SystemCheckPageViewModel); } + + [Fact] + public async Task CanGoNext_is_false_while_the_system_check_page_has_a_blocking_error_and_true_after_a_clean_recheck() + { + var context = new InstallContext { Mode = InstallerMode.FreshInstall }; + var callNumber = 0; + var systemCheckPage = new SystemCheckPageViewModel(context, () => + { + callNumber++; + IEnvironmentCheck check = callNumber == 1 + ? FakeEnvironmentCheck.Fail("git", CheckSeverity.Error) + : FakeEnvironmentCheck.Ok("git"); + return new EnvironmentCheckService(new[] { check }); + }); + + var resolver = new PageResolver(new IInstallerPage[] + { + new WelcomePageViewModel(context), + systemCheckPage, + }); + var vm = new WizardViewModel(resolver, context, new FakeLocalizer()); + + await vm.GoNextCommand.ExecuteAsync(null); // Welcome -> SystemCheck; auto-run fails + + Assert.Same(systemCheckPage, vm.CurrentPage); + Assert.False(vm.CanGoNext); + + await systemCheckPage.RunChecksCommand.ExecuteAsync(null); // recheck comes back clean + + Assert.True(vm.CanGoNext); + } }