Files
git.stella-ops.org/tests/StellaOps.Microservice.Tests/EndpointDiscoveryServiceTests.cs
StellaOps Bot 6a299d231f
Some checks failed
Docs CI / lint-and-preview (push) Has been cancelled
Policy Lint & Smoke / policy-lint (push) Has been cancelled
Add unit tests for Router configuration and transport layers
- Implemented tests for RouterConfig, RoutingOptions, StaticInstanceConfig, and RouterConfigOptions to ensure default values are set correctly.
- Added tests for RouterConfigProvider to validate configurations and ensure defaults are returned when no file is specified.
- Created tests for ConfigValidationResult to check success and error scenarios.
- Developed tests for ServiceCollectionExtensions to verify service registration for RouterConfig.
- Introduced UdpTransportTests to validate serialization, connection, request-response, and error handling in UDP transport.
- Added scripts for signing authority gaps and hashing DevPortal SDK snippets.
2025-12-05 08:01:47 +02:00

186 lines
5.8 KiB
C#

using FluentAssertions;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Moq;
using StellaOps.Microservice;
using StellaOps.Router.Common.Models;
using Xunit;
namespace StellaOps.Microservice.Tests;
/// <summary>
/// Tests for EndpointDiscoveryService - verifies integration of discovery + YAML loading + merging.
/// </summary>
public class EndpointDiscoveryServiceTests
{
private readonly Mock<IEndpointDiscoveryProvider> _discoveryProviderMock;
private readonly Mock<IMicroserviceYamlLoader> _yamlLoaderMock;
private readonly Mock<IEndpointOverrideMerger> _mergerMock;
private readonly ILogger<EndpointDiscoveryService> _logger;
private readonly EndpointDiscoveryService _service;
public EndpointDiscoveryServiceTests()
{
_discoveryProviderMock = new Mock<IEndpointDiscoveryProvider>();
_yamlLoaderMock = new Mock<IMicroserviceYamlLoader>();
_mergerMock = new Mock<IEndpointOverrideMerger>();
_logger = NullLogger<EndpointDiscoveryService>.Instance;
_service = new EndpointDiscoveryService(
_discoveryProviderMock.Object,
_yamlLoaderMock.Object,
_mergerMock.Object,
_logger);
}
[Fact]
public void DiscoverEndpoints_CallsDiscoveryProvider()
{
var codeEndpoints = new List<EndpointDescriptor>();
_discoveryProviderMock
.Setup(x => x.DiscoverEndpoints())
.Returns(codeEndpoints);
_mergerMock
.Setup(x => x.Merge(It.IsAny<IReadOnlyList<EndpointDescriptor>>(), It.IsAny<MicroserviceYamlConfig?>()))
.Returns(codeEndpoints);
_service.DiscoverEndpoints();
_discoveryProviderMock.Verify(x => x.DiscoverEndpoints(), Times.Once);
}
[Fact]
public void DiscoverEndpoints_CallsYamlLoader()
{
var codeEndpoints = new List<EndpointDescriptor>();
_discoveryProviderMock
.Setup(x => x.DiscoverEndpoints())
.Returns(codeEndpoints);
_mergerMock
.Setup(x => x.Merge(It.IsAny<IReadOnlyList<EndpointDescriptor>>(), It.IsAny<MicroserviceYamlConfig?>()))
.Returns(codeEndpoints);
_service.DiscoverEndpoints();
_yamlLoaderMock.Verify(x => x.Load(), Times.Once);
}
[Fact]
public void DiscoverEndpoints_PassesCodeEndpointsAndYamlConfigToMerger()
{
var codeEndpoints = new List<EndpointDescriptor>
{
CreateEndpoint("GET", "/api/test")
};
var yamlConfig = new MicroserviceYamlConfig
{
Endpoints =
[
new EndpointOverrideConfig { Method = "GET", Path = "/api/test" }
]
};
_discoveryProviderMock
.Setup(x => x.DiscoverEndpoints())
.Returns(codeEndpoints);
_yamlLoaderMock
.Setup(x => x.Load())
.Returns(yamlConfig);
_mergerMock
.Setup(x => x.Merge(codeEndpoints, yamlConfig))
.Returns(codeEndpoints);
_service.DiscoverEndpoints();
_mergerMock.Verify(x => x.Merge(codeEndpoints, yamlConfig), Times.Once);
}
[Fact]
public void DiscoverEndpoints_ReturnsMergedEndpoints()
{
var codeEndpoints = new List<EndpointDescriptor>
{
CreateEndpoint("GET", "/api/test", TimeSpan.FromSeconds(10))
};
var mergedEndpoints = new List<EndpointDescriptor>
{
CreateEndpoint("GET", "/api/test", TimeSpan.FromMinutes(5))
};
_discoveryProviderMock
.Setup(x => x.DiscoverEndpoints())
.Returns(codeEndpoints);
_mergerMock
.Setup(x => x.Merge(It.IsAny<IReadOnlyList<EndpointDescriptor>>(), It.IsAny<MicroserviceYamlConfig?>()))
.Returns(mergedEndpoints);
var result = _service.DiscoverEndpoints();
result.Should().BeSameAs(mergedEndpoints);
}
[Fact]
public void DiscoverEndpoints_ContinuesWithNullYamlConfig_WhenLoaderReturnsNull()
{
var codeEndpoints = new List<EndpointDescriptor>
{
CreateEndpoint("GET", "/api/test")
};
_discoveryProviderMock
.Setup(x => x.DiscoverEndpoints())
.Returns(codeEndpoints);
_yamlLoaderMock
.Setup(x => x.Load())
.Returns((MicroserviceYamlConfig?)null);
_mergerMock
.Setup(x => x.Merge(codeEndpoints, null))
.Returns(codeEndpoints);
var result = _service.DiscoverEndpoints();
_mergerMock.Verify(x => x.Merge(codeEndpoints, null), Times.Once);
result.Should().BeSameAs(codeEndpoints);
}
[Fact]
public void DiscoverEndpoints_ContinuesWithNullYamlConfig_WhenLoaderThrows()
{
var codeEndpoints = new List<EndpointDescriptor>
{
CreateEndpoint("GET", "/api/test")
};
_discoveryProviderMock
.Setup(x => x.DiscoverEndpoints())
.Returns(codeEndpoints);
_yamlLoaderMock
.Setup(x => x.Load())
.Throws(new Exception("YAML parsing failed"));
_mergerMock
.Setup(x => x.Merge(codeEndpoints, null))
.Returns(codeEndpoints);
var result = _service.DiscoverEndpoints();
// Should not throw, should continue with null config
_mergerMock.Verify(x => x.Merge(codeEndpoints, null), Times.Once);
result.Should().BeSameAs(codeEndpoints);
}
private static EndpointDescriptor CreateEndpoint(
string method,
string path,
TimeSpan? timeout = null)
{
return new EndpointDescriptor
{
ServiceName = "test-service",
Version = "1.0.0",
Method = method,
Path = path,
DefaultTimeout = timeout ?? TimeSpan.FromSeconds(30)
};
}
}