use std::sync::Arc;
use crate::storage::StorageBackend;
#[derive(Clone)]
pub struct AppState {
pub storage: Arc<dyn StorageBackend>,
}
impl AppState {
pub fn new(storage: Arc<dyn StorageBackend>) -> Self {
Self { storage }
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::storage::{SqliteBackend, SqliteConfig};
#[tokio::test]
async fn app_state_holds_storage_handle() {
let tmp = tempfile::tempdir().expect("create tempdir");
let backend = SqliteBackend::open(&SqliteConfig {
path: tmp.path().join("local.db"),
})
.await
.expect("open backend");
backend.migrate().await.expect("migrate");
let state = AppState::new(Arc::new(backend));
state
.storage
.healthcheck()
.await
.expect("healthcheck round-trips through dyn StorageBackend");
}
#[tokio::test]
async fn app_state_is_clone() {
let tmp = tempfile::tempdir().expect("create tempdir");
let backend = SqliteBackend::open(&SqliteConfig {
path: tmp.path().join("local.db"),
})
.await
.expect("open backend");
let state = AppState::new(Arc::new(backend));
let clone = state.clone();
assert!(Arc::ptr_eq(&state.storage, &clone.storage));
}
}