chore: change structure of integration tests
This commit is contained in:
parent
e60ed07137
commit
eda1a05d70
6 changed files with 293 additions and 286 deletions
|
@ -16,6 +16,10 @@ readme = "../README.md"
|
||||||
name = "migra"
|
name = "migra"
|
||||||
path = "src/main.rs"
|
path = "src/main.rs"
|
||||||
|
|
||||||
|
[[test]]
|
||||||
|
name = "integration"
|
||||||
|
path = "tests/commands.rs"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
structopt = "0.3"
|
structopt = "0.3"
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
|
|
289
migra-cli/tests/commands.rs
Normal file
289
migra-cli/tests/commands.rs
Normal file
|
@ -0,0 +1,289 @@
|
||||||
|
pub use assert_cmd::prelude::*;
|
||||||
|
pub use predicates::str::contains;
|
||||||
|
pub use std::process::Command;
|
||||||
|
|
||||||
|
pub type TestResult = std::result::Result<(), Box<dyn std::error::Error>>;
|
||||||
|
|
||||||
|
pub const ROOT_PATH: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/tests/data/");
|
||||||
|
|
||||||
|
pub fn path_to_file(file_name: &'static str) -> String {
|
||||||
|
ROOT_PATH.to_owned() + file_name
|
||||||
|
}
|
||||||
|
|
||||||
|
pub const DATABASE_URL_DEFAULT_ENV_NAME: &str = "DATABASE_URL";
|
||||||
|
pub const DATABASE_URL_ENV_VALUE: &str = "postgres://postgres:postgres@localhost:6000/migra_tests";
|
||||||
|
|
||||||
|
pub struct Env {
|
||||||
|
key: &'static str,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Env {
|
||||||
|
pub fn new(key: &'static str, value: &'static str) -> Self {
|
||||||
|
std::env::set_var(key, value);
|
||||||
|
Env { key }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Drop for Env {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
std::env::remove_var(self.key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mod init {
|
||||||
|
use super::*;
|
||||||
|
use std::fs;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn init_manifest_with_default_config() -> TestResult {
|
||||||
|
let manifest_path = "Migra.toml";
|
||||||
|
|
||||||
|
Command::cargo_bin("migra")?
|
||||||
|
.arg("init")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(contains(format!("Created {}", &manifest_path)));
|
||||||
|
|
||||||
|
let content = fs::read_to_string(&manifest_path)?;
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
content,
|
||||||
|
r#"root = "database"
|
||||||
|
|
||||||
|
[database]
|
||||||
|
connection = "$DATABASE_URL"
|
||||||
|
"#
|
||||||
|
);
|
||||||
|
|
||||||
|
fs::remove_file(&manifest_path)?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn init_manifest_in_custom_path() -> TestResult {
|
||||||
|
let manifest_path = path_to_file("Migra.toml");
|
||||||
|
|
||||||
|
Command::cargo_bin("migra")?
|
||||||
|
.arg("-c")
|
||||||
|
.arg(&manifest_path)
|
||||||
|
.arg("init")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(contains(format!("Created {}", manifest_path.as_str())));
|
||||||
|
|
||||||
|
let content = fs::read_to_string(&manifest_path)?;
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
content,
|
||||||
|
r#"root = "database"
|
||||||
|
|
||||||
|
[database]
|
||||||
|
connection = "$DATABASE_URL"
|
||||||
|
"#
|
||||||
|
);
|
||||||
|
|
||||||
|
fs::remove_file(&manifest_path)?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mod list {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn empty_migration_list() -> TestResult {
|
||||||
|
Command::cargo_bin("migra")?
|
||||||
|
.arg("ls")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(contains(
|
||||||
|
r#"Missed "DATABASE_URL" environment variable
|
||||||
|
No connection to database
|
||||||
|
|
||||||
|
Pending migrations:
|
||||||
|
—"#,
|
||||||
|
));
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn empty_migration_list_with_db() -> TestResult {
|
||||||
|
let env = Env::new(DATABASE_URL_DEFAULT_ENV_NAME, DATABASE_URL_ENV_VALUE);
|
||||||
|
|
||||||
|
Command::cargo_bin("migra")?
|
||||||
|
.arg("ls")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(contains(
|
||||||
|
r#"Applied migrations:
|
||||||
|
—
|
||||||
|
|
||||||
|
Pending migrations:
|
||||||
|
—"#,
|
||||||
|
));
|
||||||
|
|
||||||
|
drop(env);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn empty_migration_list_with_url_in_manifest() -> TestResult {
|
||||||
|
Command::cargo_bin("migra")?
|
||||||
|
.arg("-c")
|
||||||
|
.arg(path_to_file("Migra_url_empty.toml"))
|
||||||
|
.arg("ls")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(contains(
|
||||||
|
r#"Applied migrations:
|
||||||
|
—
|
||||||
|
|
||||||
|
Pending migrations:
|
||||||
|
—"#,
|
||||||
|
));
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn empty_migration_list_with_env_in_manifest() -> TestResult {
|
||||||
|
let env = Env::new("DB_URL", DATABASE_URL_ENV_VALUE);
|
||||||
|
|
||||||
|
Command::cargo_bin("migra")?
|
||||||
|
.arg("-c")
|
||||||
|
.arg(path_to_file("Migra_env_empty.toml"))
|
||||||
|
.arg("ls")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(contains(
|
||||||
|
r#"Applied migrations:
|
||||||
|
—
|
||||||
|
|
||||||
|
Pending migrations:
|
||||||
|
—"#,
|
||||||
|
));
|
||||||
|
|
||||||
|
drop(env);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn empty_applied_migrations() -> TestResult {
|
||||||
|
let env = Env::new(DATABASE_URL_DEFAULT_ENV_NAME, DATABASE_URL_ENV_VALUE);
|
||||||
|
|
||||||
|
Command::cargo_bin("migra")?
|
||||||
|
.arg("-c")
|
||||||
|
.arg(path_to_file("Migra_env.toml"))
|
||||||
|
.arg("ls")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(contains(
|
||||||
|
r#"Applied migrations:
|
||||||
|
—
|
||||||
|
|
||||||
|
Pending migrations:
|
||||||
|
210218232851_create_articles
|
||||||
|
210218233414_create_persons
|
||||||
|
"#,
|
||||||
|
));
|
||||||
|
|
||||||
|
drop(env);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn applied_all_migrations() -> TestResult {
|
||||||
|
let env = Env::new(DATABASE_URL_DEFAULT_ENV_NAME, DATABASE_URL_ENV_VALUE);
|
||||||
|
|
||||||
|
Command::cargo_bin("migra")?
|
||||||
|
.arg("-c")
|
||||||
|
.arg(path_to_file("Migra_env.toml"))
|
||||||
|
.arg("up")
|
||||||
|
.assert()
|
||||||
|
.success();
|
||||||
|
|
||||||
|
Command::cargo_bin("migra")?
|
||||||
|
.arg("-c")
|
||||||
|
.arg(path_to_file("Migra_env.toml"))
|
||||||
|
.arg("ls")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(contains(
|
||||||
|
r#"Applied migrations:
|
||||||
|
210218232851_create_articles
|
||||||
|
210218233414_create_persons
|
||||||
|
|
||||||
|
Pending migrations:
|
||||||
|
—
|
||||||
|
"#,
|
||||||
|
));
|
||||||
|
|
||||||
|
Command::cargo_bin("migra")?
|
||||||
|
.arg("-c")
|
||||||
|
.arg(path_to_file("Migra_env.toml"))
|
||||||
|
.arg("down")
|
||||||
|
.assert()
|
||||||
|
.success();
|
||||||
|
|
||||||
|
Command::cargo_bin("migra")?
|
||||||
|
.arg("-c")
|
||||||
|
.arg(path_to_file("Migra_env.toml"))
|
||||||
|
.arg("down")
|
||||||
|
.assert()
|
||||||
|
.success();
|
||||||
|
|
||||||
|
drop(env);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn applied_one_migrations() -> TestResult {
|
||||||
|
let env = Env::new(DATABASE_URL_DEFAULT_ENV_NAME, DATABASE_URL_ENV_VALUE);
|
||||||
|
|
||||||
|
Command::cargo_bin("migra")?
|
||||||
|
.arg("-c")
|
||||||
|
.arg(path_to_file("Migra_env.toml"))
|
||||||
|
.arg("up")
|
||||||
|
.assert()
|
||||||
|
.success();
|
||||||
|
|
||||||
|
Command::cargo_bin("migra")?
|
||||||
|
.arg("-c")
|
||||||
|
.arg(path_to_file("Migra_env.toml"))
|
||||||
|
.arg("down")
|
||||||
|
.assert()
|
||||||
|
.success();
|
||||||
|
|
||||||
|
Command::cargo_bin("migra")?
|
||||||
|
.arg("-c")
|
||||||
|
.arg(path_to_file("Migra_env.toml"))
|
||||||
|
.arg("ls")
|
||||||
|
.assert()
|
||||||
|
.success()
|
||||||
|
.stdout(contains(
|
||||||
|
r#"Applied migrations:
|
||||||
|
210218232851_create_articles
|
||||||
|
|
||||||
|
Pending migrations:
|
||||||
|
210218233414_create_persons
|
||||||
|
"#,
|
||||||
|
));
|
||||||
|
|
||||||
|
Command::cargo_bin("migra")?
|
||||||
|
.arg("-c")
|
||||||
|
.arg(path_to_file("Migra_env.toml"))
|
||||||
|
.arg("down")
|
||||||
|
.assert()
|
||||||
|
.success();
|
||||||
|
|
||||||
|
drop(env);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,32 +0,0 @@
|
||||||
#![allow(dead_code)]
|
|
||||||
pub use assert_cmd::prelude::*;
|
|
||||||
pub use predicates::str::contains;
|
|
||||||
pub use std::process::Command;
|
|
||||||
|
|
||||||
pub type TestResult = std::result::Result<(), Box<dyn std::error::Error>>;
|
|
||||||
|
|
||||||
pub const ROOT_PATH: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/tests/data/");
|
|
||||||
|
|
||||||
pub fn path_to_file(file_name: &'static str) -> String {
|
|
||||||
ROOT_PATH.to_owned() + file_name
|
|
||||||
}
|
|
||||||
|
|
||||||
pub const DATABASE_URL_DEFAULT_ENV_NAME: &str = "DATABASE_URL";
|
|
||||||
pub const DATABASE_URL_ENV_VALUE: &str = "postgres://postgres:postgres@localhost:6000/migra_tests";
|
|
||||||
|
|
||||||
pub struct Env {
|
|
||||||
key: &'static str,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Env {
|
|
||||||
pub fn new(key: &'static str, value: &'static str) -> Self {
|
|
||||||
std::env::set_var(key, value);
|
|
||||||
Env { key }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Drop for Env {
|
|
||||||
fn drop(&mut self) {
|
|
||||||
std::env::remove_var(self.key);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,55 +0,0 @@
|
||||||
mod common;
|
|
||||||
use common::*;
|
|
||||||
use std::fs;
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn init_manifest_with_default_config() -> TestResult {
|
|
||||||
Command::cargo_bin("migra")?
|
|
||||||
.arg("init")
|
|
||||||
.assert()
|
|
||||||
.success()
|
|
||||||
.stdout(contains("Created Migra.toml"));
|
|
||||||
|
|
||||||
let content = fs::read_to_string("Migra.toml")?;
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
content,
|
|
||||||
r#"root = "database"
|
|
||||||
|
|
||||||
[database]
|
|
||||||
connection = "$DATABASE_URL"
|
|
||||||
"#
|
|
||||||
);
|
|
||||||
|
|
||||||
fs::remove_file("Migra.toml")?;
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn init_manifest_in_custom_path() -> TestResult {
|
|
||||||
let manifest_path = path_to_file("Migra.toml");
|
|
||||||
|
|
||||||
Command::cargo_bin("migra")?
|
|
||||||
.arg("-c")
|
|
||||||
.arg(&manifest_path)
|
|
||||||
.arg("init")
|
|
||||||
.assert()
|
|
||||||
.success()
|
|
||||||
.stdout(contains(format!("Created {}", manifest_path.as_str())));
|
|
||||||
|
|
||||||
let content = fs::read_to_string(&manifest_path)?;
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
content,
|
|
||||||
r#"root = "database"
|
|
||||||
|
|
||||||
[database]
|
|
||||||
connection = "$DATABASE_URL"
|
|
||||||
"#
|
|
||||||
);
|
|
||||||
|
|
||||||
fs::remove_file(&manifest_path)?;
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
mod common;
|
|
|
@ -1,198 +0,0 @@
|
||||||
mod common;
|
|
||||||
|
|
||||||
use common::*;
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn empty_migration_list() -> TestResult {
|
|
||||||
Command::cargo_bin("migra")?
|
|
||||||
.arg("ls")
|
|
||||||
.assert()
|
|
||||||
.success()
|
|
||||||
.stdout(contains(
|
|
||||||
r#"Missed "DATABASE_URL" environment variable
|
|
||||||
No connection to database
|
|
||||||
|
|
||||||
Pending migrations:
|
|
||||||
—"#,
|
|
||||||
));
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn empty_migration_list_with_db() -> TestResult {
|
|
||||||
let env = Env::new(DATABASE_URL_DEFAULT_ENV_NAME, DATABASE_URL_ENV_VALUE);
|
|
||||||
|
|
||||||
Command::cargo_bin("migra")?
|
|
||||||
.arg("ls")
|
|
||||||
.assert()
|
|
||||||
.success()
|
|
||||||
.stdout(contains(
|
|
||||||
r#"Applied migrations:
|
|
||||||
—
|
|
||||||
|
|
||||||
Pending migrations:
|
|
||||||
—"#,
|
|
||||||
));
|
|
||||||
|
|
||||||
drop(env);
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn empty_migration_list_with_url_in_manifest() -> TestResult {
|
|
||||||
Command::cargo_bin("migra")?
|
|
||||||
.arg("-c")
|
|
||||||
.arg(path_to_file("Migra_url_empty.toml"))
|
|
||||||
.arg("ls")
|
|
||||||
.assert()
|
|
||||||
.success()
|
|
||||||
.stdout(contains(
|
|
||||||
r#"Applied migrations:
|
|
||||||
—
|
|
||||||
|
|
||||||
Pending migrations:
|
|
||||||
—"#,
|
|
||||||
));
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn empty_migration_list_with_env_in_manifest() -> TestResult {
|
|
||||||
let env = Env::new("DB_URL", DATABASE_URL_ENV_VALUE);
|
|
||||||
|
|
||||||
Command::cargo_bin("migra")?
|
|
||||||
.arg("-c")
|
|
||||||
.arg(path_to_file("Migra_env_empty.toml"))
|
|
||||||
.arg("ls")
|
|
||||||
.assert()
|
|
||||||
.success()
|
|
||||||
.stdout(contains(
|
|
||||||
r#"Applied migrations:
|
|
||||||
—
|
|
||||||
|
|
||||||
Pending migrations:
|
|
||||||
—"#,
|
|
||||||
));
|
|
||||||
|
|
||||||
drop(env);
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn empty_applied_migrations() -> TestResult {
|
|
||||||
let env = Env::new(DATABASE_URL_DEFAULT_ENV_NAME, DATABASE_URL_ENV_VALUE);
|
|
||||||
|
|
||||||
Command::cargo_bin("migra")?
|
|
||||||
.arg("-c")
|
|
||||||
.arg(path_to_file("Migra_env.toml"))
|
|
||||||
.arg("ls")
|
|
||||||
.assert()
|
|
||||||
.success()
|
|
||||||
.stdout(contains(
|
|
||||||
r#"Applied migrations:
|
|
||||||
—
|
|
||||||
|
|
||||||
Pending migrations:
|
|
||||||
210218232851_create_articles
|
|
||||||
210218233414_create_persons
|
|
||||||
"#,
|
|
||||||
));
|
|
||||||
|
|
||||||
drop(env);
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn applied_all_migrations() -> TestResult {
|
|
||||||
let env = Env::new(DATABASE_URL_DEFAULT_ENV_NAME, DATABASE_URL_ENV_VALUE);
|
|
||||||
|
|
||||||
Command::cargo_bin("migra")?
|
|
||||||
.arg("-c")
|
|
||||||
.arg(path_to_file("Migra_env.toml"))
|
|
||||||
.arg("up")
|
|
||||||
.assert()
|
|
||||||
.success();
|
|
||||||
|
|
||||||
Command::cargo_bin("migra")?
|
|
||||||
.arg("-c")
|
|
||||||
.arg(path_to_file("Migra_env.toml"))
|
|
||||||
.arg("ls")
|
|
||||||
.assert()
|
|
||||||
.success()
|
|
||||||
.stdout(contains(
|
|
||||||
r#"Applied migrations:
|
|
||||||
210218232851_create_articles
|
|
||||||
210218233414_create_persons
|
|
||||||
|
|
||||||
Pending migrations:
|
|
||||||
—
|
|
||||||
"#,
|
|
||||||
));
|
|
||||||
|
|
||||||
Command::cargo_bin("migra")?
|
|
||||||
.arg("-c")
|
|
||||||
.arg(path_to_file("Migra_env.toml"))
|
|
||||||
.arg("down")
|
|
||||||
.assert()
|
|
||||||
.success();
|
|
||||||
|
|
||||||
Command::cargo_bin("migra")?
|
|
||||||
.arg("-c")
|
|
||||||
.arg(path_to_file("Migra_env.toml"))
|
|
||||||
.arg("down")
|
|
||||||
.assert()
|
|
||||||
.success();
|
|
||||||
|
|
||||||
drop(env);
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn applied_one_migrations() -> TestResult {
|
|
||||||
let env = Env::new(DATABASE_URL_DEFAULT_ENV_NAME, DATABASE_URL_ENV_VALUE);
|
|
||||||
|
|
||||||
Command::cargo_bin("migra")?
|
|
||||||
.arg("-c")
|
|
||||||
.arg(path_to_file("Migra_env.toml"))
|
|
||||||
.arg("up")
|
|
||||||
.assert()
|
|
||||||
.success();
|
|
||||||
|
|
||||||
Command::cargo_bin("migra")?
|
|
||||||
.arg("-c")
|
|
||||||
.arg(path_to_file("Migra_env.toml"))
|
|
||||||
.arg("down")
|
|
||||||
.assert()
|
|
||||||
.success();
|
|
||||||
|
|
||||||
Command::cargo_bin("migra")?
|
|
||||||
.arg("-c")
|
|
||||||
.arg(path_to_file("Migra_env.toml"))
|
|
||||||
.arg("ls")
|
|
||||||
.assert()
|
|
||||||
.success()
|
|
||||||
.stdout(contains(
|
|
||||||
r#"Applied migrations:
|
|
||||||
210218232851_create_articles
|
|
||||||
|
|
||||||
Pending migrations:
|
|
||||||
210218233414_create_persons
|
|
||||||
"#,
|
|
||||||
));
|
|
||||||
|
|
||||||
Command::cargo_bin("migra")?
|
|
||||||
.arg("-c")
|
|
||||||
.arg(path_to_file("Migra_env.toml"))
|
|
||||||
.arg("down")
|
|
||||||
.assert()
|
|
||||||
.success();
|
|
||||||
|
|
||||||
drop(env);
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
Reference in a new issue