use std::collections::HashMap;
use std::sync::Arc;
use axum_test::TestServer;
use crate::api::AppState;
use crate::backend::StubBackend;
use crate::config::{Config, NodeConfig};
use crate::peers::PeerRegistry;
use crate::session::manager::SessionManager;
use crate::store::Store;
pub async fn test_parts() -> (Config, SessionManager, PeerRegistry, Store) {
test_parts_with(|_| {}).await
}
pub async fn test_parts_with(
mutate: impl FnOnce(&mut Config),
) -> (Config, SessionManager, PeerRegistry, Store) {
let tmpdir = tempfile::tempdir().unwrap();
let tmpdir = Box::leak(Box::new(tmpdir));
let store = Store::new(tmpdir.path().to_str().unwrap()).await.unwrap();
store.migrate().await.unwrap();
let mut config = Config {
node: NodeConfig {
name: "test-node".into(),
port: 7433,
data_dir: tmpdir.path().to_str().unwrap().into(),
..NodeConfig::default()
},
..Default::default()
};
mutate(&mut config);
let backend = Arc::new(StubBackend);
let manager = SessionManager::new(backend, store.clone(), None).with_no_stale_grace();
let peer_registry = PeerRegistry::new(&config.peers);
(config, manager, peer_registry, store)
}
pub async fn test_state() -> Arc<AppState> {
test_state_with(|_| {}).await
}
pub async fn test_state_with(mutate: impl FnOnce(&mut Config)) -> Arc<AppState> {
let (config, manager, peer_registry, store) = test_parts_with(mutate).await;
AppState::new(config, manager, peer_registry, store)
}
pub async fn test_state_with_config_path() -> Arc<AppState> {
let tmpdir = tempfile::tempdir().unwrap();
let tmpdir = Box::leak(Box::new(tmpdir));
let store = Store::new(tmpdir.path().to_str().unwrap()).await.unwrap();
store.migrate().await.unwrap();
let backend = Arc::new(StubBackend);
let manager = SessionManager::new(backend, store.clone(), None).with_no_stale_grace();
let peer_registry = PeerRegistry::new(&HashMap::new());
let config_path = tmpdir.path().join("config.toml");
let (event_tx, _) = tokio::sync::broadcast::channel(16);
AppState::with_event_tx(
Config {
node: NodeConfig {
name: "test-node".into(),
port: 7433,
data_dir: tmpdir.path().to_str().unwrap().into(),
..NodeConfig::default()
},
..Default::default()
},
config_path,
manager,
peer_registry,
event_tx,
store,
)
}
pub async fn test_state_with_backend(backend: Arc<dyn crate::backend::Backend>) -> Arc<AppState> {
let tmpdir = tempfile::tempdir().unwrap();
let tmpdir = Box::leak(Box::new(tmpdir));
let store = Store::new(tmpdir.path().to_str().unwrap()).await.unwrap();
store.migrate().await.unwrap();
let manager = SessionManager::new(backend, store.clone(), None).with_no_stale_grace();
let peer_registry = PeerRegistry::new(&HashMap::new());
AppState::new(
Config {
node: NodeConfig {
name: "test-node".into(),
port: 7433,
data_dir: tmpdir.path().to_str().unwrap().into(),
..NodeConfig::default()
},
..Default::default()
},
manager,
peer_registry,
store,
)
}
pub async fn test_server() -> TestServer {
TestServer::new(crate::api::routes::build(test_state().await)).unwrap()
}
pub async fn test_server_with(mutate: impl FnOnce(&mut Config)) -> TestServer {
TestServer::new(crate::api::routes::build(test_state_with(mutate).await)).unwrap()
}