From d7fac7e67e79a461605455503dbd15b7ec821308 Mon Sep 17 00:00:00 2001 From: Mark Yuabov Date: Tue, 19 May 2026 15:59:10 -0400 Subject: [PATCH 1/8] ManageServers: bind DataGrid to ServerVersionInfo, add version probing and bulk-upgrade UI; remove duplicate type --- Dashboard.Tests/Dashboard.Tests.csproj | 22 + Dashboard.Tests/UpgradeAggregationTests.cs | 54 ++ Dashboard/ManageServersWindow.xaml | 42 +- Dashboard/ManageServersWindow.xaml.cs | 556 +++++++++++++++++++-- Dashboard/Models/ServerConnection.cs | 94 ++++ Dashboard/UpgradeAggregation.cs | 60 +++ Installer/packages.lock.json | 6 +- PerformanceMonitor.sln | 8 +- 8 files changed, 799 insertions(+), 43 deletions(-) create mode 100644 Dashboard.Tests/Dashboard.Tests.csproj create mode 100644 Dashboard.Tests/UpgradeAggregationTests.cs create mode 100644 Dashboard/UpgradeAggregation.cs diff --git a/Dashboard.Tests/Dashboard.Tests.csproj b/Dashboard.Tests/Dashboard.Tests.csproj new file mode 100644 index 00000000..6225f054 --- /dev/null +++ b/Dashboard.Tests/Dashboard.Tests.csproj @@ -0,0 +1,22 @@ + + + + net8.0-windows + true + enable + false + false + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Dashboard.Tests/UpgradeAggregationTests.cs b/Dashboard.Tests/UpgradeAggregationTests.cs new file mode 100644 index 00000000..1dbe16e6 --- /dev/null +++ b/Dashboard.Tests/UpgradeAggregationTests.cs @@ -0,0 +1,54 @@ +using PerformanceMonitorDashboard; +using Xunit; + +namespace Dashboard.Tests +{ + public class UpgradeAggregationTests + { + [Fact] + public void AggregatesServerAndStepCounts_Correctly() + { + // Arrange: three servers, two successes, one failure + var inputs = new[] + { + // success: 2 upgrade steps succeeded, 1 step succeeded + new AggregationInput(true, 2, 0, 1, 0), + // failure: 0 succeeded, 1 upgrade failed + new AggregationInput(false, 0, 1, 0, 0), + // success: 1 upgrade succeeded + new AggregationInput(true, 1, 0, 0, 0) + }; + + // Act + var result = UpgradeAggregator.Aggregate(inputs); + + // Assert + Assert.Equal(2, result.ServerSuccessCount); + Assert.Equal(1, result.ServerFailCount); + + // Steps succeeded: (2+1) + (0) + (1) = 4 + Assert.Equal(4, result.StepsSucceeded); + // Steps failed: 1 + Assert.Equal(1, result.StepsFailed); + + // Summary contains expected fragments + Assert.Contains("2 servers upgraded", result.Summary); + Assert.Contains("4 steps succeeded", result.Summary); + Assert.Contains("1 step failed", result.Summary); + } + + [Fact] + public void Aggregator_FormatsSingularPlural_Correctly() + { + var singleSuccess = new[] { new AggregationInput(true, 1, 0, 0, 0) }; + var r1 = UpgradeAggregator.Aggregate(singleSuccess); + Assert.Equal(1, r1.ServerSuccessCount); + Assert.Contains("1 server upgraded", r1.Summary); + + var singleFail = new[] { new AggregationInput(false, 0, 0, 0, 1) }; + var r2 = UpgradeAggregator.Aggregate(singleFail); + Assert.Equal(1, r2.ServerFailCount); + Assert.Contains("1 step failed", r2.Summary); + } + } +} \ No newline at end of file diff --git a/Dashboard/ManageServersWindow.xaml b/Dashboard/ManageServersWindow.xaml index 6804564b..f8eb05b8 100644 --- a/Dashboard/ManageServersWindow.xaml +++ b/Dashboard/ManageServersWindow.xaml @@ -2,7 +2,7 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Manage Servers" - Height="450" Width="960" + Height="450" Width="1024" WindowStartupLocation="CenterOwner" ResizeMode="CanResizeWithGrip" Background="{DynamicResource BackgroundBrush}"> @@ -37,6 +37,7 @@ + @@ -60,7 +61,8 @@ AlternatingRowBackground="{DynamicResource BackgroundLightBrush}" BorderThickness="0" MouseDoubleClick="ServersDataGrid_MouseDoubleClick" - ContextMenu="{StaticResource DataGridContextMenu}"> + ContextMenu="{StaticResource DataGridContextMenu}" + ScrollViewer.HorizontalScrollBarVisibility="Auto"> @@ -71,11 +73,13 @@ - - - - - + + + + + + +