mirror of
https://github.com/azaion/satellite-provider.git
synced 2026-06-21 14:31:13 +00:00
[AZ-284] Autodev baseline + testability refactor
Phase A baseline outputs from /autodev (Steps 1-5): - Problem & solution docs (_docs/00_problem, _docs/01_solution) - Codebase documentation (_docs/02_document) incl. architecture, module-layout, glossary, system-flows, baseline compliance scan - Test specs (blackbox, performance, resilience, security, resource, traceability matrix) - Test task decomposition (_docs/02_tasks/todo): AZ-285..AZ-290 - Testability refactor (_docs/04_refactoring/01-testability-refactoring): - TC-01 Move DownloadedTileInfoV2 + new ExistingTileInfo to Common.DTO - TC-02 Replace dead ISatelliteDownloader API with real signatures - TC-03 GoogleMapsDownloaderV2 implements ISatelliteDownloader - TC-04 TileService depends on ISatelliteDownloader (mockable) - TC-05 DI + endpoints use ISatelliteDownloader - Test runner scripts (scripts/run-tests.sh, run-performance-tests.sh) - Autodev state pointer (_docs/_autodev_state.md) Prepares the codebase for AZ-285..AZ-290 unit/integration test work. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
# Expected Results Report
|
||||
|
||||
## Tile Expected Results
|
||||
|
||||
| Input ID | Expected Result | Tolerance | Pass/Fail Criterion |
|
||||
|----------|----------------|-----------|---------------------|
|
||||
| TILE-01 | Tile downloaded and stored | — | HTTP 200; response has: zoomLevel=18, tileSizePixels=256, imageType="jpg", filePath non-empty |
|
||||
| TILE-01 (reuse) | Same tile returned from cache | — | Second request returns same tile ID; no re-download |
|
||||
|
||||
## Region Expected Results
|
||||
|
||||
| Input ID | Expected Result | Tolerance | Pass/Fail Criterion |
|
||||
|----------|----------------|-----------|---------------------|
|
||||
| REG-01 | Region processes to completion | < 240s | status="completed"; csvFilePath non-empty; summaryFilePath non-empty |
|
||||
| REG-02 | Region processes to completion | < 240s | status="completed"; csvFilePath non-empty; summaryFilePath non-empty |
|
||||
| REG-03 | Region with stitching completes | < 240s | status="completed"; csvFilePath non-empty; summaryFilePath non-empty; stitched image file > 1024 bytes |
|
||||
| REG-01 (tile count) | Tiles downloaded > 0 | — | tilesDownloaded + tilesReused > 0 |
|
||||
|
||||
## Route Expected Results
|
||||
|
||||
| Input ID | Expected Result | Tolerance | Pass/Fail Criterion |
|
||||
|----------|----------------|-----------|---------------------|
|
||||
| ROUTE-01 | Route created with interpolated points | — | totalPoints > 2; all intermediate point spacing ≤ 200m; original point count = 2 (first + last) |
|
||||
| ROUTE-01 (retrieval) | Route retrievable by ID | — | GET /api/satellite/route/{id} returns same route with all points |
|
||||
| ROUTE-02 | Route maps processed | < 180s | mapsReady=true; stitchedImagePath non-empty; csvFilePath non-empty; stitched image > 1024 bytes |
|
||||
| ROUTE-03 | Route with ZIP created | < 180s | mapsReady=true; tilesZipPath non-empty; ZIP file > 1024 bytes; ZIP entry count = unique tile count from CSV; ZIP entries start with "tiles/" path prefix; ZIP has directory structure (≥5 path parts) |
|
||||
| ROUTE-04 | Complex route maps processed | < 240s | mapsReady=true; uniqueTileCount ≥ 10; stitched image > 1024 bytes |
|
||||
| ROUTE-05 | Route with geofences processed | < 240s | mapsReady=true; uniqueTileCount ≥ 10; stitched image > 1024 bytes; geofence regions created |
|
||||
| ROUTE-06 | Extended route maps processed | < 360s | mapsReady=true; uniqueTileCount ≥ 20; stitched image > 1024 bytes |
|
||||
|
||||
## Point Interpolation Expected Results
|
||||
|
||||
| Input | Expected | Tolerance | Pass/Fail Criterion |
|
||||
|-------|----------|-----------|---------------------|
|
||||
| ROUTE-01 (2 points, ~1.2km apart) | Points interpolated every ~200m | spacing ≤ 200m | Every consecutive point pair has distance ≤ 200m; point_type for first = "original", intermediates = "intermediate", last = "original" |
|
||||
| ROUTE-04 (10 points) | Original points: first + last = 2; intermediate points = 8 per pair | — | ValidatePointTypes(route, 1, 1, 8) — 1 first-original, 1 last-original, 8 intermediate |
|
||||
| ROUTE-06 (20 points) | Original points: first + last = 2; intermediate points = 18 | — | ValidatePointTypes(route, 1, 1, 18) |
|
||||
|
||||
## API Behavior Expected Results
|
||||
|
||||
| Scenario | Expected | Pass/Fail Criterion |
|
||||
|----------|----------|---------------------|
|
||||
| Region request (POST) | Immediate response with pending status | HTTP 200; response.status = "pending" or "processing" |
|
||||
| Region poll (GET) | Status transitions correctly | Eventually reaches "completed" or "failed" |
|
||||
| Invalid route (< 2 points) | Rejected | HTTP 400 or validation error |
|
||||
| Tile reuse | Same tile not re-downloaded | tilesReused > 0 when requesting overlapping regions |
|
||||
|
||||
## Timing Constraints
|
||||
|
||||
| Operation | Max Duration | Source |
|
||||
|-----------|-------------|--------|
|
||||
| Single tile download | 30s | HttpClient timeout |
|
||||
| Region processing (200m, zoom 18) | 240s | Integration test poll limit |
|
||||
| Route map processing (2 points) | 180s | Integration test poll limit |
|
||||
| Route map processing (10 points) | 240s | Integration test poll limit |
|
||||
| Route map processing (20 points) | 360s | Integration test poll limit |
|
||||
| API readiness on startup | 60s | WaitForApiReady (30 retries × 2s) |
|
||||
@@ -0,0 +1,95 @@
|
||||
# Test Coordinates and Input Data
|
||||
|
||||
## Geographic Test Region
|
||||
|
||||
All test data is centered around eastern Ukraine (Donetsk oblast area):
|
||||
- Primary tile/region test point: 47.461747°N, 37.647063°E
|
||||
- Primary route test area: ~48.27°N, 37.38°E
|
||||
|
||||
## Tile Inputs
|
||||
|
||||
| ID | Latitude | Longitude | Zoom Level |
|
||||
|----|----------|-----------|------------|
|
||||
| TILE-01 | 47.461747 | 37.647063 | 18 |
|
||||
|
||||
## Region Inputs
|
||||
|
||||
| ID | Latitude | Longitude | Size (m) | Zoom | Stitch |
|
||||
|----|----------|-----------|----------|------|--------|
|
||||
| REG-01 | 47.461747 | 37.647063 | 200 | 18 | false |
|
||||
| REG-02 | 47.461747 | 37.647063 | 400 | 17 | false |
|
||||
| REG-03 | 47.461747 | 37.647063 | 500 | 18 | true |
|
||||
|
||||
## Route Inputs
|
||||
|
||||
### ROUTE-01: Simple (2 points, no maps)
|
||||
|
||||
| Point | Latitude | Longitude |
|
||||
|-------|----------|-----------|
|
||||
| 1 (original) | 48.276067180586544 | 37.38445758819581 |
|
||||
| 2 (original) | 48.27074009522731 | 37.374029159545906 |
|
||||
|
||||
Config: regionSizeMeters=500, zoomLevel=18, requestMaps=false
|
||||
|
||||
### ROUTE-02: With Region Processing (2 points, maps)
|
||||
|
||||
Same points as ROUTE-01.
|
||||
Config: regionSizeMeters=300, zoomLevel=18, requestMaps=true
|
||||
|
||||
### ROUTE-03: With Tiles ZIP (2 points, maps + zip)
|
||||
|
||||
Same points as ROUTE-01.
|
||||
Config: regionSizeMeters=500, zoomLevel=18, requestMaps=true, createTilesZip=true
|
||||
|
||||
### ROUTE-04: Complex (10 points, maps)
|
||||
|
||||
| Point | Latitude | Longitude |
|
||||
|-------|----------|-----------|
|
||||
| 1 | 48.276067180586544 | 37.38445758819581 |
|
||||
| 2 | 48.27074009522731 | 37.374029159545906 |
|
||||
| 3 | 48.263312668696855 | 37.37707614898682 |
|
||||
| 4 | 48.26539817051818 | 37.36587524414063 |
|
||||
| 5 | 48.25851283439989 | 37.35952377319337 |
|
||||
| 6 | 48.254426906081555 | 37.374801635742195 |
|
||||
| 7 | 48.25914140977405 | 37.39068031311036 |
|
||||
| 8 | 48.25354110233028 | 37.401752471923835 |
|
||||
| 9 | 48.25902712391726 | 37.416257858276374 |
|
||||
| 10 | 48.26828345053738 | 37.402009963989265 |
|
||||
|
||||
Config: regionSizeMeters=300, zoomLevel=18, requestMaps=true
|
||||
|
||||
### ROUTE-05: Complex with Geofences (10 points + 2 geofences, maps)
|
||||
|
||||
Same 10 points as ROUTE-04.
|
||||
Geofences:
|
||||
- Polygon 1: NW(48.280, 37.370) → SE(48.265, 37.395)
|
||||
- Polygon 2: NW(48.265, 37.390) → SE(48.250, 37.420)
|
||||
|
||||
Config: regionSizeMeters=300, zoomLevel=18, requestMaps=true
|
||||
|
||||
### ROUTE-06: Extended (20 points, maps)
|
||||
|
||||
| Point | Latitude | Longitude |
|
||||
|-------|----------|-----------|
|
||||
| 1 | 48.276067180586544 | 37.51945758819581 |
|
||||
| 2 | 48.27074009522731 | 37.509029159545906 |
|
||||
| 3 | 48.263312668696855 | 37.51207614898682 |
|
||||
| 4 | 48.26539817051818 | 37.50087524414063 |
|
||||
| 5 | 48.25851283439989 | 37.49452377319337 |
|
||||
| 6 | 48.254426906081555 | 37.509801635742195 |
|
||||
| 7 | 48.25914140977405 | 37.52568031311036 |
|
||||
| 8 | 48.25354110233028 | 37.536752471923835 |
|
||||
| 9 | 48.25902712391726 | 37.551257858276374 |
|
||||
| 10 | 48.26828345053738 | 37.537009963989265 |
|
||||
| 11 | 48.27421563182974 | 37.52345758819581 |
|
||||
| 12 | 48.26889854647051 | 37.513029159545906 |
|
||||
| 13 | 48.26147111993905 | 37.51607614898682 |
|
||||
| 14 | 48.26355662176038 | 37.50487524414063 |
|
||||
| 15 | 48.25667128564209 | 37.49852377319337 |
|
||||
| 16 | 48.25258535732375 | 37.513801635742195 |
|
||||
| 17 | 48.25729986101625 | 37.52968031311036 |
|
||||
| 18 | 48.25169955357248 | 37.540752471923835 |
|
||||
| 19 | 48.25718557515946 | 37.555257858276374 |
|
||||
| 20 | 48.26644190177958 | 37.541009963989265 |
|
||||
|
||||
Config: regionSizeMeters=300, zoomLevel=18, requestMaps=true
|
||||
Reference in New Issue
Block a user