diff --git a/Assets/Tests/Editor/CliSetupSectionTests.cs b/Assets/Tests/Editor/CliSetupSectionTests.cs index bcbc0d8096..46c03bf3a7 100644 --- a/Assets/Tests/Editor/CliSetupSectionTests.cs +++ b/Assets/Tests/Editor/CliSetupSectionTests.cs @@ -589,6 +589,8 @@ private static VisualElement CreateRootElement() root.Add(new Button { name = "refresh-skills-state-button" }); VisualElement skillsSubsection = new() { name = "skills-subsection" }; VisualElement skillsSetupPanel = new() { name = "skills-setup-panel" }; + skillsSetupPanel.Add(new EnumField { name = "skills-install-root-field" }); + skillsSetupPanel.Add(new Label { name = "skills-install-root-location" }); skillsSetupPanel.Add(new VisualElement { name = "skill-target-status-list" }); skillsSetupPanel.Add(new VisualElement { name = "skill-target-status-divider" }); skillsSetupPanel.Add(new Label { name = "skill-target-status-summary" }); @@ -642,7 +644,8 @@ private static CliSetupData CreateData( SkillsTarget.Claude, groupSkillsUnderUnityCliLoop: false, isInstallingSkills: false, - installableSkillTargets: installableSkillTargets ?? new List()); + installableSkillTargets: installableSkillTargets ?? new List(), + skillInstallRootSelection: default); } } } diff --git a/Assets/Tests/Editor/SetupWizardStartupFlowVersionChangeTests.cs b/Assets/Tests/Editor/SetupWizardStartupFlowVersionChangeTests.cs index 44282b600a..639a7293c8 100644 --- a/Assets/Tests/Editor/SetupWizardStartupFlowVersionChangeTests.cs +++ b/Assets/Tests/Editor/SetupWizardStartupFlowVersionChangeTests.cs @@ -589,6 +589,12 @@ private sealed class RecordingSkillSetupPort : ISkillSetupPort internal List DetectGroupFlags { get; } = new List(); internal bool ReturnOutdatedTarget { get; set; } + public SkillInstallRootSelection GetSkillInstallRootSelection(string projectRoot) => + new(SkillInstallRoot.UnityProjectRoot, projectRoot, null); + + public void SaveSkillInstallRoot(string projectRoot, SkillInstallRoot root) => + throw new NotSupportedException(); + public void RemoveSkillFiles(string toolName) => throw new NotSupportedException(); public bool IsSkillInstalled(string toolName) => throw new NotSupportedException(); diff --git a/Assets/Tests/Editor/SetupWizardWorkflowControllersTests.cs b/Assets/Tests/Editor/SetupWizardWorkflowControllersTests.cs index 598fb7fde7..eb33579179 100644 --- a/Assets/Tests/Editor/SetupWizardWorkflowControllersTests.cs +++ b/Assets/Tests/Editor/SetupWizardWorkflowControllersTests.cs @@ -433,6 +433,52 @@ public void SkillsRefreshSection_WhenCancelledDuringTheFullScan_KeepsTheFastScan Assert.That(_root.Q("skill-target-status-list").childCount, Is.EqualTo(1)); } + /// + /// Verifies a bulk install into an unavailable Git repository root explains why and installs nothing. + /// + [Test] + public async Task SkillsHandleInstallSkillsAsync_WhenTheGitRootIsUnavailable_ExplainsAndInstallsNothing() + { + _cliDetector.CliVersion = "3.1.0"; + _skillPort.InstallRootSelection = new SkillInstallRootSelection( + SkillInstallRoot.GitRepositoryRoot, + "/unity", + null); + _skillPort.FullTargets = new List + { + CreateTarget("Claude Code", ".claude", SkillInstallState.Missing) + }; + SetupWizardSkillsWorkflowController controller = CreateSkillsWorkflow(); + + await controller.HandleInstallSkillsAsync(isBulkInstall: true, CancellationToken.None); + + Assert.That(_skillPort.InstalledTargetDirs, Is.Empty); + Assert.That(_dialogs.MessageTitles, Is.EqualTo(new List { "No Git Repository" })); + } + + /// + /// Verifies choosing an install location in the wizard saves it and shows where skills go. + /// + [Test] + public void SkillsHandleInstallRootChanged_SavesTheRootAndShowsTheLocation() + { + _cliDetector.CliVersion = "3.1.0"; + _skillPort.InstallRootSelection = new SkillInstallRootSelection( + SkillInstallRoot.UnityProjectRoot, + "/unity", + ""); + SetupWizardSkillsWorkflowController controller = CreateSkillsWorkflow(); + + controller.HandleInstallRootChanged(SkillInstallRoot.GitRepositoryRoot); + + Assert.That( + _skillPort.SavedInstallRoots, + Is.EqualTo(new List { SkillInstallRoot.GitRepositoryRoot })); + Assert.That( + _root.Q