Start a mock REST server with configuration. # Arguments `warehouse` - Warehouse path. `data_path` - Data path for storage. `config` - Configuration response containing defaults like prefix. `initial_dbs` - Initial databases to create. # Returns A RESTServer with address and control.
(
warehouse: String,
data_path: String,
config: ConfigResponse,
initial_dbs: Vec<String>,
)
| 692 | /// # Returns |
| 693 | /// A RESTServer with address and control. |
| 694 | pub async fn start_mock_server( |
| 695 | warehouse: String, |
| 696 | data_path: String, |
| 697 | config: ConfigResponse, |
| 698 | initial_dbs: Vec<String>, |
| 699 | ) -> RESTServer { |
| 700 | let mut server = RESTServer::new(warehouse, data_path, config, initial_dbs); |
| 701 | |
| 702 | // Build routes based on prefix from config |
| 703 | let prefix = server.resource_paths().base_path(); |
| 704 | let state = Arc::new(server.clone()); |
| 705 | let app = Router::new() |
| 706 | // Config endpoint (for RESTApi initialization) |
| 707 | .route("/v1/config", get(RESTServer::get_config)) |
| 708 | // Database routes |
| 709 | .route( |
| 710 | &format!("{prefix}/databases"), |
| 711 | get(RESTServer::list_databases).post(RESTServer::create_database), |
| 712 | ) |
| 713 | .route( |
| 714 | &format!("{prefix}/databases/:name"), |
| 715 | get(RESTServer::get_database) |
| 716 | .post(RESTServer::alter_database) |
| 717 | .delete(RESTServer::drop_database), |
| 718 | ) |
| 719 | .route( |
| 720 | &format!("{prefix}/databases/:db/tables"), |
| 721 | get(RESTServer::list_tables).post(RESTServer::create_table), |
| 722 | ) |
| 723 | .route( |
| 724 | &format!("{prefix}/databases/:db/tables/:table"), |
| 725 | get(RESTServer::get_table).delete(RESTServer::drop_table), |
| 726 | ) |
| 727 | .route( |
| 728 | &format!("{prefix}/tables/rename"), |
| 729 | post(RESTServer::rename_table), |
| 730 | ) |
| 731 | // ECS metadata endpoints (for token loader testing) |
| 732 | .route( |
| 733 | "/ram/security-credentials/", |
| 734 | get(RESTServer::list_ecs_roles), |
| 735 | ) |
| 736 | .route( |
| 737 | "/ram/security-credentials/:role", |
| 738 | get(RESTServer::get_ecs_metadata), |
| 739 | ) |
| 740 | .layer(Extension(state)); |
| 741 | |
| 742 | let listener = tokio::net::TcpListener::bind(("127.0.0.1", 0)) |
| 743 | .await |
| 744 | .expect("bind failed"); |
| 745 | let addr = listener.local_addr().unwrap(); |
| 746 | |
| 747 | let server_handle = tokio::spawn(async move { |
| 748 | if let Err(e) = serve(listener, app.into_make_service()).await { |
| 749 | eprintln!("mock server error: {e}"); |
| 750 | } |
| 751 | }); |
no test coverage detected