zcbot/windows-node/Zcbot.WindowsNode.Tests/DataRootPageViewModelTests.cs

86 lines
2.9 KiB
C#

namespace Zcbot.WindowsNode.Tests;
public sealed class DataRootPageViewModelTests
{
[Fact]
public async Task ChangeMigratesConfirmedTargetAndReportsCompletion()
{
var service = new FakeDataRootManagementService();
var viewModel = new DataRootPageViewModel(service);
NodeDataMigrationResult? completed = null;
viewModel.ChooseTargetRequested += _ => @"D:\zcbot-data";
viewModel.ConfirmMigrationRequested += _ => true;
viewModel.MigrationRequested += target => Task.FromResult(
new NodeDataMigrationResult(@"C:\node-data", target, 3, 4096));
viewModel.MigrationCompleted += result => completed = result;
viewModel.ChangeCommand.Execute(null);
await WaitUntilAsync(() => completed is not null);
Assert.Equal(@"D:\zcbot-data", completed!.TargetDirectory);
Assert.Contains("3 个文件", viewModel.Status);
Assert.True(viewModel.IsMigrating);
}
[Fact]
public async Task ChangeRefusesPendingJobsBeforeChoosingATarget()
{
var service = new FakeDataRootManagementService { PendingJobs = true };
var viewModel = new DataRootPageViewModel(service);
var chooseCount = 0;
viewModel.ChooseTargetRequested += _ =>
{
chooseCount++;
return @"D:\zcbot-data";
};
viewModel.MigrationRequested += _ => throw new InvalidOperationException();
viewModel.ChangeCommand.Execute(null);
await WaitUntilAsync(() => viewModel.Status.Contains("未完成任务"));
Assert.Equal(0, chooseCount);
Assert.False(viewModel.IsMigrating);
}
[Fact]
public void EnvironmentManagedRootDisablesMigration()
{
var service = new FakeDataRootManagementService
{
Selection = new NodeDataRootSelection(
@"D:\managed",
IsEnvironmentManaged: true,
"environment"),
};
var viewModel = new DataRootPageViewModel(service);
Assert.False(viewModel.ChangeCommand.CanExecute(null));
Assert.Contains(NodeDataRootSettings.EnvironmentVariableName, viewModel.Status);
}
private static async Task WaitUntilAsync(Func<bool> condition)
{
var deadline = DateTime.UtcNow.AddSeconds(2);
while (!condition() && DateTime.UtcNow < deadline)
{
await Task.Delay(10);
}
Assert.True(condition());
}
private sealed class FakeDataRootManagementService : IDataRootManagementService
{
internal NodeDataRootSelection Selection { get; init; } = new(
@"C:\node-data",
IsEnvironmentManaged: false,
"default");
internal bool PendingJobs { get; init; }
public NodeDataRootSelection ReadSelection() => Selection;
public bool HasPendingJobs => PendingJobs;
public string Normalize(string path) => Path.TrimEndingDirectorySeparator(path);
}
}