# Geo Service Tests Comprehensive test suite for all GraphQL endpoints in the geo service. ## Test Coverage ### Basic Endpoints (4 tests) - `test_products_query` - List all unique products - `test_nodes_query_basic` - List hubs/nodes without filters - `test_nodes_query_with_filters` - Filter nodes by transport type and country - `test_nodes_query_with_bounds` - Filter nodes by geographic bounds - `test_clustered_nodes_query` - Map clustering for visualization ### Nearest Endpoints (6 tests) - `test_nearest_hubs` - Find hubs near coordinates - `test_nearest_hubs_with_product_filter` - Find hubs with specific product - `test_nearest_offers` - Find offers near coordinates - `test_nearest_offers_with_product_filter` - Find offers for specific product - `test_nearest_suppliers` - Find suppliers near coordinates - `test_nearest_suppliers_with_product_filter` - Find suppliers with product ### Routing Endpoints (3 tests) - `test_route_to_coordinate` - Multi-hop route from offer to destination - `test_auto_route` - Road route between coordinates (requires OSRM) - `test_rail_route` - Rail route between coordinates ### Edge Cases (3 tests) - `test_nearest_with_zero_radius` - Very small search radius - `test_invalid_coordinates` - Invalid lat/lon values - `test_nonexistent_uuid` - Non-existent offer UUID **Total: 16 tests covering 8 main endpoints** ## Running Tests ### Local Testing (against production) ```bash cd backends/geo poetry install poetry run pytest tests/test_graphql_endpoints.py -v ``` ### Testing against different endpoint ```bash export TEST_GEO_URL=https://geo-staging.example.com/graphql/public/ poetry run pytest tests/test_graphql_endpoints.py -v ``` ### Run specific test class ```bash poetry run pytest tests/test_graphql_endpoints.py::TestNearestEndpoints -v ``` ### Run single test ```bash poetry run pytest tests/test_graphql_endpoints.py::TestNearestEndpoints::test_nearest_offers -v ``` ### Show print output ```bash poetry run pytest tests/test_graphql_endpoints.py -v -s ``` ## CI Integration Tests should be run on each deployment: ```yaml # .gitea/workflows/test.yml - name: Run geo endpoint tests run: | cd backends/geo poetry install export TEST_GEO_URL=https://geo.optovia.ru/graphql/public/ poetry run pytest tests/test_graphql_endpoints.py -v ``` ## Test Data Requirements Tests use real data from the production/staging database. Required data: - At least one product in `products` collection - At least one hub node with coordinates - At least one offer with coordinates - Graph edges for routing tests ## Expected Test Results All tests should pass on production environment. Some tests may be skipped if: - No products exist: `test_nearest_hubs_with_product_filter`, `test_nearest_offers_with_product_filter` - No offers exist: `test_route_to_coordinate` - OSRM not configured: `test_auto_route`, `test_rail_route` (warnings, not failures) ## Troubleshooting ### All nearest* tests return 0 results Check that nodes collection has documents with: - Valid `latitude` and `longitude` fields (not null) - Correct `node_type` field (`'hub'`, `'offer'`, `'supplier'`) Query ArangoDB directly: ```javascript // Count offers with coordinates db._query(` FOR node IN nodes FILTER node.node_type == 'offer' FILTER node.latitude != null AND node.longitude != null RETURN node `).toArray().length ``` ### Test failures with 400 errors Check GraphQL schema matches test queries. GraphQL validation errors indicate: - Missing required arguments - Wrong argument types - Invalid field names ### Connection errors Verify: - TEST_GEO_URL points to correct endpoint - Endpoint is accessible (not behind VPN/firewall) - GraphQL endpoint is `/graphql/public/` not `/graphql/`