testfixtures

![build] ![docs] ![license]

Install

This crate is compatible with the async-std and tokio runtimes.

async-std

toml [dependencies] testfixtures = "0.1" sqlx = "0.3" chrono = "0.4.11"

tokio

toml [dependencies] testfixtures = { version = "0.1", default-features = false, features = [ "runtime-tokio" ] } sqlx = { version = "0.3", default-features = false, features = [ "runtime-tokio", "macros" ] } chrono = "0.4.11"

Usage

Create fixture files like the following.

todos.yml yml - id: 1 description: buy a new camera done: true progress: 10.5 created_at: 2020/01/01 01:01:01 - id: 2 description: meeting done: false progress: 30.0 created_at: 2020/01/01 02:02:02

Click and see the datetime format example

rust 2020-01-01 01:01 2020-01-01 01:01:01 20200101 01:01 20200101 01:01:01 01012020 01:01 01012020 01:01:01 2020/01/01 01:01 2020/01/01 01:01:01


If you need to write raw SQL, probably to call a function, prefix the value of the column with RAW=.

yml - id: 1 description: fizz done: true progress: 10.5 created_at: RAW=NOW()

Your tests would look like this.

```rust

[cfg(test)]

mod tests { use chrono::Utc; use sqlx::MySqlPool; use std::env; use testfixtures::MySqlLoader;

#[async_std::test]
async fn test_something() -> anyhow::Result<()> {
    let pool = MySqlPool::new(&env::var("DATABASE_URL")?).await?;
    let loader = MySqlLoader::new(|cfg| {
        cfg.location(Utc);
        cfg.database(pool);
        cfg.skip_test_database_check();
        cfg.paths(vec!["fixtures/todos.yml"]);
    })
    .await?;

    // load your fixtures
    if let Err(err) = loader.load().await {
       panic!("{}", err)
    }

    // run your tests

    Ok(())
}

}

```

PgLoader and SqliteLoader are under development.

Options

database(required)

database is a option for passing db connection pool to a Loader.

rust let pool = MySqlPool::new(&env::var("DATABASE_URL")?).await?; let loader = MySqlLoader::new(|cfg| { cfg.database(pool); // ... }) .await?;

location(required)

location is a option for setting timezone.

```rust use chrono::Utc;

let loader = MySqlLoader::new(|cfg| { cfg.location(Utc); // or cfg.location(Local); // ... }) .await?; ```

skiptestdatabase_check(optional)

skiptestdatabase_check is a option for setting a flag for checking if database name ends with "test".

rust let loader = MySqlLoader::new(|cfg| { cfg.skip_test_database_check(); // ... }) .await?;

files(optional)

files is a option for reading your fixture files.

rust let loader = MySqlLoader::new(|cfg| { cfg.files(vec!["fizz.yml"]); // ... }) .await?;

directory(optional)

files is a option for reading your fixture files in a directory.

rust let loader = MySqlLoader::new(|cfg| { cfg.directory("fixture"); // ... }) .await?;

paths(optional)

paths is a option that is a combination of files option and directory option.

rust let loader = MySqlLoader::new(|cfg| { cfg.paths(vec!["fizz", "buzz/todos.yml"]); // ... }) .await?;

Implemation status

Database

Options

Contribution

```sh

setup test db

$ make db

load environment variables

$ make env $ direnv allow # https://github.com/direnv/direnv

run unit tests

$ make test ```

Reference

https://github.com/go-testfixtures/testfixtures