testkit_core/handlers/
setup.rs1use async_trait::async_trait;
3use std::fmt::Debug;
4use std::marker::PhantomData;
5
6use crate::{
7 DatabaseBackend, DatabasePool, TestContext,
8 handlers::{IntoTransactionHandler, TransactionHandler},
9};
10
11pub struct SetupHandler<DB, F>
13where
14 DB: DatabaseBackend + Send + Sync + Debug + 'static,
15 F: Send + Sync + 'static,
16{
17 setup_fn: F,
18 _phantom: PhantomData<DB>,
19}
20
21pub fn setup<DB, F, Fut>(setup_fn: F) -> SetupHandler<DB, F>
23where
24 DB: DatabaseBackend + Send + Sync + Debug + 'static,
25 F: FnOnce(&mut <DB::Pool as DatabasePool>::Connection) -> Fut + Send + Sync + 'static,
26 Fut: std::future::Future<Output = Result<(), DB::Error>> + Send + 'static,
27{
28 SetupHandler {
29 setup_fn,
30 _phantom: PhantomData,
31 }
32}
33
34#[async_trait]
35impl<DB, F, Fut> TransactionHandler<DB> for SetupHandler<DB, F>
36where
37 DB: DatabaseBackend + Send + Sync + Debug + 'static,
38 F: FnOnce(&mut <DB::Pool as DatabasePool>::Connection) -> Fut + Send + Sync + 'static,
39 Fut: std::future::Future<Output = Result<(), DB::Error>> + Send + 'static,
40{
41 type Item = ();
42 type Error = DB::Error;
43
44 async fn execute(self, ctx: &mut TestContext<DB>) -> Result<Self::Item, Self::Error> {
45 let mut conn = ctx.db.acquire_connection().await?;
46 (self.setup_fn)(&mut conn).await?;
47 Ok(())
48 }
49}
50
51impl<DB, F, Fut> IntoTransactionHandler<DB> for SetupHandler<DB, F>
52where
53 DB: DatabaseBackend + Send + Sync + Debug + 'static,
54 F: FnOnce(&mut <DB::Pool as DatabasePool>::Connection) -> Fut + Send + Sync + 'static,
55 Fut: std::future::Future<Output = Result<(), DB::Error>> + Send + 'static,
56{
57 type Handler = Self;
58 type Item = ();
59 type Error = DB::Error;
60
61 fn into_transaction_handler(self) -> Self::Handler {
62 self
63 }
64}