From 7a32ed5110f2b23136e72bb9e7f408fc39d9ce3d Mon Sep 17 00:00:00 2001 From: Anton Martynenko Date: Tue, 18 Nov 2025 19:14:12 +0100 Subject: [PATCH] more tests --- SatelliteProvider.IntegrationTests/Program.cs | 2 + .../RouteTests.cs | 235 ++++++++++++++++++ docker-compose.tests.yml | 3 + 3 files changed, 240 insertions(+) diff --git a/SatelliteProvider.IntegrationTests/Program.cs b/SatelliteProvider.IntegrationTests/Program.cs index e9b8ec5..86bb7c6 100644 --- a/SatelliteProvider.IntegrationTests/Program.cs +++ b/SatelliteProvider.IntegrationTests/Program.cs @@ -38,6 +38,8 @@ class Program await RouteTests.RunComplexRouteWithStitching(httpClient); + await RouteTests.RunExtendedRouteEast(httpClient); + Console.WriteLine(); Console.WriteLine("========================="); Console.WriteLine("All tests completed successfully!"); diff --git a/SatelliteProvider.IntegrationTests/RouteTests.cs b/SatelliteProvider.IntegrationTests/RouteTests.cs index 30038fe..700ecc5 100644 --- a/SatelliteProvider.IntegrationTests/RouteTests.cs +++ b/SatelliteProvider.IntegrationTests/RouteTests.cs @@ -502,5 +502,240 @@ public static class RouteTests Console.WriteLine("✓ Complex Route with 10 Points Test: PASSED"); } + + public static async Task RunExtendedRouteEast(HttpClient httpClient) + { + Console.WriteLine(); + Console.WriteLine("Test: Extended Route with 20 Points - 10km East"); + Console.WriteLine("================================================="); + Console.WriteLine(); + + var routeId = Guid.NewGuid(); + var request = new CreateRouteRequest + { + Id = routeId, + Name = "Extended Route with 20 Points (10km East)", + Description = "Test route with 20 action points, located 10km east of the complex route", + RegionSizeMeters = 300.0, + ZoomLevel = 18, + RequestMaps = true, + Points = new List + { + new() { Latitude = 48.276067180586544, Longitude = 37.51945758819581 }, + new() { Latitude = 48.27074009522731, Longitude = 37.509029159545906 }, + new() { Latitude = 48.263312668696855, Longitude = 37.51207614898682 }, + new() { Latitude = 48.26539817051818, Longitude = 37.50087524414063 }, + new() { Latitude = 48.25851283439989, Longitude = 37.49452377319337 }, + new() { Latitude = 48.254426906081555, Longitude = 37.509801635742195 }, + new() { Latitude = 48.25914140977405, Longitude = 37.52568031311036 }, + new() { Latitude = 48.25354110233028, Longitude = 37.536752471923835 }, + new() { Latitude = 48.25902712391726, Longitude = 37.551257858276374 }, + new() { Latitude = 48.26828345053738, Longitude = 37.537009963989265 }, + new() { Latitude = 48.27421563182974, Longitude = 37.52345758819581 }, + new() { Latitude = 48.26889854647051, Longitude = 37.513029159545906 }, + new() { Latitude = 48.26147111993905, Longitude = 37.51607614898682 }, + new() { Latitude = 48.26355662176038, Longitude = 37.50487524414063 }, + new() { Latitude = 48.25667128564209, Longitude = 37.49852377319337 }, + new() { Latitude = 48.25258535732375, Longitude = 37.513801635742195 }, + new() { Latitude = 48.25729986101625, Longitude = 37.52968031311036 }, + new() { Latitude = 48.25169955357248, Longitude = 37.540752471923835 }, + new() { Latitude = 48.25718557515946, Longitude = 37.555257858276374 }, + new() { Latitude = 48.26644190177958, Longitude = 37.541009963989265 } + } + }; + + Console.WriteLine("Step 1: Creating extended route with RequestMaps=true"); + Console.WriteLine($" Action Points: {request.Points.Count}"); + Console.WriteLine($" Region Size: {request.RegionSizeMeters}m"); + Console.WriteLine($" Zoom Level: {request.ZoomLevel}"); + Console.WriteLine($" Request Maps: {request.RequestMaps}"); + Console.WriteLine($" Location: ~10km east of original complex route"); + Console.WriteLine(); + Console.WriteLine("Route Path (first 5 and last 5 points):"); + for (int i = 0; i < Math.Min(5, request.Points.Count); i++) + { + Console.WriteLine($" {i + 1}. ({request.Points[i].Latitude}, {request.Points[i].Longitude})"); + } + Console.WriteLine(" ..."); + for (int i = Math.Max(5, request.Points.Count - 5); i < request.Points.Count; i++) + { + Console.WriteLine($" {i + 1}. ({request.Points[i].Latitude}, {request.Points[i].Longitude})"); + } + Console.WriteLine(); + + var routeResponse = await httpClient.PostAsJsonAsync("/api/satellite/route", request); + + if (!routeResponse.IsSuccessStatusCode) + { + var errorContent = await routeResponse.Content.ReadAsStringAsync(); + throw new Exception($"Route creation failed: {routeResponse.StatusCode} - {errorContent}"); + } + + var route = await routeResponse.Content.ReadFromJsonAsync(JsonOptions); + + if (route == null) + { + throw new Exception("No route data returned"); + } + + Console.WriteLine($"✓ Route created with {route.TotalPoints} total points"); + Console.WriteLine($" Distance: {route.TotalDistanceMeters:F2}m"); + Console.WriteLine($" Request Maps: {route.RequestMaps}"); + Console.WriteLine($" Maps Ready: {route.MapsReady}"); + Console.WriteLine(); + + var startPoints = route.Points.Count(p => p.PointType == "start"); + var endPoints = route.Points.Count(p => p.PointType == "end"); + var actionPoints = route.Points.Count(p => p.PointType == "action"); + var intermediatePoints = route.Points.Count(p => p.PointType == "intermediate"); + + Console.WriteLine("Point Type Distribution:"); + Console.WriteLine($" Start: {startPoints}"); + Console.WriteLine($" Action: {actionPoints}"); + Console.WriteLine($" Intermediate: {intermediatePoints}"); + Console.WriteLine($" End: {endPoints}"); + Console.WriteLine(); + + if (startPoints != 1) + { + throw new Exception($"Expected 1 start point, got {startPoints}"); + } + + if (endPoints != 1) + { + throw new Exception($"Expected 1 end point, got {endPoints}"); + } + + if (actionPoints != 18) + { + throw new Exception($"Expected 18 action points (excluding start/end), got {actionPoints}"); + } + + if (!route.RequestMaps) + { + throw new Exception("Expected RequestMaps to be true"); + } + + if (route.MapsReady) + { + throw new Exception("Expected MapsReady to be false initially"); + } + + Console.WriteLine("Step 2: Waiting for extended route maps to be ready"); + Console.WriteLine(" (Processing regions SEQUENTIALLY to avoid API throttling)"); + Console.WriteLine(" (This will take several minutes for 20 action points)"); + Console.WriteLine(); + + RouteResponseModel? finalRoute = null; + int maxAttempts = 360; + int pollInterval = 3000; + + for (int attempt = 0; attempt < maxAttempts; attempt++) + { + await Task.Delay(pollInterval); + + var getResponse = await httpClient.GetAsync($"/api/satellite/route/{routeId}"); + + if (!getResponse.IsSuccessStatusCode) + { + throw new Exception($"Failed to get route status: {getResponse.StatusCode}"); + } + + var currentRoute = await getResponse.Content.ReadFromJsonAsync(JsonOptions); + + if (currentRoute == null) + { + throw new Exception("No route returned"); + } + + if (currentRoute.MapsReady) + { + finalRoute = currentRoute; + Console.WriteLine($"✓ Extended route maps ready in approximately {attempt * pollInterval / 1000}s"); + break; + } + + if (attempt % 10 == 0) + { + Console.WriteLine($" Waiting... (attempt {attempt + 1}/{maxAttempts})"); + } + + if (attempt == maxAttempts - 1) + { + throw new Exception($"Timeout: Extended route maps did not become ready in {maxAttempts * pollInterval / 1000}s"); + } + } + + if (finalRoute == null) + { + throw new Exception("Final route is null"); + } + + Console.WriteLine(); + + Console.WriteLine("Step 3: Verifying generated files"); + + if (string.IsNullOrEmpty(finalRoute.CsvFilePath)) + { + throw new Exception("CSV file path is null or empty"); + } + + if (string.IsNullOrEmpty(finalRoute.SummaryFilePath)) + { + throw new Exception("Summary file path is null or empty"); + } + + if (string.IsNullOrEmpty(finalRoute.StitchedImagePath)) + { + throw new Exception("Stitched image path is null or empty"); + } + + if (!File.Exists(finalRoute.CsvFilePath)) + { + throw new Exception($"CSV file not found: {finalRoute.CsvFilePath}"); + } + + if (!File.Exists(finalRoute.SummaryFilePath)) + { + throw new Exception($"Summary file not found: {finalRoute.SummaryFilePath}"); + } + + if (!File.Exists(finalRoute.StitchedImagePath)) + { + throw new Exception($"Stitched image not found: {finalRoute.StitchedImagePath}"); + } + + var csvLines = await File.ReadAllLinesAsync(finalRoute.CsvFilePath); + var uniqueTileCount = csvLines.Length - 1; + + var stitchedInfo = new FileInfo(finalRoute.StitchedImagePath); + + Console.WriteLine("Files Generated:"); + Console.WriteLine($" ✓ CSV: {Path.GetFileName(finalRoute.CsvFilePath)} ({uniqueTileCount} tiles)"); + Console.WriteLine($" ✓ Summary: {Path.GetFileName(finalRoute.SummaryFilePath)}"); + Console.WriteLine($" ✓ Stitched Map: {Path.GetFileName(finalRoute.StitchedImagePath)} ({stitchedInfo.Length / 1024:F2} KB)"); + Console.WriteLine(); + + Console.WriteLine("Route Summary:"); + Console.WriteLine($" Route ID: {finalRoute.Id}"); + Console.WriteLine($" Total Points: {finalRoute.TotalPoints}"); + Console.WriteLine($" Action Points: {actionPoints}"); + Console.WriteLine($" Distance: {finalRoute.TotalDistanceMeters:F2}m"); + Console.WriteLine($" Unique Tiles: {uniqueTileCount}"); + Console.WriteLine($" Maps Ready: {finalRoute.MapsReady}"); + Console.WriteLine(); + + if (uniqueTileCount < 20) + { + throw new Exception($"Expected at least 20 unique tiles for extended route, got {uniqueTileCount}"); + } + + if (stitchedInfo.Length < 1024) + { + throw new Exception($"Stitched image seems too small: {stitchedInfo.Length} bytes"); + } + + Console.WriteLine("✓ Extended Route with 20 Points (10km East) Test: PASSED"); + } } diff --git a/docker-compose.tests.yml b/docker-compose.tests.yml index 5576d50..400ec44 100644 --- a/docker-compose.tests.yml +++ b/docker-compose.tests.yml @@ -24,3 +24,6 @@ services: condition: service_started restart: "no" +volumes: + postgres_data: +