@@ -466,7 +466,7 @@ mod tests {
466466
467467 fn setup_test_data ( func_src : & str ) -> ( HashMap < String , String > , HashMap < String , String > ) {
468468 let mut struct_definitions = HashMap :: new ( ) ;
469- let known_schemas = HashMap :: new ( ) ;
469+ let known_schemas: HashMap < String , String > = HashMap :: new ( ) ;
470470
471471 if func_src. contains ( "QueryParams" ) {
472472 struct_definitions. insert (
@@ -561,11 +561,6 @@ mod tests {
561561 vec![ ] ,
562562 vec![ vec![ ] ]
563563 ) ]
564- #[ case(
565- "fn test(id: i32) {}" ,
566- vec![ "id" . to_string( ) ] ,
567- vec![ vec![ ParameterLocation :: Path ] ]
568- ) ]
569564 #[ case(
570565 "fn test(params: Query<UnknownType>) {}" ,
571566 vec![ ] ,
@@ -576,6 +571,16 @@ mod tests {
576571 vec![ ] ,
577572 vec![ vec![ ] ]
578573 ) ]
574+ #[ case(
575+ "fn test(user: Query<User>) {}" ,
576+ vec![ ] ,
577+ vec![ vec![ ParameterLocation :: Query , ParameterLocation :: Query ] ]
578+ ) ]
579+ #[ case(
580+ "fn test(custom: Header<CustomHeader>) {}" ,
581+ vec![ ] ,
582+ vec![ vec![ ParameterLocation :: Header ] ]
583+ ) ]
579584 fn test_parse_function_parameter_cases (
580585 #[ case] func_src : & str ,
581586 #[ case] path_params : Vec < String > ,
@@ -642,13 +647,26 @@ mod tests {
642647 "fn test(id: Path<i32>) {}" ,
643648 vec![ "user_id" . to_string( ) , "post_id" . to_string( ) ] ,
644649 ) ]
650+ #[ case(
651+ "fn test((x, y): (i32, i32)) {}" ,
652+ vec![ ] ,
653+ ) ]
645654 fn test_parse_function_parameter_wrong_cases (
646655 #[ case] func_src : & str ,
647656 #[ case] path_params : Vec < String > ,
648657 ) {
649658 let func: syn:: ItemFn = syn:: parse_str ( func_src) . unwrap ( ) ;
650659 let ( known_schemas, struct_definitions) = setup_test_data ( func_src) ;
651660
661+ // Provide custom types for header/query known schemas/structs
662+ let mut struct_definitions = struct_definitions;
663+ struct_definitions. insert (
664+ "User" . to_string ( ) ,
665+ "pub struct User { pub id: i32 }" . to_string ( ) ,
666+ ) ;
667+ let mut known_schemas = known_schemas;
668+ known_schemas. insert ( "CustomHeader" . to_string ( ) , "#/components/schemas/CustomHeader" . to_string ( ) ) ;
669+
652670 for ( idx, arg) in func. sig . inputs . iter ( ) . enumerate ( ) {
653671 let result = parse_function_parameter (
654672 arg,
@@ -666,23 +684,24 @@ mod tests {
666684 }
667685 }
668686
669- #[ test]
670- fn test_is_map_type ( ) {
671- // Test HashMap
672- let ty: Type = syn:: parse_str ( "HashMap<String, String>" ) . unwrap ( ) ;
673- assert ! ( is_map_type( & ty) ) ;
674-
675- // Test BTreeMap
676- let ty: Type = syn:: parse_str ( "BTreeMap<String, String>" ) . unwrap ( ) ;
677- assert ! ( is_map_type( & ty) ) ;
678-
679- // Test non-map type (should return false)
680- let ty: Type = syn:: parse_str ( "String" ) . unwrap ( ) ;
681- assert ! ( !is_map_type( & ty) ) ;
682-
683- // Test Type::Path with empty segments (should return false)
684- let ty: Type = syn:: parse_str ( "Vec<i32>" ) . unwrap ( ) ;
685- assert ! ( !is_map_type( & ty) ) ;
687+ #[ rstest]
688+ #[ case( "i32" , true ) ]
689+ #[ case( "Vec<String>" , true ) ]
690+ #[ case( "Option<bool>" , true ) ]
691+ #[ case( "CustomType" , false ) ]
692+ fn test_is_primitive_like_fn ( #[ case] type_str : & str , #[ case] expected : bool ) {
693+ let ty: Type = syn:: parse_str ( type_str) . unwrap ( ) ;
694+ assert_eq ! ( is_primitive_like( & ty) , expected, "type_str={}" , type_str) ;
695+ }
696+
697+ #[ rstest]
698+ #[ case( "HashMap<String, String>" , true ) ]
699+ #[ case( "BTreeMap<String, String>" , true ) ]
700+ #[ case( "String" , false ) ]
701+ #[ case( "Vec<i32>" , false ) ]
702+ fn test_is_map_type ( #[ case] type_str : & str , #[ case] expected : bool ) {
703+ let ty: Type = syn:: parse_str ( type_str) . unwrap ( ) ;
704+ assert_eq ! ( is_map_type( & ty) , expected, "type_str={}" , type_str) ;
686705 }
687706
688707 #[ rstest]
0 commit comments