mirror of
https://github.com/azaion/satellite-provider.git
synced 2026-06-21 16:31:15 +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>
89 lines
3.4 KiB
C#
89 lines
3.4 KiB
C#
using FluentAssertions;
|
|
using Microsoft.Extensions.Logging.Abstractions;
|
|
using Microsoft.Extensions.Options;
|
|
using SatelliteProvider.Common.Configs;
|
|
using SatelliteProvider.DataAccess.Models;
|
|
using SatelliteProvider.Services.RouteManagement;
|
|
|
|
namespace SatelliteProvider.Tests;
|
|
|
|
// AZ-364 / C11: route summary writer carries forward the StringBuilder
|
|
// content verbatim; tests pin the expected lines so a future drift in
|
|
// the summary format is caught.
|
|
public class RouteSummaryWriterTests : IDisposable
|
|
{
|
|
private readonly string _tempDir;
|
|
|
|
public RouteSummaryWriterTests()
|
|
{
|
|
_tempDir = Path.Combine(Path.GetTempPath(), "az364_routesum_" + Guid.NewGuid().ToString("N"));
|
|
Directory.CreateDirectory(_tempDir);
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
if (Directory.Exists(_tempDir))
|
|
{
|
|
Directory.Delete(_tempDir, recursive: true);
|
|
}
|
|
GC.SuppressFinalize(this);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task WriteAsync_IncludesExpectedLinesAndReturnsPath_AZ364_AC1()
|
|
{
|
|
// Arrange
|
|
var storageOptions = Options.Create(new StorageConfig { ReadyDirectory = _tempDir });
|
|
var sut = new RouteSummaryWriter(storageOptions, NullLogger<RouteSummaryWriter>.Instance);
|
|
|
|
var route = new RouteEntity
|
|
{
|
|
Id = Guid.NewGuid(),
|
|
Name = "demo route",
|
|
Description = "test description",
|
|
TotalPoints = 4,
|
|
TotalDistanceMeters = 1234.5,
|
|
RegionSizeMeters = 200,
|
|
ZoomLevel = 18,
|
|
RequestMaps = true,
|
|
};
|
|
|
|
// Act
|
|
var path = await sut.WriteAsync(route, uniqueTiles: 10, totalTilesFromRegions: 12, duplicateTiles: 2, tilesZipPath: "/ready/zip.zip");
|
|
|
|
// Assert
|
|
path.Should().Be(Path.Combine(_tempDir, $"route_{route.Id}_summary.txt"));
|
|
var content = await File.ReadAllTextAsync(path);
|
|
content.Should().Contain("Route Maps Summary");
|
|
content.Should().Contain($"Route ID: {route.Id}");
|
|
content.Should().Contain("Route Name: demo route");
|
|
content.Should().Contain("Description: test description");
|
|
content.Should().Contain("Total Points: 4");
|
|
content.Should().Contain("Total Distance: 1234.50 meters");
|
|
content.Should().Contain("Region Size: 200 meters");
|
|
content.Should().Contain("Zoom Level: 18");
|
|
content.Should().Contain("- Unique Tiles: 10");
|
|
content.Should().Contain("- Total Tiles from Regions: 12");
|
|
content.Should().Contain("- Duplicate Tiles (overlap): 2");
|
|
content.Should().Contain($"- Stitched Map: route_{route.Id}_stitched.jpg");
|
|
content.Should().Contain($"- Tiles ZIP: route_{route.Id}_tiles.zip");
|
|
}
|
|
|
|
[Fact]
|
|
public async Task WriteAsync_OmitsZipLineWhenNoZipPathSupplied_AZ364_AC1()
|
|
{
|
|
// Arrange
|
|
var storageOptions = Options.Create(new StorageConfig { ReadyDirectory = _tempDir });
|
|
var sut = new RouteSummaryWriter(storageOptions, NullLogger<RouteSummaryWriter>.Instance);
|
|
var route = new RouteEntity { Id = Guid.NewGuid(), Name = "no zip", TotalPoints = 2, RequestMaps = false };
|
|
|
|
// Act
|
|
var path = await sut.WriteAsync(route, uniqueTiles: 1, totalTilesFromRegions: 1, duplicateTiles: 0, tilesZipPath: null);
|
|
|
|
// Assert
|
|
var content = await File.ReadAllTextAsync(path);
|
|
content.Should().NotContain("Tiles ZIP");
|
|
content.Should().NotContain("Stitched Map");
|
|
}
|
|
}
|