Skip to content

Commit 2cead44

Browse files
committed
Add testcase
1 parent d48a923 commit 2cead44

4 files changed

Lines changed: 216 additions & 81 deletions

crates/vespera_macro/src/parser/parameters.rs

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

crates/vespera_macro/src/parser/snapshots/vespera_macro__parser__parameters__tests__parse_function_parameter_cases-11.snap

Lines changed: 1 addition & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -2,60 +2,4 @@
22
source: crates/vespera_macro/src/parser/parameters.rs
33
expression: parameters
44
---
5-
[
6-
Parameter {
7-
name: "id",
8-
in: Path,
9-
description: None,
10-
required: Some(
11-
true,
12-
),
13-
schema: Some(
14-
Inline(
15-
Schema {
16-
ref_path: None,
17-
schema_type: Some(
18-
Integer,
19-
),
20-
format: None,
21-
title: None,
22-
description: None,
23-
default: None,
24-
example: None,
25-
examples: None,
26-
minimum: None,
27-
maximum: None,
28-
exclusive_minimum: None,
29-
exclusive_maximum: None,
30-
multiple_of: None,
31-
min_length: None,
32-
max_length: None,
33-
pattern: None,
34-
items: None,
35-
prefix_items: None,
36-
min_items: None,
37-
max_items: None,
38-
unique_items: None,
39-
properties: None,
40-
required: None,
41-
additional_properties: None,
42-
min_properties: None,
43-
max_properties: None,
44-
enum: None,
45-
all_of: None,
46-
any_of: None,
47-
one_of: None,
48-
not: None,
49-
nullable: None,
50-
read_only: None,
51-
write_only: None,
52-
external_docs: None,
53-
defs: None,
54-
dynamic_anchor: None,
55-
dynamic_ref: None,
56-
},
57-
),
58-
),
59-
example: None,
60-
},
61-
]
5+
[]

crates/vespera_macro/src/parser/snapshots/vespera_macro__parser__parameters__tests__parse_function_parameter_cases-13.snap

Lines changed: 112 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,115 @@
22
source: crates/vespera_macro/src/parser/parameters.rs
33
expression: parameters
44
---
5-
[]
5+
[
6+
Parameter {
7+
name: "id",
8+
in: Query,
9+
description: None,
10+
required: Some(
11+
true,
12+
),
13+
schema: Some(
14+
Inline(
15+
Schema {
16+
ref_path: None,
17+
schema_type: Some(
18+
Integer,
19+
),
20+
format: None,
21+
title: None,
22+
description: None,
23+
default: None,
24+
example: None,
25+
examples: None,
26+
minimum: None,
27+
maximum: None,
28+
exclusive_minimum: None,
29+
exclusive_maximum: None,
30+
multiple_of: None,
31+
min_length: None,
32+
max_length: None,
33+
pattern: None,
34+
items: None,
35+
prefix_items: None,
36+
min_items: None,
37+
max_items: None,
38+
unique_items: None,
39+
properties: None,
40+
required: None,
41+
additional_properties: None,
42+
min_properties: None,
43+
max_properties: None,
44+
enum: None,
45+
all_of: None,
46+
any_of: None,
47+
one_of: None,
48+
not: None,
49+
nullable: None,
50+
read_only: None,
51+
write_only: None,
52+
external_docs: None,
53+
defs: None,
54+
dynamic_anchor: None,
55+
dynamic_ref: None,
56+
},
57+
),
58+
),
59+
example: None,
60+
},
61+
Parameter {
62+
name: "name",
63+
in: Query,
64+
description: None,
65+
required: Some(
66+
true,
67+
),
68+
schema: Some(
69+
Inline(
70+
Schema {
71+
ref_path: None,
72+
schema_type: Some(
73+
String,
74+
),
75+
format: None,
76+
title: None,
77+
description: None,
78+
default: None,
79+
example: None,
80+
examples: None,
81+
minimum: None,
82+
maximum: None,
83+
exclusive_minimum: None,
84+
exclusive_maximum: None,
85+
multiple_of: None,
86+
min_length: None,
87+
max_length: None,
88+
pattern: None,
89+
items: None,
90+
prefix_items: None,
91+
min_items: None,
92+
max_items: None,
93+
unique_items: None,
94+
properties: None,
95+
required: None,
96+
additional_properties: None,
97+
min_properties: None,
98+
max_properties: None,
99+
enum: None,
100+
all_of: None,
101+
any_of: None,
102+
one_of: None,
103+
not: None,
104+
nullable: None,
105+
read_only: None,
106+
write_only: None,
107+
external_docs: None,
108+
defs: None,
109+
dynamic_anchor: None,
110+
dynamic_ref: None,
111+
},
112+
),
113+
),
114+
example: None,
115+
},
116+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
---
2+
source: crates/vespera_macro/src/parser/parameters.rs
3+
expression: parameters
4+
---
5+
[
6+
Parameter {
7+
name: "custom",
8+
in: Header,
9+
description: None,
10+
required: Some(
11+
true,
12+
),
13+
schema: Some(
14+
Inline(
15+
Schema {
16+
ref_path: None,
17+
schema_type: Some(
18+
Object,
19+
),
20+
format: None,
21+
title: None,
22+
description: None,
23+
default: None,
24+
example: None,
25+
examples: None,
26+
minimum: None,
27+
maximum: None,
28+
exclusive_minimum: None,
29+
exclusive_maximum: None,
30+
multiple_of: None,
31+
min_length: None,
32+
max_length: None,
33+
pattern: None,
34+
items: None,
35+
prefix_items: None,
36+
min_items: None,
37+
max_items: None,
38+
unique_items: None,
39+
properties: None,
40+
required: None,
41+
additional_properties: None,
42+
min_properties: None,
43+
max_properties: None,
44+
enum: None,
45+
all_of: None,
46+
any_of: None,
47+
one_of: None,
48+
not: None,
49+
nullable: None,
50+
read_only: None,
51+
write_only: None,
52+
external_docs: None,
53+
defs: None,
54+
dynamic_anchor: None,
55+
dynamic_ref: None,
56+
},
57+
),
58+
),
59+
example: None,
60+
},
61+
]

0 commit comments

Comments
 (0)