Files
satellite-provider/SatelliteProvider.Tests/RouteSummaryWriterTests.cs
T
Oleksandr Bezdieniezhnykh 6f23120c49 [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>
2026-05-11 03:12:49 +03:00

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");
}
}