testkit_core/handlers/
setup.rs

1// src/handlers/setup.rs
2use 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
11/// Handler for database setup operations
12pub 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
21/// Create a new setup handler
22pub 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}