diff --git a/src/Validation/RequestValidator/RequestParameterValidator.php b/src/Validation/RequestValidator/RequestParameterValidator.php index 7615ca6..2501772 100644 --- a/src/Validation/RequestValidator/RequestParameterValidator.php +++ b/src/Validation/RequestValidator/RequestParameterValidator.php @@ -78,7 +78,7 @@ private function getValidateQueryParametersFromRequest(Request $request): array private function validateQueryParameter(Request $request, string $parameterName, stdClass $parameter): array { $violations = []; - if ($request->query->has($parameterName) === false && $parameter->required ?? false) { + if (($parameter->required ?? false) && $request->query->has($parameterName) === false) { $violations[] = new Violation( 'required_query_parameter', sprintf('Query parameter %s is required.', $parameterName), @@ -93,6 +93,9 @@ private function validateQueryParameter(Request $request, string $parameterName, } $parameterValue = $request->query->get($parameterName); + if ($parameter->schema->type === 'boolean') { + $parameterValue = $request->query->getBoolean($parameterName, $parameter->schema->default ?? false); + } $this->jsonValidator->validate($parameterValue, $parameter->schema, Constraint::CHECK_MODE_COERCE_TYPES); if ($this->jsonValidator->isValid()) { diff --git a/tests/Validation/RequestValidator/RequestParameterValidatorTest.php b/tests/Validation/RequestValidator/RequestParameterValidatorTest.php index 1997bcf..e1ed870 100644 --- a/tests/Validation/RequestValidator/RequestParameterValidatorTest.php +++ b/tests/Validation/RequestValidator/RequestParameterValidatorTest.php @@ -91,6 +91,29 @@ public function testCannotValidateRequiredRequestParameterWithoutValue(): void ); } + public function testCanValidateOptionalRequestParameterWithoutRequiredFlag(): void + { + $request = new Request(); + $request->attributes->set( + RouteContext::REQUEST_ATTRIBUTE, + [ + RouteContext::REQUEST_VALIDATE_QUERY_PARAMETERS => [ + 'foo' => json_encode([ + 'name' => 'foo', + 'in' => 'query', + 'schema' => [ + 'type' => 'string', + ], + ]), + ], + ] + ); + + static::assertNull( + $this->validator->validate($request) + ); + } + public function testCanValidateRequestParameterOfTypeBoolean(): void { $request = new Request(); @@ -116,6 +139,31 @@ public function testCanValidateRequestParameterOfTypeBoolean(): void ); } + public function testCanValidateRequestParameterOfTypeBooleanWithOne(): void + { + $request = new Request(); + $request->query->set('foo', '1'); + $request->attributes->set( + RouteContext::REQUEST_ATTRIBUTE, + [ + RouteContext::REQUEST_VALIDATE_QUERY_PARAMETERS => [ + 'foo' => json_encode([ + 'name' => 'foo', + 'in' => 'query', + 'required' => true, + 'schema' => [ + 'type' => 'boolean', + ], + ]), + ], + ] + ); + + static::assertNull( + $this->validator->validate($request) + ); + } + public function testCanValidateRequestParameterOfTypeString(): void { $request = new Request();