Skip to content

Commit 0a5edac

Browse files
committed
Add testcase
1 parent 3f318d8 commit 0a5edac

3 files changed

Lines changed: 247 additions & 2 deletions

File tree

crates/vespera_macro/src/schema_macro/seaorm.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1269,4 +1269,11 @@ mod tests {
12691269
fn test_has_sea_orm_primary_key_empty_attrs() {
12701270
assert!(!has_sea_orm_primary_key(&[]));
12711271
}
1272+
1273+
#[test]
1274+
fn test_has_sea_orm_primary_key_non_list_meta() {
1275+
// #[sea_orm = "value"] is a NameValue meta, not a List — should be skipped
1276+
let attrs: Vec<syn::Attribute> = vec![syn::parse_quote!(#[sea_orm = "something"])];
1277+
assert!(!has_sea_orm_primary_key(&attrs));
1278+
}
12721279
}

crates/vespera_macro/src/schema_macro/tests.rs

Lines changed: 239 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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]

crates/vespera_macro/src/schema_macro/type_utils.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ pub fn get_type_default(ty: &Type) -> Option<serde_json::Value> {
264264
Type::Path(type_path) => type_path.path.segments.last().and_then(|segment| {
265265
match segment.ident.to_string().as_str() {
266266
"String" => Some(serde_json::Value::String(String::new())),
267-
"i8" | "i16" | "i32" | "i64" | "u8" | "u16" | "u32" | "u64" => {
267+
"i8" | "i16" | "i32" | "i64" | "u8" | "u16" | "u32" | "u64" | "Decimal" => {
268268
Some(serde_json::Value::Number(serde_json::Number::from(0)))
269269
}
270270
"f32" | "f64" => Some(serde_json::Value::Number(
@@ -283,7 +283,6 @@ pub fn get_type_default(ty: &Type) -> Option<serde_json::Value> {
283283
}
284284
"NaiveDate" => Some(serde_json::Value::String("1970-01-01".to_string())),
285285
"NaiveTime" | "Time" => Some(serde_json::Value::String("00:00:00".to_string())),
286-
"Decimal" => Some(serde_json::Value::Number(serde_json::Number::from(0))),
287286
_ => None,
288287
}
289288
}),

0 commit comments

Comments
 (0)