sea-orm/tests/returning_tests.rs
Andrea Corradi c56c072f27
Enable sqlite returning with feature flag (#2070)
* Enable sqlite returning with feature flag

* Add runtime check for sqlite version

* Apply suggestions from code review

* Fix clippy

* Rename feature

* Fix tests when feature flag is not enabled

---------

Co-authored-by: Chris Tsang <chris.2y3@outlook.com>
2024-01-26 04:28:59 +08:00

194 lines
5.3 KiB
Rust

pub mod common;
pub use common::{bakery_chain::*, setup::*, TestContext};
use sea_orm::{entity::prelude::*, IntoActiveModel};
pub use sea_query::{Expr, Query};
use serde_json::json;
#[sea_orm_macros::test]
#[cfg(any(
feature = "sqlx-mysql",
feature = "sqlx-sqlite",
feature = "sqlx-postgres"
))]
async fn main() -> Result<(), DbErr> {
use bakery::*;
let ctx = TestContext::new("returning_tests").await;
let db = &ctx.db;
let builder = db.get_database_backend();
let mut insert = Query::insert();
insert
.into_table(Entity)
.columns([Column::Name, Column::ProfitMargin])
.values_panic(["Bakery Shop".into(), 0.5.into()]);
let mut update = Query::update();
update
.table(Entity)
.values([
(Column::Name, "Bakery Shop".into()),
(Column::ProfitMargin, 0.5.into()),
])
.and_where(Column::Id.eq(1));
let returning = Query::returning().columns([Column::Id, Column::Name, Column::ProfitMargin]);
create_tables(db).await?;
if db.support_returning() {
insert.returning(returning.clone());
let insert_res = db
.query_one(builder.build(&insert))
.await?
.expect("Insert failed with query_one");
let _id: i32 = insert_res.try_get("", "id")?;
let _name: String = insert_res.try_get("", "name")?;
let _profit_margin: f64 = insert_res.try_get("", "profit_margin")?;
update.returning(returning.clone());
let update_res = db
.query_one(builder.build(&update))
.await?
.expect("Update filed with query_one");
let _id: i32 = update_res.try_get("", "id")?;
let _name: String = update_res.try_get("", "name")?;
let _profit_margin: f64 = update_res.try_get("", "profit_margin")?;
} else {
let insert_res = db.execute(builder.build(&insert)).await?;
assert!(insert_res.rows_affected() > 0);
let update_res = db.execute(builder.build(&update)).await?;
assert!(update_res.rows_affected() > 0);
}
ctx.delete().await;
Ok(())
}
#[sea_orm_macros::test]
#[cfg(any(
feature = "sqlx-mysql",
feature = "sqlx-sqlite",
feature = "sqlx-postgres"
))]
#[cfg_attr(
any(
feature = "sqlx-mysql",
all(
feature = "sqlx-sqlite",
not(feature = "sqlite-use-returning-for-3_35")
)
),
should_panic(expected = "Database backend doesn't support RETURNING")
)]
async fn update_many() {
pub use common::{features::*, TestContext};
use edit_log::*;
let run = || async {
let ctx = TestContext::new("returning_tests_update_many").await;
let db = &ctx.db;
create_tables(db).await?;
Entity::insert(
Model {
id: 1,
action: "before_save".into(),
values: json!({ "id": "unique-id-001" }),
}
.into_active_model(),
)
.exec(db)
.await?;
Entity::insert(
Model {
id: 2,
action: "before_save".into(),
values: json!({ "id": "unique-id-002" }),
}
.into_active_model(),
)
.exec(db)
.await?;
Entity::insert(
Model {
id: 3,
action: "before_save".into(),
values: json!({ "id": "unique-id-003" }),
}
.into_active_model(),
)
.exec(db)
.await?;
assert_eq!(
Entity::find().all(db).await?,
[
Model {
id: 1,
action: "before_save".into(),
values: json!({ "id": "unique-id-001" }),
},
Model {
id: 2,
action: "before_save".into(),
values: json!({ "id": "unique-id-002" }),
},
Model {
id: 3,
action: "before_save".into(),
values: json!({ "id": "unique-id-003" }),
},
]
);
// Update many with returning
assert_eq!(
Entity::update_many()
.col_expr(
Column::Values,
Expr::value(json!({ "remarks": "save log" }))
)
.filter(Column::Action.eq("before_save"))
.exec_with_returning(db)
.await?,
[
Model {
id: 1,
action: "before_save".into(),
values: json!({ "remarks": "save log" }),
},
Model {
id: 2,
action: "before_save".into(),
values: json!({ "remarks": "save log" }),
},
Model {
id: 3,
action: "before_save".into(),
values: json!({ "remarks": "save log" }),
},
]
);
// No-op
assert_eq!(
Entity::update_many()
.filter(Column::Action.eq("before_save"))
.exec_with_returning(db)
.await?,
[]
);
Result::<(), DbErr>::Ok(())
};
run().await.unwrap();
}