ts-sql-helper-derive 0.6.2

Derives for ts-sql-helper-lib
Documentation
use proc_macro2::TokenStream;
use quote::{format_ident, quote};
use syn::Ident;

pub fn create_test(struct_name: &Ident) -> TokenStream {
    let test_name = format_ident!("test_{struct_name}");

    quote! {
        #[cfg(test)]
        #[allow(non_snake_case)]
        #[test]
        fn #test_name() {
            use ts_sql_helper_lib::test::get_test_database;

            let (mut client, _container) = get_test_database();
            let statement = client.prepare(#struct_name::QUERY);
            assert!(statement.is_ok(), "invalid query `{}`: {}", #struct_name::QUERY, statement.unwrap_err());
            let statement = statement.unwrap();

            let mut data: Vec<Box<dyn ts_sql_helper_lib::postgres_types::ToSql + Sync>> = Vec::new();
            let params = statement.params();
            for param in params.iter() {
                match ts_sql_helper_lib::test::data_for_type(param) {
                    Some(param_data) => data.push(param_data),
                    None => panic!("unsupported parameter type `{}`", param.name()),
                }
            }

            let borrowed_data: Vec<&(dyn ts_sql_helper_lib::postgres_types::ToSql + Sync)> =
                data.iter().map(|data| data.as_ref()).collect();

            let result = client.execute(&statement, borrowed_data.as_slice());
            if let Err(error) = result {
                use ts_sql_helper_lib::postgres::error::SqlState;

                assert!(
                    matches!(
                        error.code(),
                        Some(&SqlState::FOREIGN_KEY_VIOLATION) | Some(&SqlState::CHECK_VIOLATION)
                    ),
                    "invalid query `{}`: {error}",
                    #struct_name::QUERY
                );
            }
        }
    }
}