Skip to content

Commit f826d25

Browse files
author
Anton Filippov
committed
#81781
1 parent 9d4a20e commit f826d25

11 files changed

+254
-45
lines changed

src/Enums/LaravelValidationRuleEnum.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ enum LaravelValidationRuleEnum: string
1414

1515
// formats
1616
case DATE = 'date';
17-
case DATE_TIME_FORMAT = 'date_format:Y-m-d\TH:i:s.u\Z';
17+
case DATE_TIME = 'date_format:Y-m-d\TH:i:s.u\Z';
1818
case PASSWORD = 'password';
1919
case EMAIL = 'email';
2020
case IPV4 = 'ipv4';

src/Enums/OpenApi3PropertyFormatEnum.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public function toLaravelValidationRule(): LaravelValidationRuleEnum
2424
{
2525
return match ($this) {
2626
OpenApi3PropertyFormatEnum::DATE => LaravelValidationRuleEnum::DATE,
27-
OpenApi3PropertyFormatEnum::DATE_TIME => LaravelValidationRuleEnum::DATE_TIME_FORMAT,
27+
OpenApi3PropertyFormatEnum::DATE_TIME => LaravelValidationRuleEnum::DATE_TIME,
2828
OpenApi3PropertyFormatEnum::PASSWORD => LaravelValidationRuleEnum::PASSWORD,
2929
OpenApi3PropertyFormatEnum::BINARY => LaravelValidationRuleEnum::FILE,
3030
OpenApi3PropertyFormatEnum::EMAIL => LaravelValidationRuleEnum::EMAIL,

tests/GenerateServerTest.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@
4141
$this->makeFilePath('/app/Http/Requests/TestFullGenerateRequest.php'),
4242
$this->makeFilePath('/app/Http/Tests/ResourcesComponentTest.php'),
4343
$this->makeFilePath('/app/Http/Requests/TestFooRenameRequest.php'),
44-
$this->makeFilePath('/app/Http/Requests/LaravelValidationsRequest.php'),
44+
$this->makeFilePath('/app/Http/Requests/LaravelValidationsApplicationJsonRequest.php'),
45+
$this->makeFilePath('/app/Http/Requests/LaravelValidationsMultipartFormDataRequest.php'),
46+
$this->makeFilePath('/app/Http/Requests/LaravelValidationsNonAvailableContentTypeRequest.php'),
4547

4648
$this->makeFilePath('/app/Http/Controllers/WithoutResponsesController.php'),
4749

tests/LaravelValidationRulesRequestTest.php

Lines changed: 69 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
use function Pest\Laravel\artisan;
88
use function PHPUnit\Framework\assertStringEqualsFile;
99

10-
test('Check creating Laravel Validation Rules in Request', function () {
10+
test('Check valid creating Laravel Validation Rules in Request with application/json content type', function () {
1111
/** @var TestCase $this */
1212
$mapping = Config::get('openapi-server-generator.api_docs_mappings');
1313
$mappingValue = current($mapping);
@@ -24,7 +24,7 @@
2424
$filesystem->shouldReceive('cleanDirectory', 'ensureDirectoryExists');
2525
$request = null;
2626
$filesystem->shouldReceive('put')->withArgs(function ($path, $content) use (&$request) {
27-
if (str_contains($path, 'LaravelValidationsRequest.php')) {
27+
if (str_contains($path, 'LaravelValidationsApplicationJsonRequest.php')) {
2828
$request = $content;
2929
}
3030

@@ -37,5 +37,71 @@
3737
$validationsEnd = strpos($request, '];', $validationsStart) + 2;
3838
$validations = substr($request, $validationsStart, $validationsEnd - $validationsStart);
3939

40-
assertStringEqualsFile(__DIR__ . '/expects/LaravelValidationsRequest.php', $validations);
40+
assertStringEqualsFile(__DIR__ . '/expects/LaravelValidationsApplicationJsonRequest.php', $validations);
41+
});
42+
43+
test('Check valid creating Laravel Validation Rules in Request with multipart/form-data content type', function () {
44+
/** @var TestCase $this */
45+
$mapping = Config::get('openapi-server-generator.api_docs_mappings');
46+
$mappingValue = current($mapping);
47+
$mapping = [$this->makeFilePath(__DIR__ . '/resources/index.yaml') => $mappingValue];
48+
Config::set('openapi-server-generator.api_docs_mappings', $mapping);
49+
50+
$filesystem = $this->mock(Filesystem::class);
51+
$filesystem->shouldReceive('exists')->andReturn(false);
52+
$filesystem->shouldReceive('get')->withArgs(function ($path) {
53+
return (bool)strstr($path, '.template');
54+
})->andReturnUsing(function ($path) {
55+
return file_get_contents($path);
56+
});
57+
$filesystem->shouldReceive('cleanDirectory', 'ensureDirectoryExists');
58+
$request = null;
59+
$filesystem->shouldReceive('put')->withArgs(function ($path, $content) use (&$request) {
60+
if (str_contains($path, 'LaravelValidationsMultipartFormDataRequest.php')) {
61+
$request = $content;
62+
}
63+
64+
return true;
65+
});
66+
67+
artisan(GenerateServer::class);
68+
69+
$validationsStart = strpos($request, "public function rules(): array") + 37;
70+
$validationsEnd = strpos($request, '];', $validationsStart) + 2;
71+
$validations = substr($request, $validationsStart, $validationsEnd - $validationsStart);
72+
73+
assertStringEqualsFile(__DIR__ . '/expects/LaravelValidationsMultipartFormDataRequest.php', $validations);
74+
});
75+
76+
test('Check valid creating Laravel Validation Rules in Request with non available content type', function () {
77+
/** @var TestCase $this */
78+
$mapping = Config::get('openapi-server-generator.api_docs_mappings');
79+
$mappingValue = current($mapping);
80+
$mapping = [$this->makeFilePath(__DIR__ . '/resources/index.yaml') => $mappingValue];
81+
Config::set('openapi-server-generator.api_docs_mappings', $mapping);
82+
83+
$filesystem = $this->mock(Filesystem::class);
84+
$filesystem->shouldReceive('exists')->andReturn(false);
85+
$filesystem->shouldReceive('get')->withArgs(function ($path) {
86+
return (bool)strstr($path, '.template');
87+
})->andReturnUsing(function ($path) {
88+
return file_get_contents($path);
89+
});
90+
$filesystem->shouldReceive('cleanDirectory', 'ensureDirectoryExists');
91+
$request = null;
92+
$filesystem->shouldReceive('put')->withArgs(function ($path, $content) use (&$request) {
93+
if (str_contains($path, 'LaravelValidationsNonAvailableContentTypeRequest.php')) {
94+
$request = $content;
95+
}
96+
97+
return true;
98+
});
99+
100+
artisan(GenerateServer::class);
101+
102+
$validationsStart = strpos($request, "public function rules(): array") + 37;
103+
$validationsEnd = strpos($request, '];', $validationsStart) + 2;
104+
$validations = substr($request, $validationsStart, $validationsEnd - $validationsStart);
105+
106+
assertStringEqualsFile(__DIR__ . '/expects/LaravelValidationsNonAvailableContentTypeRequest.php', $validations);
41107
});
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
return [
2+
'field_object_nullable' => ['nullable'],
3+
'field_object_nullable.field' => ['integer'],
4+
'field_array_nullable' => ['nullable', 'array'],
5+
'field_array_nullable.*.field' => ['integer'],
6+
'field_enum_nullable' => ['nullable', new Enum(TestIntegerEnum::class)],
7+
'field_number_nullable' => ['nullable', 'numeric'],
8+
'field_boolean_nullable' => ['nullable', 'boolean'],
9+
'field_string_nullable' => ['nullable', 'string'],
10+
'field_integer_nullable' => ['nullable', 'integer'],
11+
'field_object_required_object' => ['required'],
12+
'field_object_required_object.field' => ['integer'],
13+
'field_array_required_object' => ['required', 'array'],
14+
'field_array_required_object.*.field' => ['integer'],
15+
'field_enum_required_object' => ['required', new Enum(TestIntegerEnum::class)],
16+
'field_number_required_object' => ['required', 'numeric'],
17+
'field_boolean_required_object' => ['required', 'boolean'],
18+
'field_string_required_object' => ['required', 'string'],
19+
'field_integer_required_object' => ['required', 'integer'],
20+
'field_object_required' => ['required'],
21+
'field_object_required.field' => ['integer'],
22+
'field_array_required' => ['required', 'array'],
23+
'field_array_required.*.field' => ['integer'],
24+
'field_enum_required' => ['required', new Enum(TestIntegerEnum::class)],
25+
'field_number_required' => ['required', 'numeric'],
26+
'field_boolean_required' => ['required', 'boolean'],
27+
'field_string_required' => ['required', 'string'],
28+
'field_integer_required' => ['required', 'integer'],
29+
'field_object.field' => ['integer'],
30+
'field_array' => ['array'],
31+
'field_array.*.field' => ['integer'],
32+
'field_enum' => [new Enum(TestIntegerEnum::class)],
33+
'field_number' => ['numeric'],
34+
'field_boolean' => ['boolean'],
35+
'field_string_uuid' => ['uuid'],
36+
'field_string_url' => ['url'],
37+
'field_string_phone' => ['regex:/^\+7\d{10}$/'],
38+
'field_string_timezone' => ['timezone'],
39+
'field_string_ipv6' => ['ipv6'],
40+
'field_string_ipv4' => ['ipv4'],
41+
'field_string_email' => ['email'],
42+
'field_string_binary' => ['file'],
43+
'field_string_byte' => ['string'],
44+
'field_string_password' => ['password'],
45+
'field_string_date' => ['date'],
46+
'field_string' => ['string'],
47+
'field_integer_double' => ['integer'],
48+
'field_integer' => ['integer'],
49+
];
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
return [
2+
'file' => ['file'],
3+
];
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
return [
2+
//
3+
];

tests/expects/LaravelValidationsRequest.php

Lines changed: 0 additions & 29 deletions
This file was deleted.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
MultipartFileUploadRequest:
2+
type: object
3+
properties:
4+
file:
5+
type: string
6+
format: binary
7+
description: Загружаемый файл

tests/resources/index.yaml

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,10 @@ paths:
7373
operationId: testWithoutResponses
7474
x-lg-handler: '\App\Http\Controllers\WithoutResponsesController@testWithoutResponses'
7575
x-lg-skip-request-generation: true
76-
/resources:test-laravel-validations-request:
76+
/resources:test-laravel-validations-application-json-request:
7777
post:
78-
operationId: laravelValidations
79-
x-lg-handler: '\App\Http\Controllers\ResourcesController@testLaravelValidationsRequest'
78+
operationId: laravelValidationsApplicationJson
79+
x-lg-handler: '\App\Http\Controllers\ResourcesController@testLaravelValidationsApplicationJsonRequest'
8080
requestBody:
8181
required: true
8282
content:
@@ -86,6 +86,33 @@ paths:
8686
responses:
8787
"200":
8888
description: Успешный ответ
89+
/resources:test-laravel-validations-multipart-form-data-request:
90+
post:
91+
operationId: laravelValidationsMultipartFormData
92+
x-lg-handler: '\App\Http\Controllers\ResourcesController@testLaravelValidationsMultipartFormDataRequest'
93+
requestBody:
94+
required: true
95+
content:
96+
multipart/form-data:
97+
schema:
98+
$ref: './common_schemas.yaml#/MultipartFileUploadRequest'
99+
responses:
100+
"200":
101+
description: Успешный ответ
102+
/resources:test-laravel-validations-non-available-content-type:
103+
post:
104+
operationId: laravelValidationsNonAvailableContentType
105+
x-lg-handler: '\App\Http\Controllers\ResourcesController@testLaravelValidationsNonAvailableContentTypeRequest'
106+
requestBody:
107+
required: true
108+
content:
109+
text/plain:
110+
schema:
111+
type: string
112+
example: pong
113+
responses:
114+
"200":
115+
description: Успешный ответ
89116

90117
components:
91118
responses:

0 commit comments

Comments
 (0)