use serde::{Deserialize, Serialize};
pub trait Constraint {
fn to_sql(&self) -> String;
fn name(&self) -> &str;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CheckConstraint {
pub name: String,
pub check: String,
}
impl CheckConstraint {
pub fn new(name: impl Into<String>, check: impl Into<String>) -> Self {
Self {
name: name.into(),
check: check.into(),
}
}
}
impl Constraint for CheckConstraint {
fn to_sql(&self) -> String {
format!("CONSTRAINT {} CHECK ({})", self.name, self.check)
}
fn name(&self) -> &str {
&self.name
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UniqueConstraint {
pub name: String,
pub fields: Vec<String>,
pub condition: Option<String>, }
impl UniqueConstraint {
pub fn new(name: impl Into<String>, fields: Vec<String>) -> Self {
Self {
name: name.into(),
fields,
condition: None,
}
}
pub fn with_condition(mut self, condition: String) -> Self {
self.condition = Some(condition);
self
}
}
impl Constraint for UniqueConstraint {
fn to_sql(&self) -> String {
let fields = self.fields.join(", ");
let mut sql = format!("CONSTRAINT {} UNIQUE ({})", self.name, fields);
if let Some(ref cond) = self.condition {
sql.push_str(&format!(" WHERE {}", cond));
}
sql
}
fn name(&self) -> &str {
&self.name
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ForeignKeyConstraint {
pub name: String,
pub field: String,
pub references_table: String,
pub references_field: String,
pub on_delete: OnDelete,
pub on_update: OnUpdate,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
pub enum OnDelete {
Cascade,
SetNull,
SetDefault,
Restrict,
NoAction,
}
impl OnDelete {
pub fn to_sql(&self) -> &'static str {
match self {
OnDelete::Cascade => "CASCADE",
OnDelete::SetNull => "SET NULL",
OnDelete::SetDefault => "SET DEFAULT",
OnDelete::Restrict => "RESTRICT",
OnDelete::NoAction => "NO ACTION",
}
}
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
pub enum OnUpdate {
Cascade,
SetNull,
SetDefault,
Restrict,
NoAction,
}
impl OnUpdate {
pub fn to_sql(&self) -> &'static str {
match self {
OnUpdate::Cascade => "CASCADE",
OnUpdate::SetNull => "SET NULL",
OnUpdate::SetDefault => "SET DEFAULT",
OnUpdate::Restrict => "RESTRICT",
OnUpdate::NoAction => "NO ACTION",
}
}
}
impl ForeignKeyConstraint {
pub fn new(
name: impl Into<String>,
field: impl Into<String>,
references_table: impl Into<String>,
references_field: impl Into<String>,
) -> Self {
Self {
name: name.into(),
field: field.into(),
references_table: references_table.into(),
references_field: references_field.into(),
on_delete: OnDelete::Restrict,
on_update: OnUpdate::NoAction,
}
}
pub fn on_delete(mut self, on_delete: OnDelete) -> Self {
self.on_delete = on_delete;
self
}
pub fn on_update(mut self, on_update: OnUpdate) -> Self {
self.on_update = on_update;
self
}
}
impl Constraint for ForeignKeyConstraint {
fn to_sql(&self) -> String {
format!(
"CONSTRAINT {} FOREIGN KEY ({}) REFERENCES {} ({}) ON DELETE {} ON UPDATE {}",
self.name,
self.field,
self.references_table,
self.references_field,
self.on_delete.to_sql(),
self.on_update.to_sql()
)
}
fn name(&self) -> &str {
&self.name
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_constraints_check() {
let constraint = CheckConstraint::new("age_check", "age >= 0");
assert_eq!(constraint.to_sql(), "CONSTRAINT age_check CHECK (age >= 0)");
assert_eq!(constraint.name(), "age_check");
}
#[test]
fn test_unique_constraint() {
let constraint = UniqueConstraint::new("unique_email", vec!["email".to_string()]);
assert_eq!(
constraint.to_sql(),
"CONSTRAINT unique_email UNIQUE (email)"
);
}
#[test]
fn test_unique_constraint_multiple_fields() {
let constraint = UniqueConstraint::new(
"unique_user_email",
vec!["user_id".to_string(), "email".to_string()],
);
assert_eq!(
constraint.to_sql(),
"CONSTRAINT unique_user_email UNIQUE (user_id, email)"
);
}
#[test]
fn test_unique_constraint_with_condition() {
let constraint = UniqueConstraint::new("unique_active_email", vec!["email".to_string()])
.with_condition("deleted_at IS NULL".to_string());
assert_eq!(
constraint.to_sql(),
"CONSTRAINT unique_active_email UNIQUE (email) WHERE deleted_at IS NULL"
);
}
#[test]
fn test_constraints_foreign_key_constraint() {
let constraint = ForeignKeyConstraint::new("fk_user", "user_id", "users", "id");
let sql = constraint.to_sql();
assert_eq!(
sql,
"CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE RESTRICT ON UPDATE NO ACTION",
"Expected exact foreign key constraint SQL, got: {}",
sql
);
}
#[test]
fn test_foreign_key_cascade() {
let constraint = ForeignKeyConstraint::new("fk_post", "post_id", "posts", "id")
.on_delete(OnDelete::Cascade)
.on_update(OnUpdate::Cascade);
let sql = constraint.to_sql();
assert_eq!(
sql,
"CONSTRAINT fk_post FOREIGN KEY (post_id) REFERENCES posts (id) ON DELETE CASCADE ON UPDATE CASCADE",
"Expected exact foreign key constraint SQL with CASCADE actions, got: {}",
sql
);
}
#[test]
fn test_foreign_key_set_null() {
let constraint = ForeignKeyConstraint::new("fk_author", "author_id", "users", "id")
.on_delete(OnDelete::SetNull);
let sql = constraint.to_sql();
assert_eq!(
sql,
"CONSTRAINT fk_author FOREIGN KEY (author_id) REFERENCES users (id) ON DELETE SET NULL ON UPDATE NO ACTION",
"Expected exact foreign key constraint SQL with SET NULL action, got: {}",
sql
);
}
}
#[cfg(test)]
mod constraints_extended_tests {
use super::*;
#[test]
fn test_abstract_name() {
#[allow(unused)]
let constraint = CheckConstraint::new("test", "age >= 0");
}
#[test]
fn test_abstract_name_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_condition_must_be_q() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "age >= 18");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (age >= 18)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_condition_must_be_q_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "age >= 18");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (age >= 18)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_constraint_sql() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_constraint_sql_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_contains_expressions() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_contains_expressions_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_create_sql() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_create_sql_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_custom_violation_code_message() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_custom_violation_code_message_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_custom_violation_error_message() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_custom_violation_error_message_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_custom_violation_error_message_clone() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_custom_violation_error_message_clone_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_database_constraint() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_database_constraint_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_database_constraint_2() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_database_constraint_3() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_database_constraint_unicode() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_database_constraint_unicode_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_database_constraint_with_condition() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "age >= 18");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (age >= 18)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_database_constraint_with_condition_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "age >= 18");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (age >= 18)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_database_default() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_database_default_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_database_default_2() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_database_default_3() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_deconstruction() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_deconstruction_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_deconstruction_2() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_deconstruction_3() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_deconstruction_4() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_deconstruction_5() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_deconstruction_with_condition() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "age >= 18");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (age >= 18)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_deconstruction_with_condition_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "age >= 18");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (age >= 18)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_deconstruction_with_deferrable() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_deconstruction_with_deferrable_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_deconstruction_with_expressions() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_deconstruction_with_expressions_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_deconstruction_with_include() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_deconstruction_with_include_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_deconstruction_with_nulls_distinct() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_deconstruction_with_nulls_distinct_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_deconstruction_with_opclasses() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_deconstruction_with_opclasses_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_default_violation_error_message() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_default_violation_error_message_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_deferrable_with_condition() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "age >= 18");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (age >= 18)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_deferrable_with_condition_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "age >= 18");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (age >= 18)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_deferrable_with_expressions() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_deferrable_with_expressions_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_deferrable_with_include() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_deferrable_with_include_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_deferrable_with_opclasses() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_deferrable_with_opclasses_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_eq() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_eq_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_eq_2() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_eq_3() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_eq_with_condition() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "age >= 18");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (age >= 18)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_eq_with_condition_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "age >= 18");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (age >= 18)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_eq_with_deferrable() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_eq_with_deferrable_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_eq_with_expressions() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_eq_with_expressions_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_eq_with_include() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_eq_with_include_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_eq_with_nulls_distinct() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_eq_with_nulls_distinct_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_eq_with_opclasses() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_eq_with_opclasses_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_expressions_and_fields_mutually_exclusive() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_expressions_and_fields_mutually_exclusive_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_expressions_with_opclasses() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_expressions_with_opclasses_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_include_database_constraint() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_include_database_constraint_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_initially_deferred_database_constraint() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_initially_deferred_database_constraint_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_initially_immediate_database_constraint() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_initially_immediate_database_constraint_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_invalid_check_types() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "age >= 18");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (age >= 18)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_invalid_check_types_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "age >= 18");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (age >= 18)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_invalid_defer_argument() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_invalid_defer_argument_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_invalid_include_argument() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_invalid_include_argument_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_invalid_nulls_distinct_argument() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_invalid_nulls_distinct_argument_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_invalid_opclasses_argument() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_invalid_opclasses_argument_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_model_validation() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_model_validation_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_model_validation_constraint_no_code_error() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_model_validation_constraint_no_code_error_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_model_validation_with_condition() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "age >= 18");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (age >= 18)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_model_validation_with_condition_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "age >= 18");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (age >= 18)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_name() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
#[test]
fn test_name_1() {
use super::*;
let constraint = CheckConstraint::new("test_constraint", "value > 0");
assert_eq!(constraint.name(), "test_constraint");
let sql = constraint.to_sql();
assert_eq!(
sql, "CONSTRAINT test_constraint CHECK (value > 0)",
"Expected exact CHECK constraint SQL, got: {}",
sql
);
}
}