GCC Code Coverage Report


Directory: ./
File: test/unittest/src/validators/body_validator.cpp
Date: 2024-07-09 12:21:25
Exec Total Coverage
Lines: 118 118 100.0%
Functions: 31 31 100.0%
Branches: 231 830 27.8%

Line Branch Exec Source
1 /*
2 * Copyright (c) 2024 Muhammad Nawaz
3 * Licensed under the MIT License. See LICENSE file for more information.
4 */
5 // [ END OF LICENSE c6bd0f49d040fca8d8a9cb05868e66aa63f0e2e0 ]
6
7 #include "validators/body_validator.hpp"
8 #include <gtest/gtest.h>
9
10 class TestBodyValidator: public ::testing::Test
11 {
12 protected:
13 10 void SetUp() override
14 {
15
1/2
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
10 schema_doc_.Parse(R"({
16 "$schema": "http://json-schema.org/draft-05/schema#",
17 "title": "UserProfile",
18 "description": "A user profile with various attributes",
19 "type": "object",
20 "properties": {
21 "userId": {
22 "description": "The unique identifier for a user",
23 "type": "integer",
24 "minimum": 1
25 },
26 "username": {
27 "description": "The user's username",
28 "type": "string",
29 "minLength": 3,
30 "maxLength": 20,
31 "pattern": "^[a-zA-Z0-9_]+$"
32 },
33 "email": {
34 "type": "string",
35 "format": "email"
36 },
37 "age": {
38 "description": "Age in years which must be a positive integer",
39 "type": "integer",
40 "minimum": 18,
41 "maximum": 100
42 },
43 "phoneNumber": {
44 "type": ["string", "null"],
45 "pattern": "^\\+?[1-9]\\d{1,14}$"
46 },
47 "address": {
48 "type": "object",
49 "properties": {
50 "street": {"type": "string"},
51 "city": {"type": "string"},
52 "state": {"type": "string"},
53 "zipCode": {
54 "type": "string",
55 "pattern": "^\\d{5}(-\\d{4})?$"
56 }
57 },
58 "required": ["street", "city", "state", "zipCode"],
59 "additionalProperties": false
60 },
61 "subscriptionType": {
62 "type": "string",
63 "enum": ["basic", "premium", "gold"]
64 },
65 "preferences": {
66 "type": "object",
67 "properties": {
68 "newsletter": {
69 "type": "boolean",
70 "default": false
71 },
72 "themes": {
73 "type": "array",
74 "items": {
75 "type": "string",
76 "enum": ["light", "dark", "colorful"]
77 },
78 "minItems": 1,
79 "uniqueItems": true
80 }
81 },
82 "additionalProperties": false
83 },
84 "createdAt": {
85 "type": "string",
86 "format": "date-time"
87 }
88 },
89 "required": ["userId", "username", "email", "createdAt"],
90 "additionalProperties": false,
91 "dependencies": {
92 "phoneNumber": ["address"]
93 },
94 "allOf": [
95 {
96 "if": {
97 "properties": {"subscriptionType": {"const": "gold"}}
98 },
99 "then": {
100 "properties": {
101 "preferences": {
102 "properties": {
103 "themes": {
104 "minItems": 2
105 }
106 }
107 }
108 }
109 }
110 }
111 ],
112 "patternProperties": {
113 "^S_": {
114 "type": "string",
115 "minLength": 3
116 }
117 }
118 })");
119 std::vector<std::string> ref_keys{"paths", "/pets/test", "get",
120
5/10
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 10 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 10 times.
✗ Branch 11 not taken.
✓ Branch 14 taken 10 times.
✗ Branch 15 not taken.
✓ Branch 18 taken 10 times.
✗ Branch 19 not taken.
70 "requestBody/content/application%2Fjson/schema"};
121
1/2
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
10 validator_ = std::make_unique<BodyValidator>(schema_doc_, ref_keys);
122 10 }
123
124 rapidjson::Document schema_doc_;
125 std::unique_ptr<BodyValidator> validator_;
126 };
127
128 8 TEST_F(TestBodyValidator, ValidJson)
129 {
130
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 std::string json_str = R"({
131 "userId": 12345,
132 "username": "johndoe_2023",
133 "email": "john.doe@example.com",
134 "age": 28,
135 "phoneNumber": "+12345678901",
136 "address": {
137 "street": "123 Main St",
138 "city": "Anytown",
139 "state": "CA",
140 "zipCode": "90210"
141 },
142 "subscriptionType": "gold",
143 "preferences": {
144 "newsletter": true,
145 "themes": ["dark", "light"]
146 },
147 "createdAt": "2023-04-05T08:00:00Z",
148 "S_example": "This is a pattern property"
149 })";
150 2 std::string error_msg;
151
3/12
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
2 EXPECT_EQ(validator_->Validate(json_str, error_msg), ValidationError::NONE);
152
1/10
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
2 EXPECT_TRUE(error_msg.empty());
153 2 }
154
155 8 TEST_F(TestBodyValidator, InvalidParsing)
156 {
157
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 std::string json_str = R"({
158 "userId": 12345
159 "username": "johndoe_2023",
160 "email": "john.doe@example.com",
161 "age": 28,
162 "phoneNumber": "+12345678901",
163 "address": {
164 "street": "123 Main St",
165 "city": "Anytown",
166 "state": "CA",
167 "zipCode": "90210"
168 },
169 "subscriptionType": "gold",
170 "preferences": {
171 "newsletter": true,
172 "themes": ["dark", "light"]
173 },
174 "createdAt": "2023-04-05T08:00:00Z",
175 "S_example": "This is a pattern property"
176 })";
177 2 std::string error_msg;
178
3/12
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
2 EXPECT_EQ(validator_->Validate(json_str, error_msg), ValidationError::INVALID_BODY);
179
1/10
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
2 EXPECT_FALSE(error_msg.empty());
180
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 rapidjson::Document doc;
181
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 doc.Parse(error_msg.c_str());
182
1/10
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
2 EXPECT_FALSE(doc.HasParseError());
183
5/16
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
4 EXPECT_EQ(std::string(doc["errorCode"].GetString()), "INVALID_BODY");
184
6/18
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
4 EXPECT_EQ(std::string(doc["details"]["code"].GetString()), "parserError");
185 2 }
186 8 TEST_F(TestBodyValidator, InvalidIntegerType)
187 {
188
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 std::string json_str = R"({
189 "userId": "not-an-integer",
190 "username": "johndoe_2023",
191 "email": "john.doe@example.com",
192 "age": 28,
193 "phoneNumber": "+12345678901",
194 "address": {
195 "street": "123 Main St",
196 "city": "Anytown",
197 "state": "CA",
198 "zipCode": "90210"
199 },
200 "subscriptionType": "gold",
201 "preferences": {
202 "newsletter": true,
203 "themes": ["dark", "light"]
204 },
205 "createdAt": "2023-04-05T08:00:00Z",
206 "S_example": "This is a pattern property"
207 })";
208 2 std::string error_msg;
209
3/12
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
2 EXPECT_EQ(validator_->Validate(json_str, error_msg), ValidationError::INVALID_BODY);
210
1/10
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
2 EXPECT_FALSE(error_msg.empty());
211
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 rapidjson::Document doc;
212
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 doc.Parse(error_msg.c_str());
213
1/10
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
2 EXPECT_FALSE(doc.HasParseError());
214
5/16
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
4 EXPECT_EQ(std::string(doc["errorCode"].GetString()), "INVALID_BODY");
215
6/18
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
4 EXPECT_EQ(std::string(doc["details"]["code"].GetString()), "type");
216
6/18
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
4 EXPECT_EQ(std::string(doc["details"]["instance"].GetString()), "#/userId");
217 2 }
218
219 8 TEST_F(TestBodyValidator, InvalidStringType)
220 {
221
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 std::string json_str = R"({
222 "userId": 12345,
223 "username": 123,
224 "email": "john.doe@example.com",
225 "age": 28,
226 "phoneNumber": "+12345678901",
227 "address": {
228 "street": "123 Main St",
229 "city": "Anytown",
230 "state": "CA",
231 "zipCode": "90210"
232 },
233 "subscriptionType": "gold",
234 "preferences": {
235 "newsletter": true,
236 "themes": ["dark", "light"]
237 },
238 "createdAt": "2023-04-05T08:00:00Z",
239 "S_example": "This is a pattern property"
240 })";
241 2 std::string error_msg;
242
3/12
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
2 EXPECT_EQ(validator_->Validate(json_str, error_msg), ValidationError::INVALID_BODY);
243
1/10
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
2 EXPECT_FALSE(error_msg.empty());
244
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 rapidjson::Document doc;
245
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 doc.Parse(error_msg.c_str());
246
1/10
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
2 EXPECT_FALSE(doc.HasParseError());
247
5/16
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
4 EXPECT_EQ(std::string(doc["errorCode"].GetString()), "INVALID_BODY");
248
6/18
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
4 EXPECT_EQ(std::string(doc["details"]["code"].GetString()), "type");
249
6/18
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
4 EXPECT_EQ(std::string(doc["details"]["instance"].GetString()), "#/username");
250 2 }
251
252 8 TEST_F(TestBodyValidator, InvalidArrayUniqueItems)
253 {
254
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 std::string json_str = R"({
255 "userId": 12345,
256 "username": "johndoe_2023",
257 "email": "john.doe@example.com",
258 "age": 28,
259 "phoneNumber": "+12345678901",
260 "address": {
261 "street": "123 Main St",
262 "city": "Anytown",
263 "state": "CA",
264 "zipCode": "90210"
265 },
266 "subscriptionType": "gold",
267 "preferences": {
268 "newsletter": true,
269 "themes": ["dark", "dark", "light"]
270 },
271 "createdAt": "2023-04-05T08:00:00Z",
272 "S_example": "This is a pattern property"
273 })";
274 2 std::string error_msg;
275
3/12
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
2 EXPECT_EQ(validator_->Validate(json_str, error_msg), ValidationError::INVALID_BODY);
276
1/10
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
2 EXPECT_FALSE(error_msg.empty());
277
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 rapidjson::Document doc;
278
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 doc.Parse(error_msg.c_str());
279
1/10
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
2 EXPECT_FALSE(doc.HasParseError());
280
5/16
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
4 EXPECT_EQ(std::string(doc["errorCode"].GetString()), "INVALID_BODY");
281
6/18
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
4 EXPECT_EQ(std::string(doc["details"]["code"].GetString()), "uniqueItems");
282
6/18
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
4 EXPECT_EQ(std::string(doc["details"]["instance"].GetString()), "#/preferences/themes");
283 2 }
284
285 8 TEST_F(TestBodyValidator, InvalidIntegerMinimum)
286 {
287
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 std::string json_str = R"({
288 "userId": 12345,
289 "username": "johndoe_2023",
290 "email": "john.doe@example.com",
291 "age": 17,
292 "phoneNumber": "+12345678901",
293 "address": {
294 "street": "123 Main St",
295 "city": "Anytown",
296 "state": "CA",
297 "zipCode": "90210"
298 },
299 "subscriptionType": "gold",
300 "preferences": {
301 "newsletter": true,
302 "themes": ["dark"]
303 },
304 "createdAt": "2023-04-05T08:00:00Z",
305 "S_example": "This is a pattern property"
306 })";
307 2 std::string error_msg;
308
3/12
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
2 EXPECT_EQ(validator_->Validate(json_str, error_msg), ValidationError::INVALID_BODY);
309
1/10
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
2 EXPECT_FALSE(error_msg.empty());
310
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 rapidjson::Document doc;
311
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 doc.Parse(error_msg.c_str());
312
1/10
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
2 EXPECT_FALSE(doc.HasParseError());
313
5/16
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
4 EXPECT_EQ(std::string(doc["errorCode"].GetString()), "INVALID_BODY");
314
6/18
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
4 EXPECT_EQ(std::string(doc["details"]["code"].GetString()), "minimum");
315
6/18
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
4 EXPECT_EQ(std::string(doc["details"]["instance"].GetString()), "#/age");
316 2 }
317
318 8 TEST_F(TestBodyValidator, InvalidIntegerMaximim)
319 {
320
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 std::string json_str = R"({
321 "userId": 12345,
322 "username": "johndoe_2023",
323 "email": "john.doe@example.com",
324 "age": 101,
325 "phoneNumber": "+12345678901",
326 "address": {
327 "street": "123 Main St",
328 "city": "Anytown",
329 "state": "CA",
330 "zipCode": "90210"
331 },
332 "subscriptionType": "gold",
333 "preferences": {
334 "newsletter": true,
335 "themes": ["dark"]
336 },
337 "createdAt": "2023-04-05T08:00:00Z",
338 "S_example": "This is a pattern property"
339 })";
340 2 std::string error_msg;
341
3/12
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
2 EXPECT_EQ(validator_->Validate(json_str, error_msg), ValidationError::INVALID_BODY);
342
1/10
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
2 EXPECT_FALSE(error_msg.empty());
343
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 rapidjson::Document doc;
344
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 doc.Parse(error_msg.c_str());
345
1/10
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
2 EXPECT_FALSE(doc.HasParseError());
346
5/16
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
4 EXPECT_EQ(std::string(doc["errorCode"].GetString()), "INVALID_BODY");
347
6/18
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
4 EXPECT_EQ(std::string(doc["details"]["code"].GetString()), "maximum");
348
6/18
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
4 EXPECT_EQ(std::string(doc["details"]["instance"].GetString()), "#/age");
349 2 }
350
351 8 TEST_F(TestBodyValidator, InvalidRequired)
352 {
353
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 std::string json_str = R"({
354 "userId": 12345,
355 "username": "johndoe_2023",
356 "email": "john.doe@example.com",
357 "age": 28,
358 "phoneNumber": "+12345678901",
359 "address": {
360 "street": "123 Main St",
361 "zipCode": "90210"
362 },
363 "subscriptionType": "gold",
364 "preferences": {
365 "newsletter": true,
366 "themes": ["dark"]
367 },
368 "createdAt": "2023-04-05T08:00:00Z",
369 "S_example": "This is a pattern property"
370 })";
371 2 std::string error_msg;
372
3/12
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
2 EXPECT_EQ(validator_->Validate(json_str, error_msg), ValidationError::INVALID_BODY);
373
1/10
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
2 EXPECT_FALSE(error_msg.empty());
374
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 rapidjson::Document doc;
375
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 doc.Parse(error_msg.c_str());
376
1/10
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
2 EXPECT_FALSE(doc.HasParseError());
377
5/16
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
4 EXPECT_EQ(std::string(doc["errorCode"].GetString()), "INVALID_BODY");
378
6/18
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
4 EXPECT_EQ(std::string(doc["details"]["code"].GetString()), "required");
379
6/18
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
4 EXPECT_EQ(std::string(doc["details"]["instance"].GetString()), "#/address");
380 2 }
381
382 8 TEST_F(TestBodyValidator, InvalidPatternProp)
383 {
384
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 std::string json_str = R"({
385 "userId": 12345,
386 "username": "johndoe_2023",
387 "email": "john.doe@example.com",
388 "age": 28,
389 "phoneNumber": "+12345678901",
390 "address": {
391 "street": "123 Main St",
392 "city": "Anytown",
393 "state": "CA",
394 "zipCode": "90210"
395 },
396 "subscriptionType": "gold",
397 "preferences": {
398 "newsletter": true,
399 "themes": ["dark"]
400 },
401 "createdAt": "2023-04-01T14:30:00Z",
402 "S_": "This should be invalid",
403 "S_example": "Valid pattern property",
404 "T_example": "Another invalid property"
405 })";
406 2 std::string error_msg;
407
3/12
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
2 EXPECT_EQ(validator_->Validate(json_str, error_msg), ValidationError::INVALID_BODY);
408
1/10
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
2 EXPECT_FALSE(error_msg.empty());
409
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 rapidjson::Document doc;
410
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 doc.Parse(error_msg.c_str());
411
1/10
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
2 EXPECT_FALSE(doc.HasParseError());
412
5/16
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
4 EXPECT_EQ(std::string(doc["errorCode"].GetString()), "INVALID_BODY");
413
6/18
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
4 EXPECT_EQ(std::string(doc["details"]["code"].GetString()), "additionalProperties");
414
6/18
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
4 EXPECT_EQ(std::string(doc["details"]["instance"].GetString()), "#");
415 2 }
416
417 8 TEST_F(TestBodyValidator, InvalidEnum)
418 {
419
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 std::string json_str = R"({
420 "userId": 12345,
421 "username": "johndoe_2023",
422 "email": "john.doe@example.com",
423 "age": 28,
424 "phoneNumber": "+12345678901",
425 "address": {
426 "street": "123 Main St",
427 "city": "Anytown",
428 "state": "CA",
429 "zipCode": "90210"
430 },
431 "subscriptionType": "invalid",
432 "preferences": {
433 "newsletter": true,
434 "themes": ["dark"]
435 },
436 "createdAt": "2023-04-01T14:30:00Z",
437 "S_": "This should be invalid",
438 "S_example": "Valid pattern property",
439 "T_example": "Another invalid property"
440 })";
441 2 std::string error_msg;
442
3/12
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
2 EXPECT_EQ(validator_->Validate(json_str, error_msg), ValidationError::INVALID_BODY);
443
1/10
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
2 EXPECT_FALSE(error_msg.empty());
444
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 rapidjson::Document doc;
445
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 doc.Parse(error_msg.c_str());
446
1/10
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
2 EXPECT_FALSE(doc.HasParseError());
447
5/16
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
4 EXPECT_EQ(std::string(doc["errorCode"].GetString()), "INVALID_BODY");
448
6/18
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
4 EXPECT_EQ(std::string(doc["details"]["code"].GetString()), "enum");
449
6/18
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
4 EXPECT_EQ(std::string(doc["details"]["instance"].GetString()), "#/subscriptionType");
450 2 }
451