@@ -244,7 +244,165 @@ fn test_generate_schema_type_code_no_from_impl_with_add() {
244244 assert ! ( result. is_ok( ) ) ;
245245 let ( tokens, _metadata) = result. unwrap ( ) ;
246246 let output = tokens. to_string ( ) ;
247- assert ! ( !output. contains( "impl From" ) ) ;
247+ assert ! (
248+ output. contains( "UserWithExtra" ) ,
249+ "expected struct UserWithExtra in output: {output}"
250+ ) ;
251+ assert ! (
252+ !output. contains( "impl From" ) ,
253+ "expected no From impl when `add` is used: {output}"
254+ ) ;
255+ }
256+
257+ // ========================
258+ // is_parseable_type tests
259+ // ========================
260+
261+ #[ test]
262+ fn test_is_parseable_type_primitives ( ) {
263+ for ty_str in & [
264+ "i8" , "i16" , "i32" , "i64" , "i128" , "isize" , "u8" , "u16" , "u32" , "u64" , "u128" , "usize" ,
265+ "f32" , "f64" , "bool" , "String" , "Decimal" ,
266+ ] {
267+ let ty: syn:: Type = syn:: parse_str ( ty_str) . unwrap ( ) ;
268+ assert ! ( is_parseable_type( & ty) , "{ty_str} should be parseable" ) ;
269+ }
270+ }
271+
272+ #[ test]
273+ fn test_is_parseable_type_non_parseable ( ) {
274+ let ty: syn:: Type = syn:: parse_str ( "MyEnum" ) . unwrap ( ) ;
275+ assert ! ( !is_parseable_type( & ty) ) ;
276+ }
277+
278+ #[ test]
279+ fn test_is_parseable_type_non_path ( ) {
280+ let ty: syn:: Type = syn:: parse_str ( "&str" ) . unwrap ( ) ;
281+ assert ! ( !is_parseable_type( & ty) ) ;
282+ }
283+
284+ // ======================================
285+ // generate_sea_orm_default_attrs tests
286+ // ======================================
287+
288+ #[ test]
289+ fn test_sea_orm_default_attrs_optional_field_skips ( ) {
290+ let attrs: Vec < syn:: Attribute > = vec ! [ syn:: parse_quote!( #[ sea_orm( default_value = "42" ) ] ) ] ;
291+ let struct_name = syn:: Ident :: new ( "Test" , proc_macro2:: Span :: call_site ( ) ) ;
292+ let ty: syn:: Type = syn:: parse_str ( "i32" ) . unwrap ( ) ;
293+ let mut fns = Vec :: new ( ) ;
294+ let ( serde, schema) =
295+ generate_sea_orm_default_attrs ( & attrs, & struct_name, "count" , & ty, & ty, true , & mut fns) ;
296+ assert ! ( serde. is_empty( ) ) ;
297+ assert ! ( schema. is_empty( ) ) ;
298+ assert ! ( fns. is_empty( ) ) ;
299+ }
300+
301+ #[ test]
302+ fn test_sea_orm_default_attrs_no_default_value ( ) {
303+ let attrs: Vec < syn:: Attribute > = vec ! [ syn:: parse_quote!( #[ sea_orm( primary_key) ] ) ] ;
304+ let struct_name = syn:: Ident :: new ( "Test" , proc_macro2:: Span :: call_site ( ) ) ;
305+ let ty: syn:: Type = syn:: parse_str ( "i32" ) . unwrap ( ) ;
306+ let mut fns = Vec :: new ( ) ;
307+ let ( serde, schema) =
308+ generate_sea_orm_default_attrs ( & attrs, & struct_name, "id" , & ty, & ty, false , & mut fns) ;
309+ assert ! ( serde. is_empty( ) ) ;
310+ assert ! ( schema. is_empty( ) ) ;
311+ }
312+
313+ #[ test]
314+ fn test_sea_orm_default_attrs_sql_function_skips ( ) {
315+ let attrs: Vec < syn:: Attribute > = vec ! [ syn:: parse_quote!( #[ sea_orm( default_value = "NOW()" ) ] ) ] ;
316+ let struct_name = syn:: Ident :: new ( "Test" , proc_macro2:: Span :: call_site ( ) ) ;
317+ let ty: syn:: Type = syn:: parse_str ( "String" ) . unwrap ( ) ;
318+ let mut fns = Vec :: new ( ) ;
319+ let ( serde, schema) = generate_sea_orm_default_attrs (
320+ & attrs,
321+ & struct_name,
322+ "created_at" ,
323+ & ty,
324+ & ty,
325+ false ,
326+ & mut fns,
327+ ) ;
328+ assert ! ( serde. is_empty( ) ) ;
329+ assert ! ( schema. is_empty( ) ) ;
330+ }
331+
332+ #[ test]
333+ fn test_sea_orm_default_attrs_existing_serde_default ( ) {
334+ let attrs: Vec < syn:: Attribute > = vec ! [
335+ syn:: parse_quote!( #[ sea_orm( default_value = "42" ) ] ) ,
336+ syn:: parse_quote!( #[ serde( default ) ] ) ,
337+ ] ;
338+ let struct_name = syn:: Ident :: new ( "Test" , proc_macro2:: Span :: call_site ( ) ) ;
339+ let ty: syn:: Type = syn:: parse_str ( "i32" ) . unwrap ( ) ;
340+ let mut fns = Vec :: new ( ) ;
341+ let ( serde, schema) =
342+ generate_sea_orm_default_attrs ( & attrs, & struct_name, "count" , & ty, & ty, false , & mut fns) ;
343+ // serde attr should be empty (already has serde default)
344+ assert ! ( serde. is_empty( ) ) ;
345+ // schema attr should still be generated
346+ let schema_str = schema. to_string ( ) ;
347+ assert ! (
348+ schema_str. contains( "schema" ) ,
349+ "should have schema attr: {schema_str}"
350+ ) ;
351+ assert ! (
352+ fns. is_empty( ) ,
353+ "no default fn needed when serde(default) exists"
354+ ) ;
355+ }
356+
357+ #[ test]
358+ fn test_sea_orm_default_attrs_non_parseable_type ( ) {
359+ let attrs: Vec < syn:: Attribute > = vec ! [ syn:: parse_quote!( #[ sea_orm( default_value = "Active" ) ] ) ] ;
360+ let struct_name = syn:: Ident :: new ( "Test" , proc_macro2:: Span :: call_site ( ) ) ;
361+ let ty: syn:: Type = syn:: parse_str ( "MyEnum" ) . unwrap ( ) ;
362+ let mut fns = Vec :: new ( ) ;
363+ let ( serde, schema) =
364+ generate_sea_orm_default_attrs ( & attrs, & struct_name, "status" , & ty, & ty, false , & mut fns) ;
365+ // serde attr empty (non-parseable type)
366+ assert ! ( serde. is_empty( ) ) ;
367+ // schema attr still generated
368+ let schema_str = schema. to_string ( ) ;
369+ assert ! (
370+ schema_str. contains( "schema" ) ,
371+ "should have schema attr: {schema_str}"
372+ ) ;
373+ assert ! ( fns. is_empty( ) ) ;
374+ }
375+
376+ #[ test]
377+ fn test_sea_orm_default_attrs_full_generation ( ) {
378+ let attrs: Vec < syn:: Attribute > = vec ! [ syn:: parse_quote!( #[ sea_orm( default_value = "42" ) ] ) ] ;
379+ let struct_name = syn:: Ident :: new ( "Test" , proc_macro2:: Span :: call_site ( ) ) ;
380+ let ty: syn:: Type = syn:: parse_str ( "i32" ) . unwrap ( ) ;
381+ let mut fns = Vec :: new ( ) ;
382+ let ( serde, schema) =
383+ generate_sea_orm_default_attrs ( & attrs, & struct_name, "count" , & ty, & ty, false , & mut fns) ;
384+ // Both serde and schema attrs should be generated
385+ let serde_str = serde. to_string ( ) ;
386+ assert ! (
387+ serde_str. contains( "serde" ) ,
388+ "should have serde attr: {serde_str}"
389+ ) ;
390+ assert ! (
391+ serde_str. contains( "default_Test_count" ) ,
392+ "should reference generated fn: {serde_str}"
393+ ) ;
394+ let schema_str = schema. to_string ( ) ;
395+ assert ! (
396+ schema_str. contains( "schema" ) ,
397+ "should have schema attr: {schema_str}"
398+ ) ;
399+ // Default function should be generated
400+ assert_eq ! ( fns. len( ) , 1 , "should generate one default function" ) ;
401+ let fn_str = fns[ 0 ] . to_string ( ) ;
402+ assert ! (
403+ fn_str. contains( "default_Test_count" ) ,
404+ "fn name should match: {fn_str}"
405+ ) ;
248406}
249407
250408#[ test]
0 commit comments