Skip to main content

tests_database/
helpers.rs

1use std::env::{self, temp_dir};
2
3use atuin_server_database::{DbSettings, DbType};
4use snowflake_uid::{Config, Generator};
5use sqlx::migrate::MigrateDatabase;
6use url::Url;
7
8fn get_settings(env_uri: Option<String>) -> eyre::Result<DbSettings> {
9    let db_uri = env_uri.unwrap_or_else(|| {
10        let dir = temp_dir();
11        let file = dir.join("atuin_test_db_");
12        let filename = file.to_str().unwrap();
13        format!("sqlite://{filename}")
14    });
15
16    let mut url = Url::parse(&db_uri)?;
17    let cfg = Config::default();
18    let mut generator = Generator::from(cfg, 0);
19    let snowflake = generator.get();
20
21    let unique_path = format!("{}{snowflake}", url.path());
22    url.set_path(&unique_path);
23
24    let db_uri = url.to_string();
25
26    Ok(DbSettings {
27        db_uri,
28        read_db_uri: None,
29    })
30}
31
32#[allow(dead_code)]
33pub async fn create_test_db() -> eyre::Result<DbSettings> {
34    let var = env::var("ATUIN_TEST_DB_URI").ok();
35    let settings = get_settings(var)?;
36
37    match settings.db_type() {
38        DbType::Postgres => sqlx::Postgres::create_database(&settings.db_uri).await?,
39        DbType::Sqlite => sqlx::Sqlite::create_database(&settings.db_uri).await?,
40        atuin_server_database::DbType::Unknown => todo!(),
41    };
42
43    Ok(settings)
44}
45
46#[allow(dead_code)]
47pub async fn destroy_test_db(settings: &DbSettings) -> eyre::Result<()> {
48    match settings.db_type() {
49        DbType::Postgres => sqlx::Postgres::drop_database(&settings.db_uri).await?,
50        DbType::Sqlite => sqlx::Sqlite::drop_database(&settings.db_uri).await?,
51        DbType::Unknown => todo!(),
52    };
53    Ok(())
54}
55
56#[cfg(test)]
57mod tests {
58    use regex::Regex;
59    use rstest::rstest;
60
61    use super::*;
62
63    #[rstest]
64    #[case::none(None, r"sqlite://.*[\\/]atuin_test_db_\d+")]
65    #[case::with_param(
66        Some("postgres://user:pass@host/database_?mode=ssl".into()),
67        r"postgres://user:pass@host/database_\d+\?mode=ssl"
68    )]
69    fn settings(#[case] input: Option<String>, #[case] pattern: &str) -> eyre::Result<()> {
70        let settings = get_settings(input)?;
71        let re = Regex::new(pattern)?;
72        assert!(re.is_match(&settings.db_uri), "{}", &settings.db_uri);
73        Ok(())
74    }
75}