return mock db when mock feature is enabled

This commit is contained in:
Namekuji 2023-05-25 21:40:04 -04:00
parent 0ad9f00cac
commit ab58f69c31
5 changed files with 37 additions and 16 deletions

View File

@ -5,7 +5,14 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[features]
mock = []
[dependencies]
once_cell = "1.17.1"
sea-orm = { version = "0.11.3", features = ["sqlx-postgres", "runtime-tokio-rustls", "mock"] }
sea-orm = { version = "0.11.3", features = ["sqlx-postgres", "runtime-tokio-rustls"] }
thiserror = "1.0.40"
tokio = { version = "1.28.1", features = ["macros"] }
[dev-dependencies]
sea-orm = { version = "0.11.3", features = ["sqlx-postgres", "sqlx-sqlite", "runtime-tokio-rustls", "mock"] }

View File

@ -1,6 +1,6 @@
use sea_orm::error::DbErr;
#[derive(thiserror::Error, Debug)]
#[derive(thiserror::Error, Debug, PartialEq, Eq)]
pub enum Error {
#[error("The database connections have not been initialized yet")]
Uninitialized,

View File

@ -1,13 +1,15 @@
pub mod error;
use once_cell::sync::{Lazy, OnceCell};
use sea_orm::{Database, DatabaseBackend, DatabaseConnection, MockDatabase};
use sea_orm::{Database, DatabaseConnection};
use crate::error::Error;
static DB_CONN: OnceCell<DatabaseConnection> = OnceCell::new();
static DB_MOCK: Lazy<DatabaseConnection> =
Lazy::new(|| MockDatabase::new(DatabaseBackend::Postgres).into_connection());
static DB_CONN: once_cell::sync::OnceCell<DatabaseConnection> = once_cell::sync::OnceCell::new();
#[cfg(feature = "mock")]
static DB_MOCK: once_cell::sync::Lazy<DatabaseConnection> = once_cell::sync::Lazy::new(|| {
sea_orm::MockDatabase::new(sea_orm::DatabaseBackend::Postgres).into_connection()
});
pub async fn init_database(connection_uri: impl Into<String>) -> Result<(), Error> {
let conn = Database::connect(connection_uri.into()).await?;
@ -16,19 +18,26 @@ pub async fn init_database(connection_uri: impl Into<String>) -> Result<(), Erro
}
pub fn get_database() -> Result<&'static DatabaseConnection, Error> {
if cfg!(test) {
Ok(&DB_MOCK)
} else {
DB_CONN.get().ok_or(Error::Uninitialized)
}
#[cfg(feature = "mock")]
return Ok(&DB_MOCK);
#[cfg(not(feature = "mock"))]
DB_CONN.get().ok_or(Error::Uninitialized)
}
#[cfg(test)]
mod tests {
use super::get_database;
use crate::{error::Error, init_database};
#[test]
fn can_get_mock() {
get_database().unwrap().as_mock_connection();
fn error_uninitialized() {
assert_eq!(get_database().unwrap_err(), Error::Uninitialized);
}
#[tokio::test]
async fn connect_in_memory_sqlite() -> Result<(), Error> {
init_database("sqlite::memory:").await?;
get_database()?;
Ok(())
}
}

View File

@ -13,9 +13,14 @@ jsonschema = "0.17.0"
once_cell = "1.17.1"
parse-display = "0.8.0"
schemars = { version = "0.8.12", features = ["chrono"] }
sea-orm = { version = "0.11.3", features = ["postgres-array", "sqlx-postgres", "runtime-tokio-rustls", "mock"] }
sea-orm = { version = "0.11.3", features = ["postgres-array", "sqlx-postgres", "runtime-tokio-rustls"] }
serde = { version = "1.0.163", features = ["derive"] }
serde_json = "1.0.96"
thiserror = "1.0.40"
tokio = { version = "1.28.1", features = ["sync"] }
util = { path = "../util" }
utoipa = "3.3.0"
[dev-dependencies]
database = { path = "../database", features = ["mock"] }
sea-orm = { version = "0.11.3", features = ["postgres-array", "sqlx-postgres", "runtime-tokio-rustls", "mock"] }

View File

@ -1,4 +1,4 @@
#[derive(thiserror::Error, Debug)]
#[derive(thiserror::Error, Debug, PartialEq, Eq)]
pub enum Error {
#[error("Failed to parse string")]
ParseError(#[from] parse_display::ParseError),