Skip to content

Commit

Permalink
added test for transactions
Browse files Browse the repository at this point in the history
  • Loading branch information
emilpriver committed Feb 10, 2024
1 parent 905e9e7 commit f0cb379
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 13 deletions.
16 changes: 3 additions & 13 deletions src/lib/migrate.rs
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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?;

Expand Down Expand Up @@ -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?;

Expand Down
37 changes: 37 additions & 0 deletions src/lib/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,3 +42,40 @@ pub fn get_local_migrations(folder: &PathBuf, ending: &str) -> Result<Vec<(i64,
pub fn read_file_content(path: &PathBuf) -> 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);
}
}

0 comments on commit f0cb379

Please sign in to comment.