Files
LanMountainDesktop/LanMountainDesktop.Tests/OobeSessionCommitServiceTests.cs
2026-06-05 11:08:11 +08:00

119 lines
4.0 KiB
C#

using LanMountainDesktop.Launcher;
using LanMountainDesktop.Launcher.Models;
using Xunit;
namespace LanMountainDesktop.Tests;
public sealed class OobeSessionCommitServiceTests : IDisposable
{
private readonly string _tempRoot = Path.Combine(
Path.GetTempPath(),
"LanMountainDesktop.Tests",
nameof(OobeSessionCommitServiceTests),
Guid.NewGuid().ToString("N"));
[Fact]
public void ResolveDataRoot_ForChoice_DoesNotWriteConfigOrState()
{
var resolver = new DataLocationResolver(_tempRoot);
var dataRoot = resolver.ResolveDataRoot(DataLocationMode.Portable);
Assert.Equal(Path.Combine(_tempRoot, "Desktop"), dataRoot);
Assert.False(File.Exists(resolver.ResolveConfigPath()));
Assert.False(File.Exists(GetCompletedStatePath(dataRoot)));
}
[Fact]
public void Commit_WritesSettingsAndCompletedState_OnlyAfterFinalDraft()
{
var resolver = new DataLocationResolver(_tempRoot);
var oobeState = new OobeStateService(
_tempRoot,
executionSnapshot: new LauncherExecutionSnapshot(false, "tester", "S-1-5-test"));
var context = CommandContext.FromArgs(["launch"]);
var service = new OobeSessionCommitService(
resolver,
oobeState,
context,
setWindowsStartup: _ => true);
var draft = CreateDraft();
var result = service.Commit(draft);
var dataRoot = resolver.ResolveDataRoot();
Assert.True(result.Success);
Assert.True(File.Exists(resolver.ResolveConfigPath()));
Assert.True(File.Exists(HostAppSettingsOobeMerger.GetSettingsFilePath(dataRoot)));
Assert.True(File.Exists(Path.Combine(resolver.ResolveLauncherDataPath(), "privacy-config.json")));
Assert.True(File.Exists(Path.Combine(resolver.ResolveLauncherDataPath(), "privacy-agreement.state.json")));
Assert.True(File.Exists(GetCompletedStatePath(dataRoot)));
}
[Fact]
public void Commit_DoesNotWriteCompletedState_WhenFinalSaveFails()
{
if (!OperatingSystem.IsWindows())
{
return;
}
var resolver = new DataLocationResolver(_tempRoot);
var oobeState = new OobeStateService(
_tempRoot,
executionSnapshot: new LauncherExecutionSnapshot(false, "tester", "S-1-5-test"));
var context = CommandContext.FromArgs(["launch"]);
var service = new OobeSessionCommitService(
resolver,
oobeState,
context,
setWindowsStartup: _ => false);
var result = service.Commit(CreateDraft());
var dataRoot = resolver.ResolveDataRoot();
Assert.False(result.Success);
Assert.Equal("windows_startup_save_failed", result.ResultCode);
Assert.False(File.Exists(GetCompletedStatePath(dataRoot)));
}
public void Dispose()
{
try
{
if (Directory.Exists(_tempRoot))
{
Directory.Delete(_tempRoot, recursive: true);
}
}
catch
{
}
}
private static OobeSessionDraft CreateDraft() =>
new()
{
DataLocationMode = DataLocationMode.Portable,
MigrateExistingData = false,
StartupChoices = new HostAppSettingsStartupChoices(
ShowInTaskbar: true,
EnableFadeTransition: true,
EnableSlideTransition: false,
FusedPopupExperience: false,
AutoStartWithWindows: false),
PrivacyConfig = new PrivacyConfig
{
CrashTelemetryEnabled = false,
UsageTelemetryEnabled = false,
TelemetryId = "test-telemetry"
},
PrivacyAgreementAccepted = true,
PrivacyUserId = "test-telemetry",
PrivacyDeviceId = "test-device"
};
private static string GetCompletedStatePath(string dataRoot) =>
Path.Combine(dataRoot, "Launcher", "state", "oobe-state.json");
}