brass/macros/src/lib.rs

36 lines
964 B
Rust

use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, ItemFn};
#[proc_macro_attribute]
pub fn db_test(_: TokenStream, item: TokenStream) -> TokenStream {
let input = parse_macro_input!(item as ItemFn);
let test_name = input.sig.ident.clone();
let test_arguments = input.sig.inputs;
let test_block = input.block;
let inner_test_name = syn::Ident::new(
format!("inner_{}", test_name).as_str(),
input.sig.ident.span(),
);
let setup = quote! {
let context = crate::utils::test_helper::setup().await;
};
let teardown = quote! {
crate::utils::test_helper::teardown(context).await;
};
let output = quote!(
#[actix_web::test]
async fn #test_name() {
#setup
async fn #inner_test_name(#test_arguments) #test_block
#inner_test_name(&context).await;
#teardown
}
);
TokenStream::from(output)
}