test(app): add app test scaffolding and headless test harness

This commit is contained in:
dualfroz committed 2026-08-28 16:37:39 +02:00
1 parent d679231fed
commit 1f1b78e50b
4 files changed
+105

No files matched your search

@@ -0,0 +1,31 @@
using Vantage.Core.Health;
using Vantage.Core.Metrics;
using Vantage.Core.Models;
namespace Vantage.App.Tests.Fakes;
public sealed class ThrowingMetricsProvider : IMetricsProvider
{
public const string Message = "host unreachable";
public Task<HostMetrics> GetMetricsAsync(HostConfig host, CancellationToken cancellationToken) =>
throw new InvalidOperationException(Message);
}
public sealed class FakeHealthChecker : IHealthChecker
{
private readonly HealthCheckResult result;
public FakeHealthChecker(HealthCheckResult result)
{
this.result = result;
}
public int Calls { get; private set; }
public Task<HealthCheckResult> CheckAsync(HealthCheckConfig check, CancellationToken cancellationToken)
{
Calls++;
return Task.FromResult(result);
}
}
@@ -0,0 +1,15 @@
using Avalonia;
using Avalonia.Headless;
using Vantage.App;
using Vantage.App.Tests;
[assembly: AvaloniaTestApplication(typeof(HeadlessTestApp))]
namespace Vantage.App.Tests;
public static class HeadlessTestApp
{
public static AppBuilder BuildAvaloniaApp() => AppBuilder
.Configure<App>()
.UseHeadless(new AvaloniaHeadlessPlatformOptions());
}
@@ -0,0 +1,37 @@
using Avalonia;
using Avalonia.Controls;
using Avalonia.Headless.XUnit;
using Avalonia.VisualTree;
using Microsoft.Extensions.DependencyInjection;
using Vantage.App;
using Vantage.App.ViewModels;
using Vantage.App.Views;
using Xunit;
namespace Vantage.App.Tests;
public class HeadlessWindowTests
{
[AvaloniaFact]
public async Task MainWindow_LoadsXamlAndBindsViewModel()
{
var services = new ServiceCollection();
services.AddVantageApp(useMockProviders: true);
var provider = services.BuildServiceProvider();
var viewModel = provider.GetRequiredService<MainWindowViewModel>();
await viewModel.InitializeAsync();
var window = new MainWindow { DataContext = viewModel };
window.Show();
Assert.Same(viewModel, window.DataContext);
Assert.NotEmpty(viewModel.Hosts);
var tabControl = window.GetVisualDescendants().OfType<TabControl>().FirstOrDefault();
Assert.NotNull(tabControl);
var listBox = window.GetVisualDescendants().OfType<ListBox>().FirstOrDefault();
Assert.NotNull(listBox);
}
}
@@ -0,0 +1,22 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<LangVersion>latest</LangVersion>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageReference Include="xunit" Version="2.6.6" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.6" />
<PackageReference Include="Avalonia.Headless.XUnit" Version="11.0.10" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Vantage.App\Vantage.App.csproj" />
</ItemGroup>
</Project>