diff --git a/apps/aether-gateway/src/data/state/testing/mod.rs b/apps/aether-gateway/src/data/state/testing/mod.rs index 486d6f435..6977eb723 100644 --- a/apps/aether-gateway/src/data/state/testing/mod.rs +++ b/apps/aether-gateway/src/data/state/testing/mod.rs @@ -877,6 +877,34 @@ impl GatewayDataState { self } + /// Attach the minimal enabled system-default strategy needed by request + /// execution tests. Production startup creates this row during database + /// bootstrap; isolated test data states bypass that startup path. + #[cfg(test)] + pub(crate) fn with_default_routing_group_for_tests(self) -> Self { + use aether_data::repository::routing_profiles::InMemoryRoutingGroupRepository; + use aether_data_contracts::repository::routing_profiles::StoredRoutingGroup; + + let repository = Arc::new(InMemoryRoutingGroupRepository::seed( + vec![StoredRoutingGroup { + id: "test-system-default".to_string(), + name: "test-system-default".to_string(), + description: None, + enabled: true, + is_system_default: true, + sort_order: 0, + config_json: serde_json::json!({}), + version: 1, + created_at: 1, + updated_at: 1, + published_at: None, + }], + Vec::new(), + Vec::new(), + )); + self.with_routing_group_repository_for_tests(repository) + } + #[cfg(test)] pub(crate) fn with_auth_api_key_reader( mut self, diff --git a/apps/aether-gateway/src/state/testing.rs b/apps/aether-gateway/src/state/testing.rs index 504ee8c6f..d8f544cf7 100644 --- a/apps/aether-gateway/src/state/testing.rs +++ b/apps/aether-gateway/src/state/testing.rs @@ -17,6 +17,20 @@ use crate::{provider_transport, usage}; #[cfg(test)] impl AppState { pub(crate) fn with_data_state_for_tests(mut self, data_state: GatewayDataState) -> Self { + // Request-execution fixtures provide candidate and provider data but + // bypass the production startup bootstrap that creates the enabled + // system-default routing group. Keep those isolated states aligned + // with the real gateway contract while leaving intentionally disabled + // or routing-only fixtures untouched. + let data_state = if data_state.has_minimal_candidate_selection_reader() + && data_state.has_provider_catalog_reader() + && !data_state.has_routing_group_reader() + && !data_state.has_routing_group_writer() + { + data_state.with_default_routing_group_for_tests() + } else { + data_state + }; self.replace_data_state(Arc::new(data_state)); self.request_candidate_queue = None; self