Skip to content

Commit 6269ff9

Browse files
committed
Fixed a bug where fixtures weren't executed when sqlx::test had no arguments.
1 parent 09a539d commit 6269ff9

1 file changed

Lines changed: 21 additions & 23 deletions

File tree

sqlx-macros-core/src/test_attr.rs

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -105,22 +105,10 @@ fn expand_advanced(args: AttributeArgs, input: syn::ItemFn) -> crate::Result<Tok
105105

106106
match parsed_args_list.len() {
107107
0 => {
108-
return Ok(quote! {
109-
#(#attrs)*
110-
#[::core::prelude::v1::test]
111-
fn #name() #ret {
112-
async fn #name(#inputs) #ret {
113-
#body
114-
}
115-
116-
let mut args = ::sqlx::testing::TestArgs::new(concat!(module_path!(), "::", stringify!(#name)));
117-
118-
// We need to give a coercion site or else we get "unimplemented trait" errors.
119-
let f: fn(#(#fn_arg_types),*) -> _ = #name;
120-
121-
::sqlx::testing::TestFn::run_test(f, args)
122-
}
123-
});
108+
return Err(Box::new(syn::Error::new_spanned(
109+
args.first().unwrap(),
110+
"BUG: unexpected args.",
111+
)));
124112
}
125113
args_num @ 1..=4 => {
126114
use proc_macro2::Span;
@@ -139,13 +127,18 @@ fn expand_advanced(args: AttributeArgs, input: syn::ItemFn) -> crate::Result<Tok
139127

140128
let mut args = Vec::new();
141129
for (i, parsed_args) in parsed_args_list.iter().enumerate() {
142-
let args_name = Ident::new(&format!("args{}", 1 + i), Span::call_site());
130+
let args_name = Ident::new(&format!("args{}", i + 1), Span::call_site());
131+
let test_path_suffix = if i == 0 {
132+
String::new()
133+
} else {
134+
format!("_{}", i + 1)
135+
};
143136
let database_url_var = &parsed_args.database_url_var;
144137
let migrations = &parsed_args.migrations;
145138
let fixtures = parsed_args.fixtures.as_slice();
146139

147140
args.push(quote! {
148-
let mut #args_name = ::sqlx::testing::TestArgs::new(concat!(module_path!(), "::", stringify!(#name), "#{", #i, "}"));
141+
let mut #args_name = ::sqlx::testing::TestArgs::new(concat!(module_path!(), "::", stringify!(#name), #test_path_suffix));
149142
#args_name.#migrations
150143
#args_name.fixtures(&[#(#fixtures),*]);
151144
#args_name.database_url_var(#database_url_var);
@@ -188,15 +181,20 @@ fn parse_attr_args(
188181

189182
let mut parsed_args: Vec<ParsedArgs> = Vec::new();
190183

184+
if args.is_empty() {
185+
let parsed = parse_one_attr_args(args, input, config)?;
186+
return Ok(vec![parsed]);
187+
}
188+
191189
for arg in args {
192190
match arg {
193191
syn::Meta::List(list) if list.path.is_ident("env") => {
194192
let args = parser.parse2(list.tokens.clone())?;
195-
let parsed = parse_one_attr_args(args, input, config)?;
193+
let parsed = parse_one_attr_args(&args, input, config)?;
196194
parsed_args.push(parsed);
197195
}
198196
_ => {
199-
let parsed = parse_one_attr_args(args.clone(), input, config)?;
197+
let parsed = parse_one_attr_args(args, input, config)?;
200198
return Ok(vec![parsed]);
201199
}
202200
}
@@ -207,7 +205,7 @@ fn parse_attr_args(
207205

208206
#[cfg(feature = "migrate")]
209207
fn parse_one_attr_args(
210-
args: AttributeArgs,
208+
args: &AttributeArgs,
211209
input: &syn::ItemFn,
212210
config: &sqlx_core::config::Config,
213211
) -> crate::Result<ParsedArgs> {
@@ -307,7 +305,7 @@ fn parse_one_attr_args(
307305
}
308306

309307
#[cfg(feature = "migrate")]
310-
fn parse_args(attr_args: AttributeArgs) -> syn::Result<Args> {
308+
fn parse_args(attr_args: &AttributeArgs) -> syn::Result<Args> {
311309
use proc_macro2::Span;
312310
use syn::{
313311
parenthesized, parse::Parse, punctuated::Punctuated, token::Comma, Expr, Lit, LitStr, Meta,
@@ -376,7 +374,7 @@ fn parse_args(attr_args: AttributeArgs) -> syn::Result<Args> {
376374
}
377375
}
378376

379-
let Some(lit) = recurse_lit_lookup(value.value) else {
377+
let Some(lit) = recurse_lit_lookup(value.value.clone()) else {
380378
return Err(syn::Error::new_spanned(path, "expected string or `false`"));
381379
};
382380

0 commit comments

Comments
 (0)