From 2cfaa34a3390eb7ad4c57ee120f263df8e10c0af Mon Sep 17 00:00:00 2001 From: Billy Chan Date: Tue, 17 Aug 2021 16:40:53 +0800 Subject: [PATCH] Test against all supported runtime --- sea-orm-macros/src/lib.rs | 20 ++++++++++++++++++++ src/entity/base_entity.rs | 18 +++++++++--------- src/executor/paginator.rs | 16 ++++++++-------- src/executor/select.rs | 8 ++++---- src/lib.rs | 2 ++ src/query/json.rs | 8 +++++--- src/runtime.rs | 33 +++++++++++++++++++++++++++++++++ tests/basic.rs | 4 +--- tests/crud_tests.rs | 4 +--- tests/query_tests.rs | 32 ++++++++------------------------ tests/relational_tests.rs | 20 +++++--------------- tests/sequential_op_tests.rs | 4 +--- 12 files changed, 97 insertions(+), 72 deletions(-) create mode 100644 src/runtime.rs diff --git a/sea-orm-macros/src/lib.rs b/sea-orm-macros/src/lib.rs index 2ac0ac75..a04d17a0 100644 --- a/sea-orm-macros/src/lib.rs +++ b/sea-orm-macros/src/lib.rs @@ -84,3 +84,23 @@ pub fn derive_from_query_result(input: TokenStream) -> TokenStream { Err(e) => e.to_compile_error().into(), } } + +#[doc(hidden)] +#[proc_macro_attribute] +pub fn test(_: TokenStream, input: TokenStream) -> TokenStream { + let input = syn::parse_macro_input!(input as syn::ItemFn); + + let ret = &input.sig.output; + let name = &input.sig.ident; + let body = &input.block; + let attrs = &input.attrs; + + quote::quote! ( + #[test] + #(#attrs)* + fn #name() #ret { + ::sea_orm::block_on!(async { #body }) + } + ) + .into() +} diff --git a/src/entity/base_entity.rs b/src/entity/base_entity.rs index 855a55df..a810d7ac 100644 --- a/src/entity/base_entity.rs +++ b/src/entity/base_entity.rs @@ -107,7 +107,7 @@ pub trait EntityTrait: EntityName { /// # /// use sea_orm::{entity::*, query::*, tests_cfg::cake}; /// - /// # let _: Result<(), DbErr> = async_std::task::block_on(async { + /// # let _: Result<(), DbErr> = sea_orm::block_on!(async { /// # /// assert_eq!( /// cake::Entity::find().one(&db).await?, @@ -170,7 +170,7 @@ pub trait EntityTrait: EntityName { /// # /// use sea_orm::{entity::*, query::*, tests_cfg::cake}; /// - /// # let _: Result<(), DbErr> = async_std::task::block_on(async { + /// # let _: Result<(), DbErr> = sea_orm::block_on!(async { /// # /// assert_eq!( /// cake::Entity::find_by_id(11).all(&db).await?, @@ -207,7 +207,7 @@ pub trait EntityTrait: EntityName { /// # /// use sea_orm::{entity::*, query::*, tests_cfg::cake_filling}; /// - /// # let _: Result<(), DbErr> = async_std::task::block_on(async { + /// # let _: Result<(), DbErr> = sea_orm::block_on!(async { /// # /// assert_eq!( /// cake_filling::Entity::find_by_id((2, 3)).all(&db).await?, @@ -275,7 +275,7 @@ pub trait EntityTrait: EntityName { /// ..Default::default() /// }; /// - /// # let _: Result<(), DbErr> = async_std::task::block_on(async { + /// # let _: Result<(), DbErr> = sea_orm::block_on!(async { /// # /// let insert_result = cake::Entity::insert(apple).exec(&db).await?; /// @@ -326,7 +326,7 @@ pub trait EntityTrait: EntityName { /// ..Default::default() /// }; /// - /// # let _: Result<(), DbErr> = async_std::task::block_on(async { + /// # let _: Result<(), DbErr> = sea_orm::block_on!(async { /// # /// let insert_result = cake::Entity::insert_many(vec![apple, orange]).exec(&db).await?; /// @@ -378,7 +378,7 @@ pub trait EntityTrait: EntityName { /// ..Default::default() /// }; /// - /// # let _: Result<(), DbErr> = async_std::task::block_on(async { + /// # let _: Result<(), DbErr> = sea_orm::block_on!(async { /// # /// assert_eq!( /// fruit::Entity::update(orange.clone()).exec(&db).await?, // Clone here because we need to assert_eq @@ -422,7 +422,7 @@ pub trait EntityTrait: EntityName { /// # /// use sea_orm::{entity::*, query::*, tests_cfg::fruit, sea_query::{Expr, Value}}; /// - /// # let _: Result<(), DbErr> = async_std::task::block_on(async { + /// # let _: Result<(), DbErr> = sea_orm::block_on!(async { /// # /// let update_result = fruit::Entity::update_many() /// .col_expr(fruit::Column::CakeId, Expr::value(Value::Null)) @@ -471,7 +471,7 @@ pub trait EntityTrait: EntityName { /// ..Default::default() /// }; /// - /// # let _: Result<(), DbErr> = async_std::task::block_on(async { + /// # let _: Result<(), DbErr> = sea_orm::block_on!(async { /// # /// let delete_result = fruit::Entity::delete(orange).exec(&db).await?; /// @@ -514,7 +514,7 @@ pub trait EntityTrait: EntityName { /// # /// use sea_orm::{entity::*, query::*, tests_cfg::fruit}; /// - /// # let _: Result<(), DbErr> = async_std::task::block_on(async { + /// # let _: Result<(), DbErr> = sea_orm::block_on!(async { /// # /// let delete_result = fruit::Entity::delete_many() /// .filter(fruit::Column::Name.contains("Apple")) diff --git a/src/executor/paginator.rs b/src/executor/paginator.rs index d44bbc5e..cbf50bf5 100644 --- a/src/executor/paginator.rs +++ b/src/executor/paginator.rs @@ -97,7 +97,7 @@ where /// # use sea_orm::{error::*, MockDatabase, DbBackend}; /// # let owned_db = MockDatabase::new(DbBackend::Postgres).into_connection(); /// # let db = &owned_db; - /// # let _: Result<(), DbErr> = async_std::task::block_on(async { + /// # let _: Result<(), DbErr> = sea_orm::block_on!(async { /// # /// use sea_orm::{entity::*, query::*, tests_cfg::cake}; /// let mut cake_pages = cake::Entity::find() @@ -125,7 +125,7 @@ where /// # use sea_orm::{error::*, MockDatabase, DbBackend}; /// # let owned_db = MockDatabase::new(DbBackend::Postgres).into_connection(); /// # let db = &owned_db; - /// # let _: Result<(), DbErr> = async_std::task::block_on(async { + /// # let _: Result<(), DbErr> = sea_orm::block_on!(async { /// # /// use futures::TryStreamExt; /// use sea_orm::{entity::*, query::*, tests_cfg::cake}; @@ -203,7 +203,7 @@ mod tests { (db, num_items) } - #[async_std::test] + #[sea_orm_macros::test] async fn fetch_page() -> Result<(), DbErr> { let (db, pages) = setup(); @@ -233,7 +233,7 @@ mod tests { Ok(()) } - #[async_std::test] + #[sea_orm_macros::test] async fn fetch() -> Result<(), DbErr> { let (db, pages) = setup(); @@ -267,7 +267,7 @@ mod tests { Ok(()) } - #[async_std::test] + #[sea_orm_macros::test] async fn num_pages() -> Result<(), DbErr> { let (db, num_items) = setup_num_items(); @@ -299,7 +299,7 @@ mod tests { Ok(()) } - #[async_std::test] + #[sea_orm_macros::test] async fn next_and_cur_page() -> Result<(), DbErr> { let (db, _) = setup(); @@ -315,7 +315,7 @@ mod tests { Ok(()) } - #[async_std::test] + #[sea_orm_macros::test] async fn fetch_and_next() -> Result<(), DbErr> { let (db, pages) = setup(); @@ -350,7 +350,7 @@ mod tests { Ok(()) } - #[async_std::test] + #[sea_orm_macros::test] async fn into_stream() -> Result<(), DbErr> { let (db, pages) = setup(); diff --git a/src/executor/select.rs b/src/executor/select.rs index 2997448a..9d355049 100644 --- a/src/executor/select.rs +++ b/src/executor/select.rs @@ -287,7 +287,7 @@ where /// num_of_cakes: i32, /// } /// - /// # let _: Result<(), DbErr> = async_std::task::block_on(async { + /// # let _: Result<(), DbErr> = sea_orm::block_on!(async { /// # /// let res: Vec = cake::Entity::find().from_raw_sql( /// Statement::from_sql_and_values( @@ -352,7 +352,7 @@ where /// # /// use sea_orm::{entity::*, query::*, tests_cfg::cake}; /// - /// # let _: Result<(), DbErr> = async_std::task::block_on(async { + /// # let _: Result<(), DbErr> = sea_orm::block_on!(async { /// # /// let res: Vec = cake::Entity::find().from_raw_sql( /// Statement::from_sql_and_values( @@ -404,7 +404,7 @@ where /// # /// use sea_orm::{entity::*, query::*, tests_cfg::cake}; /// - /// # let _: Result<(), DbErr> = async_std::task::block_on(async { + /// # let _: Result<(), DbErr> = sea_orm::block_on!(async { /// # /// let _: Option = cake::Entity::find().from_raw_sql( /// Statement::from_sql_and_values( @@ -439,7 +439,7 @@ where /// # /// use sea_orm::{entity::*, query::*, tests_cfg::cake}; /// - /// # let _: Result<(), DbErr> = async_std::task::block_on(async { + /// # let _: Result<(), DbErr> = sea_orm::block_on!(async { /// # /// let _: Vec = cake::Entity::find().from_raw_sql( /// Statement::from_sql_and_values( diff --git a/src/lib.rs b/src/lib.rs index 93ec2545..2451cb5a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -207,6 +207,8 @@ pub mod error; mod executor; pub mod query; #[doc(hidden)] +pub mod runtime; +#[doc(hidden)] pub mod tests_cfg; mod util; diff --git a/src/query/json.rs b/src/query/json.rs index 95538032..b1872ab6 100644 --- a/src/query/json.rs +++ b/src/query/json.rs @@ -140,11 +140,11 @@ impl FromQueryResult for JsonValue { #[cfg(feature = "mock")] mod tests { use crate::tests_cfg::cake; - use crate::{entity::*, DbBackend, MockDatabase}; + use crate::{entity::*, DbBackend, DbErr, MockDatabase}; use sea_query::Value; - #[async_std::test] - async fn to_json_1() { + #[sea_orm_macros::test] + async fn to_json_1() -> Result<(), DbErr> { let db = MockDatabase::new(DbBackend::Postgres) .append_query_results(vec![vec![maplit::btreemap! { "id" => Into::::into(128), "name" => Into::::into("apple") @@ -158,5 +158,7 @@ mod tests { "name": "apple" })) ); + + Ok(()) } } diff --git a/src/runtime.rs b/src/runtime.rs new file mode 100644 index 00000000..31d7b866 --- /dev/null +++ b/src/runtime.rs @@ -0,0 +1,33 @@ +#[cfg(any( + feature = "runtime-async-std", + all( + not(feature = "runtime-async-std"), + not(feature = "runtime-actix"), + not(feature = "runtime-tokio"), + ), +))] +#[macro_export] +macro_rules! block_on { + ($($expr:tt)*) => { + ::async_std::task::block_on( $($expr)* ) + }; +} + +#[cfg(feature = "runtime-actix")] +#[macro_export] +macro_rules! block_on { + ($($expr:tt)*) => { + ::actix_rt::System::new() + .block_on( $($expr)* ) + }; +} + +#[cfg(feature = "runtime-tokio")] +#[macro_export] +macro_rules! block_on { + ($($expr:tt)*) => { + ::tokio::runtime::Runtime::new() + .unwrap() + .block_on( $($expr)* ) + }; +} diff --git a/tests/basic.rs b/tests/basic.rs index db38a7d5..8101d1f2 100644 --- a/tests/basic.rs +++ b/tests/basic.rs @@ -2,9 +2,7 @@ use sea_orm::{entity::*, error::*, sea_query, tests_cfg::*, Database, DbConn}; // DATABASE_URL="sqlite::memory:" cargo test --features sqlx-sqlit,runtime-async-std --test basic -#[cfg_attr(feature = "runtime-async-std", async_std::test)] -#[cfg_attr(feature = "runtime-actix", actix_rt::test)] -#[cfg_attr(feature = "runtime-tokio", tokio::test)] +#[sea_orm_macros::test] #[cfg(feature = "sqlx-sqlite")] async fn main() { use std::env; diff --git a/tests/crud_tests.rs b/tests/crud_tests.rs index 94412a4d..3c26ddfd 100644 --- a/tests/crud_tests.rs +++ b/tests/crud_tests.rs @@ -8,9 +8,7 @@ mod crud; // Run the test locally: // DATABASE_URL="mysql://root:root@localhost" cargo test --features sqlx-mysql,runtime-async-std --test crud_tests // DATABASE_URL="postgres://root:root@localhost" cargo test --features sqlx-postgres,runtime-async-std --test crud_tests -#[cfg_attr(feature = "runtime-async-std", async_std::test)] -#[cfg_attr(feature = "runtime-actix", actix_rt::test)] -#[cfg_attr(feature = "runtime-tokio", tokio::test)] +#[sea_orm_macros::test] #[cfg(any( feature = "sqlx-mysql", feature = "sqlx-sqlite", diff --git a/tests/query_tests.rs b/tests/query_tests.rs index 2791f908..4e905686 100644 --- a/tests/query_tests.rs +++ b/tests/query_tests.rs @@ -6,9 +6,7 @@ pub use common::{bakery_chain::*, setup::*, TestContext}; // Run the test locally: // DATABASE_URL="mysql://root:@localhost" cargo test --features sqlx-mysql,runtime-async-std --test query_tests -#[cfg_attr(feature = "runtime-async-std", async_std::test)] -#[cfg_attr(feature = "runtime-actix", actix_rt::test)] -#[cfg_attr(feature = "runtime-tokio", tokio::test)] +#[sea_orm_macros::test] #[cfg(any( feature = "sqlx-mysql", feature = "sqlx-sqlite", @@ -23,9 +21,7 @@ pub async fn find_one_with_no_result() { ctx.delete().await; } -#[cfg_attr(feature = "runtime-async-std", async_std::test)] -#[cfg_attr(feature = "runtime-actix", actix_rt::test)] -#[cfg_attr(feature = "runtime-tokio", tokio::test)] +#[sea_orm_macros::test] #[cfg(any( feature = "sqlx-mysql", feature = "sqlx-sqlite", @@ -50,9 +46,7 @@ pub async fn find_one_with_result() { ctx.delete().await; } -#[cfg_attr(feature = "runtime-async-std", async_std::test)] -#[cfg_attr(feature = "runtime-actix", actix_rt::test)] -#[cfg_attr(feature = "runtime-tokio", tokio::test)] +#[sea_orm_macros::test] #[cfg(any( feature = "sqlx-mysql", feature = "sqlx-sqlite", @@ -67,9 +61,7 @@ pub async fn find_by_id_with_no_result() { ctx.delete().await; } -#[cfg_attr(feature = "runtime-async-std", async_std::test)] -#[cfg_attr(feature = "runtime-actix", actix_rt::test)] -#[cfg_attr(feature = "runtime-tokio", tokio::test)] +#[sea_orm_macros::test] #[cfg(any( feature = "sqlx-mysql", feature = "sqlx-sqlite", @@ -98,9 +90,7 @@ pub async fn find_by_id_with_result() { ctx.delete().await; } -#[cfg_attr(feature = "runtime-async-std", async_std::test)] -#[cfg_attr(feature = "runtime-actix", actix_rt::test)] -#[cfg_attr(feature = "runtime-tokio", tokio::test)] +#[sea_orm_macros::test] #[cfg(any( feature = "sqlx-mysql", feature = "sqlx-sqlite", @@ -115,9 +105,7 @@ pub async fn find_all_with_no_result() { ctx.delete().await; } -#[cfg_attr(feature = "runtime-async-std", async_std::test)] -#[cfg_attr(feature = "runtime-actix", actix_rt::test)] -#[cfg_attr(feature = "runtime-tokio", tokio::test)] +#[sea_orm_macros::test] #[cfg(any( feature = "sqlx-mysql", feature = "sqlx-sqlite", @@ -151,9 +139,7 @@ pub async fn find_all_with_result() { ctx.delete().await; } -#[cfg_attr(feature = "runtime-async-std", async_std::test)] -#[cfg_attr(feature = "runtime-actix", actix_rt::test)] -#[cfg_attr(feature = "runtime-tokio", tokio::test)] +#[sea_orm_macros::test] #[cfg(any( feature = "sqlx-mysql", feature = "sqlx-sqlite", @@ -191,9 +177,7 @@ pub async fn find_all_filter_no_result() { ctx.delete().await; } -#[cfg_attr(feature = "runtime-async-std", async_std::test)] -#[cfg_attr(feature = "runtime-actix", actix_rt::test)] -#[cfg_attr(feature = "runtime-tokio", tokio::test)] +#[sea_orm_macros::test] #[cfg(any( feature = "sqlx-mysql", feature = "sqlx-sqlite", diff --git a/tests/relational_tests.rs b/tests/relational_tests.rs index 85fdee41..ae1236a2 100644 --- a/tests/relational_tests.rs +++ b/tests/relational_tests.rs @@ -8,9 +8,7 @@ pub use common::{bakery_chain::*, setup::*, TestContext}; // Run the test locally: // DATABASE_URL="mysql://root:@localhost" cargo test --features sqlx-mysql,runtime-async-std --test relational_tests -#[cfg_attr(feature = "runtime-async-std", async_std::test)] -#[cfg_attr(feature = "runtime-actix", actix_rt::test)] -#[cfg_attr(feature = "runtime-tokio", tokio::test)] +#[sea_orm_macros::test] #[cfg(any( feature = "sqlx-mysql", feature = "sqlx-sqlite", @@ -91,9 +89,7 @@ pub async fn left_join() { ctx.delete().await; } -#[cfg_attr(feature = "runtime-async-std", async_std::test)] -#[cfg_attr(feature = "runtime-actix", actix_rt::test)] -#[cfg_attr(feature = "runtime-tokio", tokio::test)] +#[sea_orm_macros::test] #[cfg(any(feature = "sqlx-mysql", feature = "sqlx-postgres"))] pub async fn right_join() { let ctx = TestContext::new("test_right_join").await; @@ -174,9 +170,7 @@ pub async fn right_join() { ctx.delete().await; } -#[cfg_attr(feature = "runtime-async-std", async_std::test)] -#[cfg_attr(feature = "runtime-actix", actix_rt::test)] -#[cfg_attr(feature = "runtime-tokio", tokio::test)] +#[sea_orm_macros::test] #[cfg(any( feature = "sqlx-mysql", feature = "sqlx-sqlite", @@ -265,9 +259,7 @@ pub async fn inner_join() { ctx.delete().await; } -#[cfg_attr(feature = "runtime-async-std", async_std::test)] -#[cfg_attr(feature = "runtime-actix", actix_rt::test)] -#[cfg_attr(feature = "runtime-tokio", tokio::test)] +#[sea_orm_macros::test] #[cfg(any( feature = "sqlx-mysql", feature = "sqlx-sqlite", @@ -371,9 +363,7 @@ pub async fn group_by() { ctx.delete().await; } -#[cfg_attr(feature = "runtime-async-std", async_std::test)] -#[cfg_attr(feature = "runtime-actix", actix_rt::test)] -#[cfg_attr(feature = "runtime-tokio", tokio::test)] +#[sea_orm_macros::test] #[cfg(any( feature = "sqlx-mysql", feature = "sqlx-sqlite", diff --git a/tests/sequential_op_tests.rs b/tests/sequential_op_tests.rs index d734ceac..a854c768 100644 --- a/tests/sequential_op_tests.rs +++ b/tests/sequential_op_tests.rs @@ -9,9 +9,7 @@ pub use common::{bakery_chain::*, setup::*, TestContext}; // Run the test locally: // DATABASE_URL="mysql://root:@localhost" cargo test --features sqlx-mysql,runtime-async-std --test sequential_op_tests -#[cfg_attr(feature = "runtime-async-std", async_std::test)] -#[cfg_attr(feature = "runtime-actix", actix_rt::test)] -#[cfg_attr(feature = "runtime-tokio", tokio::test)] +#[sea_orm_macros::test] #[cfg(any(feature = "sqlx-mysql", feature = "sqlx-postgres"))] pub async fn test_multiple_operations() { let ctx = TestContext::new("multiple_sequential_operations").await;