Creates a simple mock server to simulate the SSV API endpoint under various conditions for testing. Note this ignores
(
port: u16,
state: Option<SsvMockState>,
)
| 27 | /// Creates a simple mock server to simulate the SSV API endpoint under |
| 28 | /// various conditions for testing. Note this ignores |
| 29 | pub async fn create_mock_ssv_server( |
| 30 | port: u16, |
| 31 | state: Option<SsvMockState>, |
| 32 | ) -> Result<JoinHandle<()>, axum::Error> { |
| 33 | let data = include_str!("../../tests/data/ssv_valid.json"); |
| 34 | let response = serde_json::from_str::<SSVResponse>(data).expect("failed to parse test data"); |
| 35 | let state = state.unwrap_or(SsvMockState { |
| 36 | validators: Arc::new(RwLock::new(response.validators)), |
| 37 | force_timeout: Arc::new(RwLock::new(false)), |
| 38 | }); |
| 39 | let router = axum::Router::new() |
| 40 | .route( |
| 41 | "/api/v4/{chain_name}/validators/in_operator/{node_operator_id}", |
| 42 | get(handle_validators), |
| 43 | ) |
| 44 | .route("/big_data", get(handle_big_data)) |
| 45 | .with_state(state) |
| 46 | .into_make_service(); |
| 47 | |
| 48 | let address = SocketAddr::from(([127, 0, 0, 1], port)); |
| 49 | let listener = TcpListener::bind(address).await.map_err(axum::Error::new)?; |
| 50 | let server = axum::serve(listener, router).with_graceful_shutdown(async { |
| 51 | tokio::signal::ctrl_c().await.expect("Failed to listen for shutdown signal"); |
| 52 | }); |
| 53 | let result = Ok(tokio::spawn(async move { |
| 54 | if let Err(e) = server.await { |
| 55 | eprintln!("Server error: {e}"); |
| 56 | } |
| 57 | })); |
| 58 | info!("Mock server started on http://localhost:{port}/"); |
| 59 | result |
| 60 | } |
| 61 | |
| 62 | /// Returns a valid SSV validators response, or a timeout if requested in |
| 63 | /// the server state |
no outgoing calls