Files
covenant-setup/ui/Covenant.Setup.Ui.Tests/InstallerUiFormHelperTests.cs
2026-04-28 20:19:27 -05:00

143 lines
5.3 KiB
C#

using System.Text.Json;
using Covenant.Setup.Ui;
using Xunit;
namespace Covenant.Setup.Ui.Tests;
public class InstallerUiFormHelperTests
{
[Fact]
public void BuildErrataJson_uses_provided_errata_when_present()
{
using var doc = JsonDocument.Parse("""{"counter":42,"label":"alpha"}""");
var msg = new UiMessage
{
AppName = "MyApp",
Operation = "install",
Message = "Failed",
Error = "E_FAIL",
Errata = doc.RootElement.Clone()
};
var json = InstallerUiForm.BuildErrataJson(msg);
using var parsed = JsonDocument.Parse(json);
Assert.Equal(JsonValueKind.Object, parsed.RootElement.ValueKind);
Assert.Equal(42, parsed.RootElement.GetProperty("counter").GetInt32());
Assert.Equal("alpha", parsed.RootElement.GetProperty("label").GetString());
Assert.False(parsed.RootElement.TryGetProperty("app_name", out _));
}
[Fact]
public void BuildErrataJson_falls_back_to_synthesized_payload_when_errata_null()
{
var msg = new UiMessage
{
AppName = "MyApp",
Operation = "install",
Message = "Failed",
Error = "E_FAIL",
Errata = null
};
var json = InstallerUiForm.BuildErrataJson(msg);
using var parsed = JsonDocument.Parse(json);
Assert.Equal("MyApp", parsed.RootElement.GetProperty("app_name").GetString());
Assert.Equal("install", parsed.RootElement.GetProperty("operation").GetString());
Assert.Equal("Failed", parsed.RootElement.GetProperty("message").GetString());
Assert.Equal("E_FAIL", parsed.RootElement.GetProperty("error").GetString());
}
[Fact]
public void BuildErrataJson_falls_back_when_errata_is_null_jsonelement()
{
using var doc = JsonDocument.Parse("null");
var msg = new UiMessage
{
AppName = "MyApp",
Operation = "uninstall",
Errata = doc.RootElement.Clone()
};
var json = InstallerUiForm.BuildErrataJson(msg);
using var parsed = JsonDocument.Parse(json);
Assert.Equal("MyApp", parsed.RootElement.GetProperty("app_name").GetString());
Assert.Equal("uninstall", parsed.RootElement.GetProperty("operation").GetString());
}
[Fact]
public void SafeMessageSummary_extracts_known_fields_from_valid_json()
{
const string line = """{"type":"progress","id":"x1","message":"Step 1","extra":"ignored"}""";
var summary = InstallerUiForm.SafeMessageSummary(line);
var json = JsonSerializer.Serialize(summary);
using var parsed = JsonDocument.Parse(json);
Assert.Equal("progress", parsed.RootElement.GetProperty("Type").GetString());
Assert.Equal("x1", parsed.RootElement.GetProperty("Id").GetString());
Assert.Equal("Step 1", parsed.RootElement.GetProperty("Message").GetString());
}
[Fact]
public void SafeMessageSummary_returns_raw_length_for_invalid_json()
{
var summary = InstallerUiForm.SafeMessageSummary("not-json-at-all");
var json = JsonSerializer.Serialize(summary);
using var parsed = JsonDocument.Parse(json);
Assert.Equal("not-json-at-all".Length, parsed.RootElement.GetProperty("RawLength").GetInt32());
Assert.False(parsed.RootElement.TryGetProperty("Type", out _));
}
[Fact]
public void SafeMessageSummary_returns_null_fields_when_known_keys_absent()
{
var summary = InstallerUiForm.SafeMessageSummary("{}");
var json = JsonSerializer.Serialize(summary);
using var parsed = JsonDocument.Parse(json);
Assert.Equal(JsonValueKind.Null, parsed.RootElement.GetProperty("Type").ValueKind);
Assert.Equal(JsonValueKind.Null, parsed.RootElement.GetProperty("Id").ValueKind);
Assert.Equal(JsonValueKind.Null, parsed.RootElement.GetProperty("Message").ValueKind);
}
[Theory]
[InlineData("ok_cancel", MessageBoxButtons.OKCancel)]
[InlineData("yes_no", MessageBoxButtons.YesNo)]
[InlineData("ok", MessageBoxButtons.OK)]
[InlineData(null, MessageBoxButtons.OK)]
[InlineData("unknown", MessageBoxButtons.OK)]
public void MapButtons_handles_known_and_default_values(string? input, MessageBoxButtons expected)
{
Assert.Equal(expected, InstallerUiForm.MapButtons(input));
}
[Theory]
[InlineData("error", MessageBoxIcon.Error)]
[InlineData("warning", MessageBoxIcon.Warning)]
[InlineData("information", MessageBoxIcon.Information)]
[InlineData(null, MessageBoxIcon.Information)]
[InlineData("anything-else", MessageBoxIcon.Information)]
public void MapIcon_handles_known_and_default_values(string? input, MessageBoxIcon expected)
{
Assert.Equal(expected, InstallerUiForm.MapIcon(input));
}
[Theory]
[InlineData(DialogResult.OK, "ok")]
[InlineData(DialogResult.Cancel, "cancel")]
[InlineData(DialogResult.Yes, "yes")]
[InlineData(DialogResult.No, "no")]
[InlineData(DialogResult.None, "none")]
[InlineData(DialogResult.Abort, "none")]
[InlineData(DialogResult.Retry, "none")]
[InlineData(DialogResult.Ignore, "none")]
public void MapDialogResult_maps_to_lowercase_token(DialogResult input, string expected)
{
Assert.Equal(expected, InstallerUiForm.MapDialogResult(input));
}
}