Skip to content

Commit d7a81bd

Browse files
test: test parameters type detection
1 parent f0604a0 commit d7a81bd

File tree

4 files changed

+65
-9
lines changed

4 files changed

+65
-9
lines changed

src/Metadata/Resource/Factory/ParameterResourceMetadataCollectionFactory.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,10 @@ private function getDefaultParameters(Operation $operation, string $resourceClas
158158
$parameter = $parameter->withNativeType(Type::string());
159159
} elseif ('boolean' === ($parameter->getSchema()['type'] ?? null)) {
160160
$parameter = $parameter->withNativeType(Type::bool());
161+
} elseif ('integer' === ($parameter->getSchema()['type'] ?? null)) {
162+
$parameter = $parameter->withNativeType(Type::int());
163+
} elseif ('number' === ($parameter->getSchema()['type'] ?? null)) {
164+
$parameter = $parameter->withNativeType(Type::float());
161165
} else {
162166
$parameter = $parameter->withNativeType(Type::union(Type::string(), Type::list(Type::string())));
163167
}

src/Validator/Metadata/Resource/Factory/ParameterValidationResourceMetadataCollectionFactory.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,9 @@ private function addSchemaValidation(Parameter $parameter, ?array $schema = null
189189
$assertions[] = new Unique();
190190
}
191191

192-
if (isset($schema['type']) && 'array' === $schema['type']) {
193-
$assertions[] = new Type(type: 'array');
192+
// Can't test "boolean"/"integer"/"number" because value is sent as a string
193+
if (isset($schema['type']) && \in_array($schema['type'], ['array', 'null'], true)) {
194+
$assertions[] = new Type(type: $schema['type']);
194195
}
195196

196197
if (!$assertions) {

tests/Fixtures/TestBundle/ApiResource/WithParameter.php

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,43 @@
165165
'minimum' => 1,
166166
'maximum' => 5,
167167
],
168-
required: true,
168+
),
169+
],
170+
provider: [self::class, 'noopProvider']
171+
)]
172+
#[GetCollection(
173+
uriTemplate: 'header_float',
174+
parameters: [
175+
'Bar' => new HeaderParameter(
176+
schema: [
177+
'type' => 'number',
178+
'example' => 42.0,
179+
'minimum' => 1.0,
180+
'maximum' => 100.0,
181+
'multipleOf' => 0.01,
182+
],
183+
),
184+
],
185+
provider: [self::class, 'noopProvider']
186+
)]
187+
#[GetCollection(
188+
uriTemplate: 'header_boolean',
189+
parameters: [
190+
'Lorem' => new HeaderParameter(
191+
schema: [
192+
'type' => 'boolean',
193+
],
194+
),
195+
],
196+
provider: [self::class, 'noopProvider']
197+
)]
198+
#[GetCollection(
199+
uriTemplate: 'query_array',
200+
parameters: [
201+
'Baz' => new QueryParameter(
202+
schema: [
203+
'type' => 'array',
204+
],
169205
),
170206
],
171207
provider: [self::class, 'noopProvider']

tests/Functional/Parameters/ParameterTest.php

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -121,18 +121,33 @@ public function testHeaderParameterRequired(): void
121121
}
122122

123123
#[DataProvider('provideHeaderValues')]
124-
public function testHeaderParameterInteger(string $value, int $expectedStatusCode): void
124+
public function testHeaderParameter(string $url, array $headers, int $expectedStatusCode): void
125125
{
126-
self::createClient()->request('GET', 'header_integer', ['headers' => ['Foo' => $value]]);
126+
self::createClient()->request('GET', $url, ['headers' => $headers]);
127127
$this->assertResponseStatusCodeSame($expectedStatusCode);
128128
}
129129

130130
public static function provideHeaderValues(): iterable
131131
{
132-
yield 'valid integer' => ['3', 200];
133-
yield 'too high' => ['6', 422];
134-
yield 'too low' => ['0', 422];
135-
yield 'invalid integer' => ['string', 422];
132+
// header_integer
133+
yield 'valid integer header_integer' => ['header_integer', ['Foo' => '3'], 200];
134+
yield 'too high header_integer' => ['header_integer', ['Foo' => '6'], 422];
135+
yield 'too low header_integer' => ['header_integer', ['Foo' => '0'], 422];
136+
yield 'invalid integer header_integer' => ['header_integer', ['Foo' => 'string'], 422];
137+
138+
// header_float
139+
yield 'valid float header_float' => ['header_float', ['Bar' => '3.5'], 200];
140+
yield 'valid integer header_float' => ['header_float', ['Bar' => '3'], 200];
141+
yield 'too high header_float' => ['header_float', ['Bar' => '600'], 422];
142+
yield 'too low header_float' => ['header_float', ['Bar' => '0'], 422];
143+
yield 'invalid number header_float' => ['header_float', ['Bar' => 'string'], 422];
144+
145+
// header_boolean
146+
yield 'valid boolean false header_boolean' => ['header_boolean', ['Lorem' => 'false'], 200];
147+
yield 'valid boolean true header_boolean' => ['header_boolean', ['Lorem' => 'false'], 200];
148+
yield 'valid boolean 0 header_boolean' => ['header_boolean', ['Lorem' => '0'], 200];
149+
yield 'valid boolean 1 header_boolean' => ['header_boolean', ['Lorem' => '1'], 200];
150+
yield 'invalid boolean header_boolean' => ['header_boolean', ['Lorem' => 'string'], 422];
136151
}
137152

138153
#[DataProvider('provideCountryValues')]

0 commit comments

Comments
 (0)