Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ jobs:
run: |
dotnet restore SysManager/SysManager/SysManager.csproj
dotnet restore SysManager/SysManager.Tests/SysManager.Tests.csproj
dotnet restore SysManager/SysManager.IntegrationTests/SysManager.IntegrationTests.csproj
dotnet restore SysManager/SysManager.UITests/SysManager.UITests.csproj

- name: Check formatting
Expand All @@ -51,6 +52,12 @@ jobs:
- name: Build tests
run: dotnet build SysManager/SysManager.Tests/SysManager.Tests.csproj -c Release --no-restore

# Compile-check the integration tests so ViewModel/service signature drift is
# caught in CI. They are NOT run here (they touch the live system); compilation
# alone catches the constructor/property mismatches that previously slipped by.
- name: Build integration tests (compile check)
run: dotnet build SysManager/SysManager.IntegrationTests/SysManager.IntegrationTests.csproj -c Release --no-restore

- name: Run unit tests
run: >
dotnet test SysManager/SysManager.Tests/SysManager.Tests.csproj
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,15 @@ public class AdminElevationVmTests
[Fact]
public void WindowsUpdateVm_ExposesIsElevated()
{
var vm = new WindowsUpdateViewModel(new PowerShellRunner());
var vm = new WindowsUpdateViewModel(new PowerShellRunner(), new WindowsUpdateService());
// Must equal the current process' elevation state.
Assert.Equal(Helpers.AdminHelper.IsElevated(), vm.IsElevated);
}

[Fact]
public void WindowsUpdateVm_HasRelaunchCommand()
{
var vm = new WindowsUpdateViewModel(new PowerShellRunner());
var vm = new WindowsUpdateViewModel(new PowerShellRunner(), new WindowsUpdateService());
Assert.NotNull(vm.RelaunchAsAdminCommand);
}

Expand Down Expand Up @@ -59,7 +59,7 @@ public void AppUpdatesVm_HasRelaunchCommand()
[Fact]
public void AllElevationVms_Report_SameElevationFlag()
{
var a = new WindowsUpdateViewModel(new PowerShellRunner()).IsElevated;
var a = new WindowsUpdateViewModel(new PowerShellRunner(), new WindowsUpdateService()).IsElevated;
var b = new CleanupViewModel(new PowerShellRunner()).IsElevated;
var c = new AppUpdatesViewModel(new WingetService(new PowerShellRunner())).IsElevated;
Assert.Equal(a, b);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ namespace SysManager.IntegrationTests;
[Collection("Network")]
public class AllViewModelsSweepTests
{
[Fact] public void Dashboard_Constructs() => Assert.NotNull(new DashboardViewModel(new SystemInfoService(), new TuneUpService(new ShortcutCleanerService(), new DiskHealthService(), new SystemInfoService()), new HealthScoreService(new SystemInfoService(), new DiskHealthService(), new BatteryService())));
[Fact] public void Dashboard_Constructs() => Assert.NotNull(new DashboardViewModel(new SystemInfoService(), new TuneUpService(new ShortcutCleanerService(), new DiskHealthService(), new SystemInfoService()), new HealthScoreService(new SystemInfoService(), new DiskHealthService(), new BatteryService()), new TemperatureService(new DiskHealthService(), skipHardwareInit: true)));
[Fact] public void AppUpdates_Constructs() => Assert.NotNull(new AppUpdatesViewModel(new WingetService(new PowerShellRunner())));
[Fact] public void WindowsUpdate_Constructs() => Assert.NotNull(new WindowsUpdateViewModel(new PowerShellRunner()));
[Fact] public void WindowsUpdate_Constructs() => Assert.NotNull(new WindowsUpdateViewModel(new PowerShellRunner(), new WindowsUpdateService()));
[Fact] public void SystemHealth_Constructs() => Assert.NotNull(new SystemHealthViewModel(new SystemInfoService(), new DiskHealthService(), new MemoryTestService(), new FixedDriveService(), new PowerShellRunner()));
[Fact] public void Cleanup_Constructs() => Assert.NotNull(new CleanupViewModel(new PowerShellRunner()));
[Fact] public void DeepCleanup_Constructs() => Assert.NotNull(new DeepCleanupViewModel(new DeepCleanupService(), new LargeFileScanner(), new FixedDriveService()));
Expand All @@ -28,7 +28,7 @@ public class AllViewModelsSweepTests
[Fact] public void MainWindow_Constructs() => Assert.NotNull(new MainWindowViewModel());

[Fact] public void Dashboard_HasNonEmptySummaryOrEmpty()
=> Assert.NotNull(new DashboardViewModel(new SystemInfoService(), new TuneUpService(new ShortcutCleanerService(), new DiskHealthService(), new SystemInfoService()), new HealthScoreService(new SystemInfoService(), new DiskHealthService(), new BatteryService())));
=> Assert.NotNull(new DashboardViewModel(new SystemInfoService(), new TuneUpService(new ShortcutCleanerService(), new DiskHealthService(), new SystemInfoService()), new HealthScoreService(new SystemInfoService(), new DiskHealthService(), new BatteryService()), new TemperatureService(new DiskHealthService(), skipHardwareInit: true)));

[Fact] public void AppUpdates_HasCollections()
{
Expand Down
36 changes: 23 additions & 13 deletions SysManager/SysManager.IntegrationTests/DashboardViewModelTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,30 +10,40 @@ namespace SysManager.IntegrationTests;
[Collection("Network")]
public class DashboardViewModelTests
{
private static DashboardViewModel NewVm()
{
var sys = new SystemInfoService();
var diskHealth = new DiskHealthService();
return new DashboardViewModel(
sys,
new TuneUpService(new ShortcutCleanerService(), diskHealth, sys),
new HealthScoreService(sys, diskHealth, new BatteryService()),
new TemperatureService(diskHealth, skipHardwareInit: true));
}

[Fact]
public void Ctor_SetsElevationFlag()
{
var vm = new DashboardViewModel(new SystemInfoService(), new TuneUpService(new ShortcutCleanerService(), new DiskHealthService(), new SystemInfoService()), new HealthScoreService(new SystemInfoService(), new DiskHealthService(), new BatteryService()));
var vm = NewVm();
// Just ensures IsElevated is true/false (no throw).
_ = vm.IsElevated;
}

[Fact]
public async Task RefreshCommand_CompletesAndPopulatesFields()
{
var vm = new DashboardViewModel(new SystemInfoService(), new TuneUpService(new ShortcutCleanerService(), new DiskHealthService(), new SystemInfoService()), new HealthScoreService(new SystemInfoService(), new DiskHealthService(), new BatteryService()));
var vm = NewVm();
await vm.RefreshCommand.ExecuteAsync(null);
Assert.NotNull(vm.Snapshot);
Assert.False(string.IsNullOrWhiteSpace(vm.OsLine));
Assert.False(string.IsNullOrWhiteSpace(vm.CpuLine));
Assert.False(string.IsNullOrWhiteSpace(vm.MemLine));
Assert.False(string.IsNullOrWhiteSpace(vm.UptimeLine));
Assert.False(string.IsNullOrWhiteSpace(vm.CpuName));
Assert.True(vm.RamTotalGB >= 0);
}

[Fact]
public async Task RefreshCommand_ResetsBusyFlag_WhenDone()
{
var vm = new DashboardViewModel(new SystemInfoService(), new TuneUpService(new ShortcutCleanerService(), new DiskHealthService(), new SystemInfoService()), new HealthScoreService(new SystemInfoService(), new DiskHealthService(), new BatteryService()));
var vm = NewVm();
await vm.RefreshCommand.ExecuteAsync(null);
Assert.False(vm.IsBusy);
Assert.False(vm.IsProgressIndeterminate);
Expand All @@ -42,18 +52,18 @@ public async Task RefreshCommand_ResetsBusyFlag_WhenDone()
[Fact]
public async Task RefreshCommand_SetsStatusMessage()
{
var vm = new DashboardViewModel(new SystemInfoService(), new TuneUpService(new ShortcutCleanerService(), new DiskHealthService(), new SystemInfoService()), new HealthScoreService(new SystemInfoService(), new DiskHealthService(), new BatteryService()));
var vm = NewVm();
await vm.RefreshCommand.ExecuteAsync(null);
Assert.False(string.IsNullOrWhiteSpace(vm.StatusMessage));
}

[Fact]
public void RequestElevationCommand_WhenAlreadyElevated_DoesNotShutdown()
public void RelaunchAsAdminCommand_Exists()
{
// We cannot realistically call RequestElevation in a test because it
// would try to spawn a process and shut the test host down. We only
// verify the command exists and is invokable.
var vm = new DashboardViewModel(new SystemInfoService(), new TuneUpService(new ShortcutCleanerService(), new DiskHealthService(), new SystemInfoService()), new HealthScoreService(new SystemInfoService(), new DiskHealthService(), new BatteryService()));
Assert.NotNull(vm.RequestElevationCommand);
// We cannot realistically invoke RelaunchAsAdmin in a test because it
// would try to spawn an elevated process and shut the test host down.
// We only verify the command exists.
var vm = NewVm();
Assert.NotNull(vm.RelaunchAsAdminCommand);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -73,30 +73,31 @@ public void DriversVm_CancelBeforeStart_IsSafe()
[Fact]
public void WindowsUpdateVm_Ctor_IsSafe()
{
var vm = new WindowsUpdateViewModel(new PowerShellRunner());
var vm = new WindowsUpdateViewModel(new PowerShellRunner(), new WindowsUpdateService());
Assert.NotNull(vm.Console);
Assert.False(vm.ModuleAvailable);
}

[Fact]
public void WindowsUpdateVm_AllCommandsExist()
{
var vm = new WindowsUpdateViewModel(new PowerShellRunner());
var vm = new WindowsUpdateViewModel(new PowerShellRunner(), new WindowsUpdateService());
Assert.NotNull(vm.CheckModuleCommand);
Assert.NotNull(vm.InstallModuleCommand);
Assert.NotNull(vm.ListUpdatesCommand);
Assert.NotNull(vm.ListFeatureUpdatesCommand);
Assert.NotNull(vm.ShowHistoryCommand);
Assert.NotNull(vm.CheckPendingRebootCommand);
Assert.NotNull(vm.InstallUpdatesCommand);
Assert.NotNull(vm.CancelCommand);
}

[Fact]
public void WindowsUpdateVm_ModuleStatusDefault_IsChecking()
public void WindowsUpdateVm_ModuleStatusDefault_IsSet()
{
var vm = new WindowsUpdateViewModel(new PowerShellRunner());
Assert.Contains("Checking", vm.ModuleStatus, StringComparison.OrdinalIgnoreCase);
var vm = new WindowsUpdateViewModel(new PowerShellRunner(), new WindowsUpdateService());
// Since the WUA COM migration, updates use the COM API directly and
// PSWindowsUpdate backs only the History view; the default status reflects that.
Assert.False(string.IsNullOrWhiteSpace(vm.ModuleStatus));
}

// ---------- App updates ----------
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ public void Defaults_LogFolderIsSet()
public void Defaults_SearchTextIsEmpty()
{
var vm = new LogsViewModel(new EventLogService());
Assert.Equal("", vm.SearchText);
Assert.Equal("", vm.FilterText);
}

[Fact]
Expand Down Expand Up @@ -115,11 +115,11 @@ public void Filter_SearchText_IsCaseInsensitive()
{
var vm = new LogsViewModel(new EventLogService());
var e = Make(EventSeverity.Error, "Disk controller timeout");
vm.SearchText = "DISK";
vm.FilterText = "DISK";
Assert.True(InvokeFilter(vm, e));
vm.SearchText = "disk";
vm.FilterText = "disk";
Assert.True(InvokeFilter(vm, e));
vm.SearchText = "Disk";
vm.FilterText = "Disk";
Assert.True(InvokeFilter(vm, e));
}

Expand All @@ -128,7 +128,7 @@ public void Filter_SearchByProvider_Works()
{
var vm = new LogsViewModel(new EventLogService());
var e = Make(EventSeverity.Error, "m", "Microsoft-Windows-Kernel-Power", 41);
vm.SearchText = "Kernel";
vm.FilterText = "Kernel";
Assert.True(InvokeFilter(vm, e));
}

Expand All @@ -137,7 +137,7 @@ public void Filter_SearchByEventIdNumeric_Works()
{
var vm = new LogsViewModel(new EventLogService());
var e = Make(EventSeverity.Error, "m", "x", 41);
vm.SearchText = "41";
vm.FilterText = "41";
Assert.True(InvokeFilter(vm, e));
}

Expand All @@ -146,7 +146,7 @@ public void Filter_SearchMissingText_ReturnsFalse()
{
var vm = new LogsViewModel(new EventLogService());
var e = Make(EventSeverity.Error, "simple message");
vm.SearchText = "nowhere-to-be-found";
vm.FilterText = "nowhere-to-be-found";
Assert.False(InvokeFilter(vm, e));
}

Expand Down Expand Up @@ -244,7 +244,7 @@ public void ChangingSearchText_RefreshesView_NoThrow()
var vm = new LogsViewModel(new EventLogService());
var ex = Record.Exception(() =>
{
for (int i = 0; i < 20; i++) vm.SearchText = $"query{i}";
for (int i = 0; i < 20; i++) vm.FilterText = $"query{i}";
});
Assert.Null(ex);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ public void HealthAnalyzer_StaticThresholds_AreConstants()
public void LogsViewModel_SearchSpecialChars_DoesNotCrashFilter(string q)
{
var vm = new LogsViewModel(new EventLogService());
vm.SearchText = q;
vm.FilterText = q;
var m = typeof(LogsViewModel).GetMethod("EntryFilter",
BindingFlags.NonPublic | BindingFlags.Instance)!;
var e = new FriendlyEventEntry { Severity = EventSeverity.Error, Message = "ok", EventId = 1 };
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ namespace SysManager.IntegrationTests;

public class WindowsUpdateAutoCheckTests
{
private static WindowsUpdateViewModel Build() => new(new PowerShellRunner());
private static WindowsUpdateViewModel Build() => new(new PowerShellRunner(), new WindowsUpdateService());

[Fact]
public void ModuleStatus_HasInitialMessage()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ namespace SysManager.IntegrationTests;

public class WindowsUpdateViewModelTests
{
private static WindowsUpdateViewModel NewVm() => new(new PowerShellRunner());
private static WindowsUpdateViewModel NewVm() => new(new PowerShellRunner(), new WindowsUpdateService());

// ---------- construction ----------

Expand Down Expand Up @@ -117,7 +117,7 @@ public async Task InstallUpdates_WhenNotElevated_SetsStatusMessage()
public void RunnerLineReceived_AppendsToConsole()
{
var runner = new PowerShellRunner();
var vm = new WindowsUpdateViewModel(runner);
var vm = new WindowsUpdateViewModel(runner, new WindowsUpdateService());

var ev = typeof(PowerShellRunner)
.GetField(nameof(PowerShellRunner.LineReceived),
Expand All @@ -134,7 +134,7 @@ public void RunnerLineReceived_AppendsToConsole()
public void RunnerProgressChanged_UpdatesProgress()
{
var runner = new PowerShellRunner();
var vm = new WindowsUpdateViewModel(runner);
var vm = new WindowsUpdateViewModel(runner, new WindowsUpdateService());

var ev = typeof(PowerShellRunner)
.GetField(nameof(PowerShellRunner.ProgressChanged),
Expand Down
Loading