#![allow(dead_code, private_interfaces)]
use umbral_testing::fake::Fake;
use umbral_testing::fake::faker::lorem::en::Word;
use umbral_testing::{Factory, seq};
#[derive(Debug, Clone, sqlx::FromRow, serde::Serialize, serde::Deserialize, umbral::orm::Model)]
struct Widget {
id: i64,
name: String,
#[umbral(unique, max_length = 100)]
slug: String,
count: i32,
}
struct WidgetFactory;
impl Factory for WidgetFactory {
type Model = Widget;
fn build() -> Widget {
Widget {
id: 0,
name: Word().fake(),
slug: format!("widget-{}", seq()),
count: (1..100i32).fake(),
}
}
}
async fn boot() {
let pool = umbral::db::connect_sqlite("sqlite::memory:")
.await
.expect("in-memory sqlite");
let mut settings = umbral::Settings::from_env().expect("settings");
settings.database_url = "sqlite::memory:".to_string();
umbral::App::builder()
.settings(settings)
.database("default", pool.clone())
.model::<Widget>()
.build()
.expect("App::build");
sqlx::query(
"CREATE TABLE widget (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
slug TEXT NOT NULL UNIQUE,
count INTEGER NOT NULL
)",
)
.execute(&pool)
.await
.expect("CREATE TABLE");
}
#[tokio::test]
async fn factory_build_create_and_batch() {
boot().await;
let built = WidgetFactory::build();
assert_eq!(built.id, 0, "built instance is unsaved");
assert!(built.slug.starts_with("widget-"), "slug uses seq()");
let created = WidgetFactory::create().await.expect("create persists");
assert!(created.id > 0, "created row has a real id");
let big = WidgetFactory::create_with(|w| w.count = 999)
.await
.expect("create_with persists");
assert_eq!(big.count, 999, "the override took effect");
assert!(big.id > 0);
let batch = WidgetFactory::create_batch(5)
.await
.expect("batch persists without UNIQUE collision");
assert_eq!(batch.len(), 5);
let total = Widget::objects().count().await.expect("count");
assert_eq!(total, 7, "every factory row was persisted through the ORM");
}