@@ -510,6 +510,245 @@ fn test_generate_schema_type_code_with_partial_fields() {
510510 ) ;
511511}
512512
513+ // ============================================================
514+ // Coverage: omit_default in generate_schema_type_code (line 180)
515+ // ============================================================
516+
517+ #[ test]
518+ fn test_generate_schema_type_code_with_omit_default ( ) {
519+ let storage = to_storage ( vec ! [ create_test_struct_metadata(
520+ "Model" ,
521+ r#"#[sea_orm(table_name = "items")]
522+ pub struct Model {
523+ #[sea_orm(primary_key)]
524+ pub id: i32,
525+ pub name: String,
526+ #[sea_orm(default_value = "NOW()")]
527+ pub created_at: DateTimeWithTimeZone,
528+ }"# ,
529+ ) ] ) ;
530+
531+ let tokens = quote ! ( CreateItemRequest from Model , omit_default) ;
532+ let input: SchemaTypeInput = syn:: parse2 ( tokens) . unwrap ( ) ;
533+ let result = generate_schema_type_code ( & input, & storage) ;
534+
535+ assert ! ( result. is_ok( ) ) ;
536+ let ( tokens, _metadata) = result. unwrap ( ) ;
537+ let output = tokens. to_string ( ) ;
538+ // id (primary_key) and created_at (default_value) should be omitted
539+ assert ! (
540+ !output. contains( "id :" ) ,
541+ "id should be omitted by omit_default: {output}"
542+ ) ;
543+ assert ! (
544+ !output. contains( "created_at" ) ,
545+ "created_at should be omitted by omit_default: {output}"
546+ ) ;
547+ // name should remain
548+ assert ! ( output. contains( "name" ) , "name should remain: {output}" ) ;
549+ }
550+
551+ // ============================================================
552+ // Coverage: SQL function default with existing serde default (line 554)
553+ // ============================================================
554+
555+ #[ test]
556+ fn test_sea_orm_default_attrs_sql_function_with_existing_serde_default ( ) {
557+ let attrs: Vec < syn:: Attribute > = vec ! [
558+ syn:: parse_quote!( #[ sea_orm( default_value = "NOW()" ) ] ) ,
559+ syn:: parse_quote!( #[ serde( default ) ] ) ,
560+ ] ;
561+ let struct_name = syn:: Ident :: new ( "Test" , proc_macro2:: Span :: call_site ( ) ) ;
562+ let ty: syn:: Type = syn:: parse_str ( "DateTimeWithTimeZone" ) . unwrap ( ) ;
563+ let mut fns = Vec :: new ( ) ;
564+ let ( serde, schema) = generate_sea_orm_default_attrs (
565+ & attrs,
566+ & struct_name,
567+ "created_at" ,
568+ & ty,
569+ & ty,
570+ false ,
571+ & mut fns,
572+ ) ;
573+ // serde attr should be empty (already has serde default)
574+ assert ! ( serde. is_empty( ) ) ;
575+ // schema attr should still be generated
576+ let schema_str = schema. to_string ( ) ;
577+ assert ! (
578+ schema_str. contains( "schema" ) ,
579+ "should have schema attr: {schema_str}"
580+ ) ;
581+ assert ! (
582+ schema_str. contains( "1970-01-01" ) ,
583+ "should have epoch default: {schema_str}"
584+ ) ;
585+ assert ! (
586+ fns. is_empty( ) ,
587+ "no default fn needed when serde(default) exists"
588+ ) ;
589+ }
590+
591+ // ============================================================
592+ // Coverage: sql_function_default_for_type branches (lines 580-615)
593+ // ============================================================
594+
595+ #[ test]
596+ fn test_sea_orm_default_attrs_sql_function_non_path_type ( ) {
597+ // Non-Path type (reference) triggers early return None in sql_function_default_for_type
598+ let attrs: Vec < syn:: Attribute > = vec ! [ syn:: parse_quote!( #[ sea_orm( default_value = "NOW()" ) ] ) ] ;
599+ let struct_name = syn:: Ident :: new ( "Test" , proc_macro2:: Span :: call_site ( ) ) ;
600+ let ty: syn:: Type = syn:: parse_str ( "&str" ) . unwrap ( ) ;
601+ let mut fns = Vec :: new ( ) ;
602+ let ( serde, schema) =
603+ generate_sea_orm_default_attrs ( & attrs, & struct_name, "field" , & ty, & ty, false , & mut fns) ;
604+ assert ! ( serde. is_empty( ) , "non-Path type should skip serde default" ) ;
605+ assert ! (
606+ schema. is_empty( ) ,
607+ "non-Path type should skip schema default"
608+ ) ;
609+ assert ! ( fns. is_empty( ) ) ;
610+ }
611+
612+ #[ test]
613+ fn test_sea_orm_default_attrs_sql_function_datetime ( ) {
614+ let attrs: Vec < syn:: Attribute > = vec ! [ syn:: parse_quote!( #[ sea_orm( default_value = "NOW()" ) ] ) ] ;
615+ let struct_name = syn:: Ident :: new ( "Test" , proc_macro2:: Span :: call_site ( ) ) ;
616+ let ty: syn:: Type = syn:: parse_str ( "DateTime" ) . unwrap ( ) ;
617+ let mut fns = Vec :: new ( ) ;
618+ let ( serde, schema) = generate_sea_orm_default_attrs (
619+ & attrs,
620+ & struct_name,
621+ "created_at" ,
622+ & ty,
623+ & ty,
624+ false ,
625+ & mut fns,
626+ ) ;
627+ let serde_str = serde. to_string ( ) ;
628+ assert ! (
629+ serde_str. contains( "serde" ) ,
630+ "DateTime should generate serde default: {serde_str}"
631+ ) ;
632+ let schema_str = schema. to_string ( ) ;
633+ assert ! (
634+ schema_str. contains( "1970-01-01T00:00:00+00:00" ) ,
635+ "DateTime should have epoch default: {schema_str}"
636+ ) ;
637+ assert_eq ! ( fns. len( ) , 1 ) ;
638+ }
639+
640+ #[ test]
641+ fn test_sea_orm_default_attrs_sql_function_naive_datetime ( ) {
642+ let attrs: Vec < syn:: Attribute > = vec ! [ syn:: parse_quote!( #[ sea_orm( default_value = "NOW()" ) ] ) ] ;
643+ let struct_name = syn:: Ident :: new ( "Test" , proc_macro2:: Span :: call_site ( ) ) ;
644+ let ty: syn:: Type = syn:: parse_str ( "NaiveDateTime" ) . unwrap ( ) ;
645+ let mut fns = Vec :: new ( ) ;
646+ let ( serde, schema) = generate_sea_orm_default_attrs (
647+ & attrs,
648+ & struct_name,
649+ "created_at" ,
650+ & ty,
651+ & ty,
652+ false ,
653+ & mut fns,
654+ ) ;
655+ let serde_str = serde. to_string ( ) ;
656+ assert ! (
657+ serde_str. contains( "serde" ) ,
658+ "NaiveDateTime should generate serde default: {serde_str}"
659+ ) ;
660+ let schema_str = schema. to_string ( ) ;
661+ assert ! (
662+ schema_str. contains( "1970-01-01T00:00:00" ) ,
663+ "NaiveDateTime should have epoch default: {schema_str}"
664+ ) ;
665+ assert_eq ! ( fns. len( ) , 1 ) ;
666+ }
667+
668+ #[ test]
669+ fn test_sea_orm_default_attrs_sql_function_naive_date ( ) {
670+ let attrs: Vec < syn:: Attribute > = vec ! [ syn:: parse_quote!( #[ sea_orm( default_value = "NOW()" ) ] ) ] ;
671+ let struct_name = syn:: Ident :: new ( "Test" , proc_macro2:: Span :: call_site ( ) ) ;
672+ let ty: syn:: Type = syn:: parse_str ( "NaiveDate" ) . unwrap ( ) ;
673+ let mut fns = Vec :: new ( ) ;
674+ let ( serde, schema) = generate_sea_orm_default_attrs (
675+ & attrs,
676+ & struct_name,
677+ "date_field" ,
678+ & ty,
679+ & ty,
680+ false ,
681+ & mut fns,
682+ ) ;
683+ let serde_str = serde. to_string ( ) ;
684+ assert ! (
685+ serde_str. contains( "serde" ) ,
686+ "NaiveDate should generate serde default: {serde_str}"
687+ ) ;
688+ let schema_str = schema. to_string ( ) ;
689+ assert ! (
690+ schema_str. contains( "1970-01-01" ) ,
691+ "NaiveDate should have date default: {schema_str}"
692+ ) ;
693+ assert_eq ! ( fns. len( ) , 1 ) ;
694+ }
695+
696+ #[ test]
697+ fn test_sea_orm_default_attrs_sql_function_naive_time ( ) {
698+ let attrs: Vec < syn:: Attribute > = vec ! [ syn:: parse_quote!( #[ sea_orm( default_value = "NOW()" ) ] ) ] ;
699+ let struct_name = syn:: Ident :: new ( "Test" , proc_macro2:: Span :: call_site ( ) ) ;
700+ let ty: syn:: Type = syn:: parse_str ( "NaiveTime" ) . unwrap ( ) ;
701+ let mut fns = Vec :: new ( ) ;
702+ let ( serde, schema) = generate_sea_orm_default_attrs (
703+ & attrs,
704+ & struct_name,
705+ "time_field" ,
706+ & ty,
707+ & ty,
708+ false ,
709+ & mut fns,
710+ ) ;
711+ let serde_str = serde. to_string ( ) ;
712+ assert ! (
713+ serde_str. contains( "serde" ) ,
714+ "NaiveTime should generate serde default: {serde_str}"
715+ ) ;
716+ let schema_str = schema. to_string ( ) ;
717+ assert ! (
718+ schema_str. contains( "00:00:00" ) ,
719+ "NaiveTime should have time default: {schema_str}"
720+ ) ;
721+ assert_eq ! ( fns. len( ) , 1 ) ;
722+ }
723+
724+ #[ test]
725+ fn test_sea_orm_default_attrs_sql_function_time_type ( ) {
726+ let attrs: Vec < syn:: Attribute > = vec ! [ syn:: parse_quote!( #[ sea_orm( default_value = "NOW()" ) ] ) ] ;
727+ let struct_name = syn:: Ident :: new ( "Test" , proc_macro2:: Span :: call_site ( ) ) ;
728+ let ty: syn:: Type = syn:: parse_str ( "Time" ) . unwrap ( ) ;
729+ let mut fns = Vec :: new ( ) ;
730+ let ( serde, schema) = generate_sea_orm_default_attrs (
731+ & attrs,
732+ & struct_name,
733+ "time_field" ,
734+ & ty,
735+ & ty,
736+ false ,
737+ & mut fns,
738+ ) ;
739+ let serde_str = serde. to_string ( ) ;
740+ assert ! (
741+ serde_str. contains( "serde" ) ,
742+ "Time should generate serde default: {serde_str}"
743+ ) ;
744+ let schema_str = schema. to_string ( ) ;
745+ assert ! (
746+ schema_str. contains( "00:00:00" ) ,
747+ "Time should have time default: {schema_str}"
748+ ) ;
749+ assert_eq ! ( fns. len( ) , 1 ) ;
750+ }
751+
513752// --- Coverage: is_parseable_type empty segments ---
514753
515754#[ test]
0 commit comments