📄 core/tests/MessageOptionsTests/LoadJsonShould.cs
using System;
using System.IO;
using Microsoft.Extensions.Options;
using Shouldly;
using Xunit;

namespace Cfa.Tests.MessageOptionsTests;

public sealed class LoadJsonShould
{
    [Theory]
    [InlineData("""{"messageRoutes":[{}]}""")]
    [InlineData("""{"messageRoutes":[{"publisher":{"method":{"type":"Bus","name":"Send"},"messageArgument":-1}}]}""")]
    public void RejectIncompleteRoutes(string json)
    {
        // Arrange
        var path = Path.GetTempFileName();
        try
        {
            File.WriteAllText(path, json);

            // Act
            var load = () => MessageOptions.LoadJson(path);

            // Assert
            load.ShouldThrow<OptionsValidationException>();
        }
        finally
        {
            File.Delete(path);
        }
    }

    [Fact]
    public void ReportInvalidNestedSettings()
    {
        // Arrange
        var path = Path.GetTempFileName();
        try
        {
            File.WriteAllText(
                path,
                """
                {
                  "messageRoutes": [{
                    "publisher": {
                      "method": { "type": " ", "name": "", "genericArity": -1, "parameterCount": -1 },
                      "messageArgument": -1
                    },
                    "registrations": [{
                      "method": { "type": "Receiver", "name": "On" },
                      "messageTypeArgument": -1,
                      "handlerArgument": -1
                    }]
                  }]
                }
                """
            );

            // Act
            var load = () => MessageOptions.LoadJson(path);

            // Assert
            var error = load.ShouldThrow<OptionsValidationException>();
            error.Message.ShouldContain("Type");
            error.Message.ShouldContain("Name");
            error.Message.ShouldContain("GenericArity");
            error.Message.ShouldContain("ParameterCount");
            error.Message.ShouldContain("MessageArgument");
            error.Message.ShouldContain("MessageTypeArgument");
            error.Message.ShouldContain("HandlerArgument");
        }
        finally
        {
            File.Delete(path);
        }
    }
}