mirror of
https://github.com/azaion/satellite-provider.git
synced 2026-06-21 16:11:14 +00:00
6f23120c49
Extracts RouteRegionMatcher, RouteCsvWriter, RouteSummaryWriter, RouteImageRenderer, TilesZipBuilder, RegionFileCleaner from the ~750-LOC RouteProcessingService god-class. Moves TileInfo to its own file as a sealed record. Replaces IServiceProvider scope- locator with a direct IRegionService injection (folds AZ-360 / C08). Updates DI registration and tests. Tests: 133 / 133 unit + 5 / 5 smoke green; integration suite exit 0. Pixel-equivalent stitched route image and byte-equivalent CSV / summary / ZIP outputs verified through the smoke run. Co-authored-by: Cursor <cursoragent@cursor.com>
94 lines
3.0 KiB
C#
94 lines
3.0 KiB
C#
using FluentAssertions;
|
|
using Microsoft.Extensions.Logging;
|
|
using Microsoft.Extensions.Options;
|
|
using Moq;
|
|
using SatelliteProvider.Common.Configs;
|
|
using SatelliteProvider.Services.RouteManagement;
|
|
|
|
namespace SatelliteProvider.Tests;
|
|
|
|
// AZ-364 / C11: tests moved from RouteProcessingServiceTests when the helper
|
|
// migrated to RouteImageRenderer. The four tile-coordinate-parsing tests
|
|
// preserve the behavior contract (good name → parsed; malformed → sentinel
|
|
// + warning log; null → ArgumentNullException).
|
|
public class RouteImageRendererTests
|
|
{
|
|
private static RouteImageRenderer BuildSut(out Mock<ILogger<RouteImageRenderer>> loggerMock)
|
|
{
|
|
loggerMock = new Mock<ILogger<RouteImageRenderer>>();
|
|
var storageOptions = Options.Create(new StorageConfig());
|
|
return new RouteImageRenderer(storageOptions, loggerMock.Object);
|
|
}
|
|
|
|
private static void VerifyWarningLogged(Mock<ILogger<RouteImageRenderer>> loggerMock, string substringInState)
|
|
{
|
|
loggerMock.Verify(
|
|
l => l.Log(
|
|
LogLevel.Warning,
|
|
It.IsAny<EventId>(),
|
|
It.Is<It.IsAnyType>((state, _) => state.ToString()!.Contains(substringInState)),
|
|
It.IsAny<Exception?>(),
|
|
It.IsAny<Func<It.IsAnyType, Exception?, string>>()),
|
|
Times.AtLeastOnce);
|
|
}
|
|
|
|
[Fact]
|
|
public void ExtractTileCoordinatesFromFilename_ValidName_ReturnsParsedCoordinates_AZ364_AC1()
|
|
{
|
|
// Arrange
|
|
var sut = BuildSut(out _);
|
|
|
|
// Act
|
|
var (x, y) = sut.ExtractTileCoordinatesFromFilename("/tiles/tile_1700000000_42_99.jpg");
|
|
|
|
// Assert
|
|
x.Should().Be(42);
|
|
y.Should().Be(99);
|
|
}
|
|
|
|
[Fact]
|
|
public void ExtractTileCoordinatesFromFilename_MalformedName_LogsWarningAndReturnsSentinel_AZ364_AC1()
|
|
{
|
|
// Arrange
|
|
var sut = BuildSut(out var loggerMock);
|
|
const string malformed = "/tmp/not_a_tile_filename.jpg";
|
|
|
|
// Act
|
|
var (x, y) = sut.ExtractTileCoordinatesFromFilename(malformed);
|
|
|
|
// Assert
|
|
x.Should().Be(-1);
|
|
y.Should().Be(-1);
|
|
VerifyWarningLogged(loggerMock, "not_a_tile_filename");
|
|
}
|
|
|
|
[Fact]
|
|
public void ExtractTileCoordinatesFromFilename_TilePrefixWithNonNumericCoords_LogsWarningAndReturnsSentinel_AZ364_AC1()
|
|
{
|
|
// Arrange
|
|
var sut = BuildSut(out var loggerMock);
|
|
const string nonNumeric = "/tiles/tile_1700000000_alpha_beta.jpg";
|
|
|
|
// Act
|
|
var (x, y) = sut.ExtractTileCoordinatesFromFilename(nonNumeric);
|
|
|
|
// Assert
|
|
x.Should().Be(-1);
|
|
y.Should().Be(-1);
|
|
VerifyWarningLogged(loggerMock, "tile_1700000000_alpha_beta");
|
|
}
|
|
|
|
[Fact]
|
|
public void ExtractTileCoordinatesFromFilename_NullPath_PropagatesArgumentNullException_AZ364_AC1()
|
|
{
|
|
// Arrange
|
|
var sut = BuildSut(out _);
|
|
|
|
// Act
|
|
Action act = () => sut.ExtractTileCoordinatesFromFilename(null!);
|
|
|
|
// Assert
|
|
act.Should().Throw<ArgumentNullException>();
|
|
}
|
|
}
|