use crate::prelude::*;
#[driver_test]
pub async fn embedded_enum_index_schema(test: &mut Test) {
#[derive(Debug, toasty::Embed)]
enum ContactInfo {
#[column(variant = 1)]
Email {
#[unique]
address: String,
},
#[column(variant = 2)]
Phone {
#[index]
number: String,
},
}
#[derive(Debug, toasty::Model)]
struct User {
#[key]
id: String,
name: String,
#[allow(dead_code)]
contact: ContactInfo,
}
let db = test.setup_db(models!(User, ContactInfo)).await;
let schema = db.schema();
assert_struct!(schema.app.models, #{
ContactInfo::id(): toasty::schema::app::Model::EmbeddedEnum({
indices.len(): 2,
}),
..
});
let table = &schema.db.tables[0];
let address_col = columns(&db, "users", &["contact_address"])[0];
let number_col = columns(&db, "users", &["contact_number"])[0];
assert_struct!(table.indices, [
{ primary_key: true },
{ unique: true, primary_key: false, columns: [{ column: == address_col }] },
{ unique: false, primary_key: false, columns: [{ column: == number_col }] },
]);
}
#[driver_test]
pub async fn embedded_enum_unique_index_enforced(test: &mut Test) -> Result<()> {
#[derive(Debug, toasty::Embed)]
enum ContactInfo {
#[column(variant = 1)]
Email {
#[unique]
address: String,
},
#[column(variant = 2)]
Phone { number: String },
}
#[derive(Debug, toasty::Model)]
struct User {
#[key]
id: String,
name: String,
contact: ContactInfo,
}
let mut db = test.setup_db(models!(User, ContactInfo)).await;
User::create()
.id("1")
.name("Alice")
.contact(ContactInfo::Email {
address: "alice@example.com".to_string(),
})
.exec(&mut db)
.await?;
assert_err!(
User::create()
.id("2")
.name("Bob")
.contact(ContactInfo::Email {
address: "alice@example.com".to_string(),
})
.exec(&mut db)
.await
);
User::create()
.id("3")
.name("Charlie")
.contact(ContactInfo::Email {
address: "charlie@example.com".to_string(),
})
.exec(&mut db)
.await?;
User::create()
.id("4")
.name("Dave")
.contact(ContactInfo::Phone {
number: "555-1234".to_string(),
})
.exec(&mut db)
.await?;
let users = User::filter(
User::fields()
.contact()
.email()
.matches(|e| e.address().eq("alice@example.com")),
)
.exec(&mut db)
.await?;
assert_struct!(users, [{ name: "Alice" }]);
Ok(())
}