use anyhow::Result;
use sqlx::PgPool;
use std::sync::Arc;
use crate::context::RequestContext;
use crate::session::Session;
use crate::testing::container::postgres;
pub use postgres::pg_singleton as pg_container;
#[derive(Clone)]
pub struct TestContext<C = ()> {
pub inner: C,
pub pool: PgPool
}
impl<C: Default + Clone> TestContext<C> {
pub async fn new() -> Result<Self> {
let pool = postgres::shared_pool().await?.clone();
Ok(Self { inner: C::default(), pool })
}
}
pub type Ctx<C> = RequestContext<TestContext<C>>;
pub async fn get_context<C: Default + Clone>() -> Result<RequestContext<TestContext<C>>> {
let base_pool = postgres::shared_pool().await?.clone();
let pool = Arc::new(base_pool.clone());
let session = Arc::new(Session(Some(1)));
let ctx = RequestContext::<TestContext<C>>::new(
pool,
session,
Arc::new(TestContext { inner: C::default(), pool: base_pool })
)
.await?;
Ok(ctx)
}