From f0cb379d781c9a6632eaf7347e1d8d0c2e215b13 Mon Sep 17 00:00:00 2001 From: emilpriver Date: Sat, 10 Feb 2024 12:13:27 +0100 Subject: [PATCH] added test for transactions --- src/lib/migrate.rs | 16 +++------------- src/lib/utils.rs | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 13 deletions(-) diff --git a/src/lib/migrate.rs b/src/lib/migrate.rs index 731dc13..b970801 100644 --- a/src/lib/migrate.rs +++ b/src/lib/migrate.rs @@ -1,5 +1,5 @@ -use crate::database_drivers; use crate::utils::{get_local_migrations, read_file_content}; +use crate::{database_drivers, utils}; use anyhow::{bail, Result}; use log::info; use std::path::PathBuf; @@ -55,12 +55,7 @@ pub async fn up( if !migrations.contains(&id) { info!("Running migration {}", id); let query = read_file_content(&f.1); - let run_in_transaction = query - .split_once('\n') - // by default do we want to run in a transaction - .unwrap_or(("transaction: yes", "")) - .0 - .contains("transaction: yes"); + let run_in_transaction = utils::should_run_in_transaction(&query); database.execute(&query, run_in_transaction).await?; @@ -130,12 +125,7 @@ pub async fn down( Some(f) => { info!("Running rollback for {}", migration); let query = read_file_content(&f.1); - let run_in_transaction = query - .split_once('\n') - // by default do we want to run in a transaction - .unwrap_or(("transaction: yes", "")) - .0 - .contains("transaction: yes"); + let run_in_transaction = utils::should_run_in_transaction(&query); database.execute(&query, run_in_transaction).await?; diff --git a/src/lib/utils.rs b/src/lib/utils.rs index c3cb310..e58d96d 100644 --- a/src/lib/utils.rs +++ b/src/lib/utils.rs @@ -42,3 +42,40 @@ pub fn get_local_migrations(folder: &PathBuf, ending: &str) -> Result String { fs::read_to_string(path).unwrap() } + +pub fn should_run_in_transaction(query: &str) -> bool { + !query + .split_once('\n') + .unwrap_or(("", "")) + .0 + .contains("transaction: no") +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_without_transaction_no_in_first_line() { + let query = "something else\ntransaction: no"; + assert_eq!(should_run_in_transaction(query), true); + } + + #[test] + fn test_with_empty_line() { + let query = ""; + assert_eq!(should_run_in_transaction(query), true); + } + + #[test] + fn test_with_transaction_yes_in_first_line() { + let query = "transaction: yes\nSELECT * FROM users"; + assert_eq!(should_run_in_transaction(query), true); + } + + #[test] + fn test_with_transaction_no_in_first_line() { + let query = "transaction: no\nSELECT * FROM users"; + assert_eq!(should_run_in_transaction(query), false); + } +}