using Moq; using SilverOS.Welcome.Core.Apply; using SilverOS.Welcome.Core.Apps; using SilverOS.Welcome.Core.Flavours; using Xunit; public class ApplyServiceTests { private static Mock NoApps() { var installer = new Mock(); installer.Setup(i => i.InstallAsync(It.IsAny>(), It.IsAny>(), It.IsAny())) .ReturnsAsync(Array.Empty()); return installer; } private static FlavourManifest Flavour() => new() { Id = "daily-driver", Hardening = new HardeningSpec { Modules = new[] { "00" } } }; [Fact] public async Task Runs_apps_then_bitlocker_when_pin_supplied() { var order = new List(); var run = new Mock(); run.Setup(r => r.RunAsync(It.IsAny(), It.IsAny(), It.IsAny())) .ReturnsAsync(new ProcessResult(0, "", "")); var bl = new Mock(); bl.Setup(b => b.EnableAsync(It.IsAny(), It.IsAny())) .Callback(() => order.Add("bitlocker")).Returns(Task.CompletedTask); var installer = NoApps(); installer.Setup(i => i.InstallAsync(It.IsAny>(), It.IsAny>(), It.IsAny())) .Callback(() => order.Add("apps")).ReturnsAsync(Array.Empty()); var sut = new ApplyService(bl.Object, installer.Object); var req = new ApplyRequest(Flavour(), "123456", System.Array.Empty()); var progress = new List(); await sut.RunAsync(req, new Progress(p => progress.Add(p.Stage))); Assert.Equal(new[] { "apps", "bitlocker" }, order); Assert.Contains("Installing apps", progress); Assert.Contains("Done", progress); } [Fact] public async Task Empty_pin_skips_bitlocker() { var order = new List(); var run = new Mock(); run.Setup(r => r.RunAsync(It.IsAny(), It.IsAny(), It.IsAny())) .ReturnsAsync(new ProcessResult(0, "", "")); var bl = new Mock(); bl.Setup(b => b.EnableAsync(It.IsAny(), It.IsAny())) .Callback(() => order.Add("bitlocker")).Returns(Task.CompletedTask); var installer = NoApps(); installer.Setup(i => i.InstallAsync(It.IsAny>(), It.IsAny>(), It.IsAny())) .Callback(() => order.Add("apps")).ReturnsAsync(Array.Empty()); var sut = new ApplyService(bl.Object, installer.Object); var req = new ApplyRequest(Flavour(), "", System.Array.Empty()); await sut.RunAsync(req, new Progress(_ => { })); Assert.Equal(new[] { "apps" }, order); bl.Verify(b => b.EnableAsync(It.IsAny(), It.IsAny()), Times.Never); } [Fact] public async Task Installs_the_requested_apps() { var run = new Mock(); run.Setup(r => r.RunAsync(It.IsAny(), It.IsAny(), It.IsAny())) .ReturnsAsync(new ProcessResult(0, "", "")); var bl = new Mock(); var installer = NoApps(); var apps = new[] { new AppCatalogEntry { Id = "firefox", Name = "Firefox" } }; var sut = new ApplyService(bl.Object, installer.Object); var req = new ApplyRequest(Flavour(), "123456", apps); await sut.RunAsync(req, new Progress(_ => { })); installer.Verify(i => i.InstallAsync(apps, It.IsAny>(), It.IsAny()), Times.Once); bl.Verify(b => b.EnableAsync("123456", It.IsAny()), Times.Once); } }