use test_better::ErrorKind;
use test_better::prelude::*;
#[fixture]
fn answer() -> TestResult<i32> {
Ok(42)
}
#[test_with_fixtures]
fn a_fixture_value_reaches_the_test(answer: i32) -> TestResult {
check!(answer).satisfies(eq(42))
}
#[fixture]
fn name() -> TestResult<String> {
Ok(String::from("alice"))
}
#[fixture]
fn age() -> TestResult<u32> {
Ok(30)
}
#[test_with_fixtures]
fn several_fixtures_are_resolved_left_to_right(name: String, age: u32) -> TestResult {
check!(name.len() as u32).satisfies(le(age))
}
#[fixture(scope = "module")]
fn shared_config() -> TestResult<String> {
Ok(String::from("loaded-once"))
}
#[test_with_fixtures]
fn a_module_fixture_is_shared(shared_config: String) -> TestResult {
check!(shared_config.as_str()).satisfies(eq("loaded-once"))
}
#[test_with_fixtures]
fn a_module_fixture_is_shared_again(shared_config: String) -> TestResult {
check!(shared_config.is_empty()).satisfies(is_false())
}
#[fixture]
fn broken_db() -> TestResult<i32> {
Err(TestError::custom("could not connect to the database"))
}
#[test_with_fixtures]
#[ignore = "deliberately fails to exercise the fixture Setup error path"]
fn uses_broken_db(broken_db: i32) -> TestResult {
check!(broken_db).satisfies(eq(1))
}
#[test]
fn a_fixture_failure_is_a_setup_error() -> TestResult {
let failure = uses_broken_db().err().or_fail()?;
check!(failure.kind).satisfies(eq(ErrorKind::Setup))?;
let rendered = format!("{failure}");
check!(rendered.contains("test setup failed")).satisfies(is_true())?;
check!(rendered.contains("setting up fixture `broken_db`")).satisfies(is_true())?;
check!(rendered.contains("could not connect to the database")).satisfies(is_true())
}
#[fixture(scope = "module")]
fn broken_shared() -> TestResult<String> {
Err(TestError::custom("config file is missing"))
}
#[test]
fn a_module_fixture_failure_is_a_setup_error() -> TestResult {
let failure = broken_shared().err().or_fail()?;
check!(failure.kind).satisfies(eq(ErrorKind::Setup))?;
let rendered = format!("{failure}");
check!(rendered.contains("test setup failed")).satisfies(is_true())?;
check!(rendered.contains("module-scoped fixture `broken_shared` failed"))
.satisfies(is_true())?;
check!(rendered.contains("config file is missing")).satisfies(is_true())
}