Using SQLite
If you want to test application logic that does not require database-specific features, SQLite will be a good choice for you.
Check out a simple example here.
Integration Test
It is recommended to execute more complex test cases in integration tests. The following code snippet illustrates the steps of connecting to a database, setting up schema and performing tests.
async fn main() -> Result<(), DbErr> {
// Connecting SQLite
let db = Database::connect("sqlite::memory:").await?;
// Setup database schema
setup_schema(&db).await?;
// Performing tests
testcase(&db).await?;
Ok(())
}
Setup database schema
To create tables in SQLite database for testing, instead of writing TableCreateStatement
manually, you can derive it from Entity
using Schema::create_table_from_entity
.
async fn setup_schema(db: &DbConn) {
// Setup Schema helper
let schema = Schema::new(DbBackend::Sqlite);
// Derive from Entity
let stmt: TableCreateStatement = schema.create_table_from_entity(MyEntity);
// Or setup manually
assert_eq!(
stmt.build(SqliteQueryBuilder),
Table::create()
.table(MyEntity)
.col(
ColumnDef::new(MyEntity::Column::Id)
.integer()
.not_null()
)
//...
.build(SqliteQueryBuilder)
);
// Execute create table statement
let result = db
.execute(db.get_database_backend().build(&stmt))
.await;
}
Performing tests
Execute test cases and assert against the results.
async fn testcase(db: &DbConn) -> Result<(), DbErr> {
let baker_bob = baker::ActiveModel {
name: Set("Baker Bob".to_owned()),
contact_details: Set(serde_json::json!({
"mobile": "+61424000000",
"home": "0395555555",
"address": "12 Test St, Testville, Vic, Australia"
})),
bakery_id: Set(2),
..Default::default()
};
let baker_insert_res = Baker::insert(baker_bob)
.exec(db)
.await
.expect("could not insert baker");
assert_eq!(baker_insert_res.last_insert_id, 1);
Ok(())
}