rjango 0.1.1

A full-stack Rust backend framework inspired by Django
Documentation
use std::time::Duration;

use sea_orm::{ConnectOptions, Database, DatabaseConnection};

use super::error::DbError;

/// Create a database connection from a URL.
async fn connect_async(url: &str) -> Result<DatabaseConnection, DbError> {
    let mut opts = ConnectOptions::new(url);
    opts.max_connections(100)
        .min_connections(5)
        .connect_timeout(Duration::from_secs(8))
        .acquire_timeout(Duration::from_secs(8))
        .idle_timeout(Duration::from_secs(8))
        .max_lifetime(Duration::from_secs(8))
        .sqlx_logging(false);

    Database::connect(opts).await.map_err(DbError::from)
}

pub fn connect(url: &str) -> Result<DatabaseConnection, DbError> {
    crate::runtime::block_on(connect_async(url))
}

/// Create an in-memory SQLite connection for testing.
async fn connect_test_async() -> Result<DatabaseConnection, DbError> {
    connect_async("sqlite::memory:").await
}

pub fn connect_test() -> Result<DatabaseConnection, DbError> {
    crate::runtime::block_on(connect_test_async())
}

#[cfg(test)]
mod tests {
    use sea_orm::DbBackend;

    use super::connect_test;

    #[test]
    fn connect_test_creates_in_memory_sqlite_connection() {
        let db = connect_test().expect("connect_test should create an in-memory sqlite database");

        assert_eq!(db.get_database_backend(), DbBackend::Sqlite);
        crate::runtime::block_on(db.ping())
            .expect("in-memory sqlite database should respond to ping");
    }
}