|
5 | 5 | namespace League\OpenAPIValidation\Tests\FromCommunity;
|
6 | 6 |
|
7 | 7 | use GuzzleHttp\Psr7\ServerRequest;
|
| 8 | +use League\OpenAPIValidation\PSR7\Exception\Validation\InvalidParameter; |
| 9 | +use League\OpenAPIValidation\PSR7\Exception\Validation\InvalidQueryArgs; |
8 | 10 | use League\OpenAPIValidation\PSR7\ValidatorBuilder;
|
| 11 | +use League\OpenAPIValidation\Schema\Exception\TypeMismatch; |
9 | 12 | use PHPUnit\Framework\TestCase;
|
10 | 13 |
|
11 | 14 | final class IssueWithQueryArrayTest extends TestCase
|
12 | 15 | {
|
13 | 16 | public function testConvertFormIntegerArray() : void
|
14 | 17 | {
|
15 |
| - $validator = (new ValidatorBuilder())->fromYaml($this->makeYaml('form', 'integer', 'int32'))->getServerRequestValidator(); |
| 18 | + $validator = (new ValidatorBuilder())->fromYaml($this->makeArrayYaml('form', 'integer', 'int32'))->getServerRequestValidator(); |
16 | 19 | $validator->validate($this->makeRequest('form', 'integer'));
|
17 | 20 | $this->addToAssertionCount(1);
|
18 | 21 | }
|
19 | 22 |
|
20 | 23 | public function testConvertFormNumberArray() : void
|
21 | 24 | {
|
22 |
| - $validator = (new ValidatorBuilder())->fromYaml($this->makeYaml('form', 'number', 'float'))->getServerRequestValidator(); |
| 25 | + $validator = (new ValidatorBuilder())->fromYaml($this->makeArrayYaml('form', 'number', 'float'))->getServerRequestValidator(); |
23 | 26 | $validator->validate($this->makeRequest('form', 'number'));
|
24 | 27 | $this->addToAssertionCount(1);
|
25 | 28 | }
|
26 | 29 |
|
27 | 30 | public function testConvertFormIntegerArrayToStringArray() : void
|
28 | 31 | {
|
29 |
| - $validator = (new ValidatorBuilder())->fromYaml($this->makeYaml('form', 'string', 'int32'))->getServerRequestValidator(); |
| 32 | + $validator = (new ValidatorBuilder())->fromYaml($this->makeArrayYaml('form', 'string', 'int32'))->getServerRequestValidator(); |
30 | 33 | $validator->validate($this->makeRequest('form', 'integer'));
|
31 | 34 | $this->addToAssertionCount(1);
|
32 | 35 | }
|
33 | 36 |
|
34 | 37 | public function testConvertFormStringArray() : void
|
35 | 38 | {
|
36 |
| - $validator = (new ValidatorBuilder())->fromYaml($this->makeYaml('form', 'string', 'int32'))->getServerRequestValidator(); |
| 39 | + $validator = (new ValidatorBuilder())->fromYaml($this->makeArrayYaml('form', 'string', 'int32'))->getServerRequestValidator(); |
37 | 40 | $validator->validate($this->makeRequest('form', 'string'));
|
38 | 41 | $this->addToAssertionCount(1);
|
39 | 42 | }
|
40 | 43 |
|
41 | 44 | public function testConvertFormBooleanArray() : void
|
42 | 45 | {
|
43 |
| - $validator = (new ValidatorBuilder())->fromYaml($this->makeYaml('form', 'boolean', 'int32'))->getServerRequestValidator(); |
| 46 | + $validator = (new ValidatorBuilder())->fromYaml($this->makeArrayYaml('form', 'boolean', 'int32'))->getServerRequestValidator(); |
44 | 47 | $validator->validate($this->makeRequest('form', 'boolean'));
|
45 | 48 | $this->addToAssertionCount(1);
|
46 | 49 | }
|
47 | 50 |
|
48 | 51 | public function testConvertFormIntegerArrayError() : void
|
49 | 52 | {
|
50 | 53 | $this->expectExceptionMessage('Value "id1,id2,id3" for argument "id" is invalid for Request [get /users]');
|
51 |
| - $validator = (new ValidatorBuilder())->fromYaml($this->makeYaml('form', 'integer', 'int32'))->getServerRequestValidator(); |
| 54 | + $validator = (new ValidatorBuilder())->fromYaml($this->makeArrayYaml('form', 'integer', 'int32'))->getServerRequestValidator(); |
52 | 55 | $validator->validate($this->makeRequest('form', 'string'));
|
53 |
| - $this->addToAssertionCount(1); |
54 | 56 | }
|
55 | 57 |
|
56 | 58 | public function testConvertSpaceIntegerArray() : void
|
57 | 59 | {
|
58 |
| - $validator = (new ValidatorBuilder())->fromYaml($this->makeYaml('spaceDelimited', 'integer', 'int32'))->getServerRequestValidator(); |
| 60 | + $validator = (new ValidatorBuilder())->fromYaml($this->makeArrayYaml('spaceDelimited', 'integer', 'int32'))->getServerRequestValidator(); |
59 | 61 | $validator->validate($this->makeRequest('spaceDelimited', 'integer'));
|
60 | 62 | $this->addToAssertionCount(1);
|
61 | 63 | }
|
62 | 64 |
|
63 | 65 | public function testConvertPipeIntegerArray() : void
|
64 | 66 | {
|
65 |
| - $validator = (new ValidatorBuilder())->fromYaml($this->makeYaml('pipeDelimited', 'integer', 'int32'))->getServerRequestValidator(); |
| 67 | + $validator = (new ValidatorBuilder())->fromYaml($this->makeArrayYaml('pipeDelimited', 'integer', 'int32'))->getServerRequestValidator(); |
66 | 68 | $validator->validate($this->makeRequest('pipeDelimited', 'integer'));
|
67 | 69 | $this->addToAssertionCount(1);
|
68 | 70 | }
|
69 | 71 |
|
70 |
| - protected function makeYaml(string $style, string $type, string $format) : string |
| 72 | + public function testConvertSingleLayerDeepObject() : void |
| 73 | + { |
| 74 | + $yaml = /** @lang yaml */ |
| 75 | + <<<YAML |
| 76 | +openapi: 3.0.0 |
| 77 | +info: |
| 78 | + title: Product import API |
| 79 | + version: '1.0' |
| 80 | +servers: |
| 81 | + - url: 'http://localhost:8000/api/v1' |
| 82 | +paths: |
| 83 | + /users: |
| 84 | + get: |
| 85 | + parameters: |
| 86 | + - in: query |
| 87 | + name: id |
| 88 | + required: true |
| 89 | + style: deepObject |
| 90 | + explode: true |
| 91 | + schema: |
| 92 | + type: object |
| 93 | + properties: |
| 94 | + before: |
| 95 | + type: integer |
| 96 | + format: int32 |
| 97 | + after: |
| 98 | + type: integer |
| 99 | + format: int32 |
| 100 | + responses: |
| 101 | + '200': |
| 102 | + description: A list of users |
| 103 | +YAML; |
| 104 | + $validator = (new ValidatorBuilder())->fromYaml($yaml)->getServerRequestValidator(); |
| 105 | + $validator->validate($this->makeRequest('deepObject', 'integer')); |
| 106 | + $this->addToAssertionCount(1); |
| 107 | + } |
| 108 | + |
| 109 | + public function testConvertSingleLayerDeepObjectError() : void |
| 110 | + { |
| 111 | + $yaml = /** @lang yaml */ |
| 112 | + <<<YAML |
| 113 | +openapi: 3.0.0 |
| 114 | +info: |
| 115 | + title: Product import API |
| 116 | + version: '1.0' |
| 117 | +servers: |
| 118 | + - url: 'http://localhost:8000/api/v1' |
| 119 | +paths: |
| 120 | + /users: |
| 121 | + get: |
| 122 | + parameters: |
| 123 | + - in: query |
| 124 | + name: id |
| 125 | + required: true |
| 126 | + style: deepObject |
| 127 | + explode: true |
| 128 | + schema: |
| 129 | + type: object |
| 130 | + properties: |
| 131 | + before: |
| 132 | + type: integer |
| 133 | + format: int32 |
| 134 | + after: |
| 135 | + type: integer |
| 136 | + format: int32 |
| 137 | + responses: |
| 138 | + '200': |
| 139 | + description: A list of users |
| 140 | +YAML; |
| 141 | + try { |
| 142 | + $validator = (new ValidatorBuilder())->fromYaml($yaml)->getServerRequestValidator(); |
| 143 | + $validator->validate($this->makeRequest('deepObject', 'error')); |
| 144 | + } catch (InvalidQueryArgs $exception) { |
| 145 | + /** @var InvalidParameter $previous */ |
| 146 | + $previous = $exception->getPrevious(); |
| 147 | + /** @var TypeMismatch $previous */ |
| 148 | + $previous = $previous->getPrevious(); |
| 149 | + self::assertInstanceOf(TypeMismatch::class, $previous); |
| 150 | + self::assertEquals(['id', 'before'], $previous->dataBreadCrumb()->buildChain()); |
| 151 | + } |
| 152 | + } |
| 153 | + |
| 154 | + public function testConvertMultiLayerDeepObject() : void |
| 155 | + { |
| 156 | + $yaml = /** @lang yaml */ |
| 157 | + <<<YAML |
| 158 | +openapi: 3.0.0 |
| 159 | +info: |
| 160 | + title: Product import API |
| 161 | + version: '1.0' |
| 162 | +servers: |
| 163 | + - url: 'http://localhost:8000/api/v1' |
| 164 | +paths: |
| 165 | + /users: |
| 166 | + get: |
| 167 | + parameters: |
| 168 | + - in: query |
| 169 | + name: id |
| 170 | + required: true |
| 171 | + style: deepObject |
| 172 | + explode: true |
| 173 | + schema: |
| 174 | + type: object |
| 175 | + properties: |
| 176 | + before: |
| 177 | + type: object |
| 178 | + properties: |
| 179 | + first: |
| 180 | + type: object |
| 181 | + properties: |
| 182 | + second: |
| 183 | + type: integer |
| 184 | + format: int32 |
| 185 | + after: |
| 186 | + type: integer |
| 187 | + format: int32 |
| 188 | + responses: |
| 189 | + '200': |
| 190 | + description: A list of users |
| 191 | +YAML; |
| 192 | + $validator = (new ValidatorBuilder())->fromYaml($yaml)->getServerRequestValidator(); |
| 193 | + $validator->validate($this->makeRequest('deepObject', 'deep')); |
| 194 | + $this->addToAssertionCount(1); |
| 195 | + } |
| 196 | + |
| 197 | + public function testConvertMultiLayerDeepObjectError() : void |
| 198 | + { |
| 199 | + $yaml = /** @lang yaml */ |
| 200 | + <<<YAML |
| 201 | +openapi: 3.0.0 |
| 202 | +info: |
| 203 | + title: Product import API |
| 204 | + version: '1.0' |
| 205 | +servers: |
| 206 | + - url: 'http://localhost:8000/api/v1' |
| 207 | +paths: |
| 208 | + /users: |
| 209 | + get: |
| 210 | + parameters: |
| 211 | + - in: query |
| 212 | + name: id |
| 213 | + required: true |
| 214 | + style: deepObject |
| 215 | + explode: true |
| 216 | + schema: |
| 217 | + type: object |
| 218 | + properties: |
| 219 | + before: |
| 220 | + type: object |
| 221 | + properties: |
| 222 | + first: |
| 223 | + type: object |
| 224 | + properties: |
| 225 | + second: |
| 226 | + type: string |
| 227 | + format: date-time |
| 228 | + after: |
| 229 | + type: integer |
| 230 | + format: int32 |
| 231 | + responses: |
| 232 | + '200': |
| 233 | + description: A list of users |
| 234 | +YAML; |
| 235 | + try { |
| 236 | + $validator = (new ValidatorBuilder())->fromYaml($yaml)->getServerRequestValidator(); |
| 237 | + $validator->validate($this->makeRequest('deepObject', 'deep')); |
| 238 | + } catch (InvalidQueryArgs $exception) { |
| 239 | + /** @var InvalidParameter $previous */ |
| 240 | + $previous = $exception->getPrevious(); |
| 241 | + /** @var TypeMismatch $previous */ |
| 242 | + $previous = $previous->getPrevious(); |
| 243 | + self::assertInstanceOf(TypeMismatch::class, $previous); |
| 244 | + self::assertEquals(['id', 'before', 'first', 'second'], $previous->dataBreadCrumb()->buildChain()); |
| 245 | + } |
| 246 | + } |
| 247 | + |
| 248 | + protected function makeArrayYaml(string $style, string $type, string $format) : string |
71 | 249 | {
|
72 | 250 | return $yaml = /** @lang yaml */
|
73 | 251 | <<<YAML
|
@@ -103,6 +281,7 @@ protected function makeRequest(string $style, string $type) : ServerRequest
|
103 | 281 | 'form' => ['integer' => '1,2,3', 'string' => 'id1,id2,id3', 'boolean' => 'true,false', 'number' => '1.00,2.00,3.00'],
|
104 | 282 | 'spaceDelimited' => ['integer' => '1 2 3', 'string' => 'id1 id2 id3', 'boolean' => 'true false', 'number' => '1.00 2.00 3.00'],
|
105 | 283 | 'pipeDelimited' => ['integer' => '1|2|3', 'string' => 'id1|id2|id3', 'boolean' => 'true|false', 'number' => '1.00|2.00|3.00'],
|
| 284 | + 'deepObject' => ['integer' => ['before' => 10, 'after' => 1], 'deep' => ['before' => ['first' => ['second' => '10']], 'after' => 1], 'error' => ['before' => 'ten', 'after' => 'one']], |
106 | 285 | ];
|
107 | 286 | $request = new ServerRequest('GET', 'http://localhost:8000/api/v1/users');
|
108 | 287 | $request = $request->withQueryParams(['id' => $map[$style][$type]]);
|
|
0 commit comments