143 lines
5.3 KiB
C#
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));
|
|
}
|
|
}
|