sql_query_builder 1.0.4

Write SQL queries in a simple and composable way
Documentation
use pretty_assertions::assert_eq;
use sql_query_builder as sql;

#[test]
fn delete_builder_should_be_displayable() {
  let delete = sql::Delete::new().delete_from("users").where_clause("login = 'foo'");

  println!("{}", delete);

  let query = delete.as_string();
  let expected_query = "DELETE FROM users WHERE login = 'foo'";

  assert_eq!(query, expected_query);
}

#[test]
fn delete_builder_should_be_debuggable() {
  let delete = sql::Delete::new()
    .delete_from("users")
    .where_clause("name = 'Foo'")
    .where_clause("login = 'foo'");

  println!("{:?}", delete);

  let expected_query = "DELETE FROM users WHERE name = 'Foo' AND login = 'foo'";
  let query = delete.as_string();

  assert_eq!(query, expected_query);
}

#[test]
fn delete_builder_should_be_cloneable() {
  let delete_foo = sql::Delete::new()
    .raw("/* test raw */")
    .delete_from("users")
    .raw_before(sql::DeleteClause::Where, "/* test raw_before */")
    .where_clause("login = 'foo'")
    .raw_after(sql::DeleteClause::Where, "/* test raw_after */");

  let delete_foo_bar = delete_foo.clone().where_clause("name = 'Bar'");

  let query_foo = delete_foo.as_string();
  let query_foo_bar = delete_foo_bar.as_string();

  let expected_query_foo = "\
    /* test raw */ \
    DELETE FROM users \
    /* test raw_before */ \
    WHERE login = 'foo' \
    /* test raw_after */\
  ";
  let expected_query_foo_bar = "\
    /* test raw */ \
    DELETE FROM users \
    /* test raw_before */ \
    WHERE login = 'foo' AND name = 'Bar' \
    /* test raw_after */\
  ";

  assert_eq!(query_foo, expected_query_foo);
  assert_eq!(query_foo_bar, expected_query_foo_bar);
}

#[test]
fn delete_builder_should_be_able_to_conditionally_add_clauses() {
  let mut delete = sql::Delete::new().delete_from("users").where_clause("name = 'Bar'");

  if true {
    delete = delete.where_clause("login = 'bar'");
  }

  let query = delete.as_string();
  let expected_query = "DELETE FROM users WHERE name = 'Bar' AND login = 'bar'";

  assert_eq!(query, expected_query);
}

#[test]
fn delete_builder_should_be_composable() {
  fn delete(delete: sql::Delete) -> sql::Delete {
    delete.delete_from("users")
  }

  fn conditions(delete: sql::Delete) -> sql::Delete {
    delete
      .where_clause("id = $1")
      .where_clause("active = true")
      .where_clause("created_at::date = current_date")
  }

  fn as_string(delete: sql::Delete) -> String {
    delete.as_string()
  }

  let query = Some(sql::Delete::new())
    .map(delete)
    .map(conditions)
    .map(as_string)
    .unwrap();

  let expected_query = "\
      DELETE FROM users \
      WHERE \
        id = $1 \
        AND active = true \
        AND created_at::date = current_date\
    ";

  assert_eq!(query, expected_query);
}