use crate::prelude::*;
#[driver_test]
pub async fn embedded_struct_index_schema(test: &mut Test) {
#[derive(Debug, toasty::Embed)]
struct Contact {
#[unique]
email: String,
#[index]
country: String,
}
#[derive(Debug, toasty::Model)]
struct User {
#[key]
id: String,
name: String,
#[allow(dead_code)]
contact: Contact,
}
let db = test.setup_db(models!(User, Contact)).await;
let schema = db.schema();
assert_struct!(schema.app.models, #{
Contact::id(): toasty::schema::app::Model::EmbeddedStruct({
indices.len(): 2,
}),
..
});
let table = &schema.db.tables[0];
let contact_email_col = table
.columns
.iter()
.find(|c| c.name == "contact_email")
.expect("contact_email column should exist");
let contact_country_col = table
.columns
.iter()
.find(|c| c.name == "contact_country")
.expect("contact_country column should exist");
assert_eq!(table.indices.len(), 3);
let email_index = &table.indices[1];
assert!(email_index.unique);
assert!(!email_index.primary_key);
assert_eq!(email_index.columns.len(), 1);
assert_eq!(email_index.columns[0].column, contact_email_col.id);
let country_index = &table.indices[2];
assert!(!country_index.unique);
assert!(!country_index.primary_key);
assert_eq!(country_index.columns.len(), 1);
assert_eq!(country_index.columns[0].column, contact_country_col.id);
}
#[driver_test]
pub async fn embedded_struct_unique_index_enforced(test: &mut Test) -> Result<()> {
#[derive(Debug, toasty::Embed)]
struct Contact {
#[unique]
email: String,
}
#[derive(Debug, toasty::Model)]
struct User {
#[key]
id: String,
name: String,
contact: Contact,
}
let mut db = test.setup_db(models!(User, Contact)).await;
User::create()
.id("1")
.name("Alice")
.contact(Contact {
email: "alice@example.com".to_string(),
})
.exec(&mut db)
.await?;
assert_err!(
User::create()
.id("2")
.name("Bob")
.contact(Contact {
email: "alice@example.com".to_string(),
})
.exec(&mut db)
.await
);
User::create()
.id("3")
.name("Charlie")
.contact(Contact {
email: "charlie@example.com".to_string(),
})
.exec(&mut db)
.await?;
let users = User::filter(User::fields().contact().email().eq("alice@example.com"))
.exec(&mut db)
.await?;
assert_eq!(users.len(), 1);
assert_eq!(users[0].name, "Alice");
Ok(())
}
#[driver_test]
pub async fn nested_embedded_struct_index(test: &mut Test) {
#[derive(Debug, toasty::Embed)]
struct Geo {
#[index]
city: String,
zip: String,
}
#[derive(Debug, toasty::Embed)]
struct Address {
street: String,
#[allow(dead_code)]
geo: Geo,
}
#[derive(Debug, toasty::Model)]
struct User {
#[key]
id: String,
#[allow(dead_code)]
address: Address,
}
let db = test.setup_db(models!(User, Address, Geo)).await;
let schema = db.schema();
let table = &schema.db.tables[0];
let city_col = table
.columns
.iter()
.find(|c| c.name == "address_geo_city")
.expect("address_geo_city column should exist");
assert_eq!(table.indices.len(), 2);
let city_index = &table.indices[1];
assert!(!city_index.unique);
assert_eq!(city_index.columns.len(), 1);
assert_eq!(city_index.columns[0].column, city_col.id);
}