mirror of
https://github.com/azaion/satellite-provider.git
synced 2026-06-22 18:41:14 +00:00
[AZ-364] [AZ-360] Refactor C11+C08: decompose RouteProcessingService
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>
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
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");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user