tests_database/
helpers.rs1use 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}