async-mongodb-session 3.0.0

An async-session implementation for MongoDB
Documentation
#[cfg(test)]
mod tests {
    use std::future::Future;

    #[cfg(feature = "async-std-runtime")]
    fn run_test<F: Future>(future: F) -> F::Output {
        async_std::task::block_on(future)
    }

    #[cfg(feature = "tokio-runtime")]
    fn run_test<F: Future>(future: F) -> F::Output {
        let rt = tokio::runtime::Runtime::new().unwrap();
        rt.block_on(future)
    }

    use async_mongodb_session::*;
    use async_session::{Session, SessionStore};
    use lazy_static::lazy_static;
    use mongodb::{options::ClientOptions, Client};
    use rand::Rng;
    use std::env;

    lazy_static! {
        static ref HOST: String = env::var("HOST").unwrap_or_else(|_| "127.0.0.1".to_string());
        static ref PORT: String = env::var("PORT").unwrap_or_else(|_| "27017".to_string());
        static ref DATABASE: String =
            env::var("DATABASE").unwrap_or_else(|_| "db_name".to_string());
        static ref COLLECTION: String =
            env::var("COLLECTION").unwrap_or_else(|_| "collection".to_string());
        static ref CONNECTION_STRING: String =
            format!("mongodb://{}:{}/", HOST.as_str(), PORT.as_str());
    }

    async fn from_client() -> async_session::Result {
        let client_options = match ClientOptions::parse(CONNECTION_STRING.as_str()).await {
            Ok(c) => c,
            Err(e) => panic!("Client Options Failed: {}", e),
        };

        let client = match Client::with_options(client_options) {
            Ok(c) => c,
            Err(e) => panic!("Client Creation Failed: {}", e),
        };

        let store = MongodbSessionStore::from_client(client, &DATABASE, &COLLECTION);
        let mut rng = rand::thread_rng();
        let n2: u16 = rng.gen();
        let key = format!("key-{}", n2);
        let value = format!("value-{}", n2);
        let mut session = Session::new();
        session.insert(&key, &value)?;

        let cookie_value = store.store_session(session).await?.unwrap();
        let session = store.load_session(cookie_value).await?.unwrap();
        assert_eq!(&session.get::<String>(&key).unwrap(), &value);

        Ok(())
    }

    async fn new() -> async_session::Result {
        let store = MongodbSessionStore::new(&CONNECTION_STRING, &DATABASE, &COLLECTION).await?;

        let mut rng = rand::thread_rng();
        let n2: u16 = rng.gen();
        let key = format!("key-{}", n2);
        let value = format!("value-{}", n2);
        let mut session = Session::new();
        session.insert(&key, &value)?;

        let cookie_value = store.store_session(session).await?.unwrap();
        let session = store.load_session(cookie_value).await?.unwrap();
        assert_eq!(&session.get::<String>(&key).unwrap(), &value);

        Ok(())
    }

    async fn with_expire() -> async_session::Result {
        let store = MongodbSessionStore::new(&CONNECTION_STRING, &DATABASE, &COLLECTION).await?;

        store.initialize().await?;

        let mut rng = rand::thread_rng();
        let n2: u16 = rng.gen();
        let key = format!("key-{}", n2);
        let value = format!("value-{}", n2);
        let mut session = Session::new();
        session.expire_in(std::time::Duration::from_secs(5));
        session.insert(&key, &value)?;

        let cookie_value = store.store_session(session).await?.unwrap();
        let session = store.load_session(cookie_value).await?.unwrap();
        assert_eq!(&session.get::<String>(&key).unwrap(), &value);

        Ok(())
    }

    async fn check_expired() -> async_session::Result {
        use async_std::task;
        use std::time::Duration;
        let store = MongodbSessionStore::new(&CONNECTION_STRING, &DATABASE, &COLLECTION).await?;

        store.initialize().await?;

        let mut rng = rand::thread_rng();
        let n2: u16 = rng.gen();
        let key = format!("key-{}", n2);
        let value = format!("value-{}", n2);
        let mut session = Session::new();
        session.expire_in(Duration::from_secs(1));
        session.insert(&key, &value)?;

        let cookie_value = store.store_session(session).await?.unwrap();

        task::sleep(Duration::from_secs(1)).await;
        let session_to_recover = store.load_session(cookie_value).await?;

        assert!(&session_to_recover.is_none());

        Ok(())
    }

    #[test]
    fn test_from_client() -> async_session::Result {
        run_test(from_client())
    }

    #[test]
    fn test_new() -> async_session::Result {
        run_test(new())
    }

    #[test]
    fn test_with_expire() -> async_session::Result {
        run_test(with_expire())
    }

    #[test]
    fn test_check_expired() -> async_session::Result {
        run_test(check_expired())
    }
}