Skip to content

Commit a56c90e

Browse files
authored
Merge pull request #40 from SOHELAHMED7/158-bug-giiapi-generated-rules-enum-with-trim
Resolve: Bug gii/api generated rules: enum with trim cebe#158
2 parents 4e77f4d + 01846a8 commit a56c90e

File tree

13 files changed

+305
-6
lines changed

13 files changed

+305
-6
lines changed

Diff for: src/lib/ValidationRulesBuilder.php

+3-1
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,9 @@ private function prepareTypeScope():void
233233
$this->typeScope['required'][$attribute->columnName] = $attribute->columnName;
234234
}
235235

236-
if ($attribute->phpType === 'string') {
236+
if ($attribute->phpType === 'string' &&
237+
empty($attribute->enumValues) # don't apply trim on enum columns # https://github.com/cebe/yii2-openapi/issues/158
238+
) {
237239
$this->typeScope['trim'][$attribute->columnName] = $attribute->columnName;
238240
}
239241

Diff for: tests/specs/blog_v2/models/base/Post.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public static function tableName()
2929
public function rules()
3030
{
3131
return [
32-
'trim' => [['title', 'slug', 'lang', 'created_at'], 'trim'],
32+
'trim' => [['title', 'slug', 'created_at'], 'trim'],
3333
'required' => [['title', 'category_id', 'active'], 'required'],
3434
'category_id_integer' => [['category_id'], 'integer'],
3535
'category_id_exist' => [['category_id'], 'exist', 'targetRelation' => 'Category'],

Diff for: tests/specs/blog_v2/models/base/Tag.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public static function tableName()
2121
public function rules()
2222
{
2323
return [
24-
'trim' => [['name', 'lang'], 'trim'],
24+
'trim' => [['name'], 'trim'],
2525
'required' => [['name', 'lang'], 'required'],
2626
'name_unique' => [['name'], 'unique'],
2727
'name_string' => [['name'], 'string', 'max' => 100],

Diff for: tests/specs/blog_v2/models/base/User.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public static function tableName()
2424
public function rules()
2525
{
2626
return [
27-
'trim' => [['login', 'email', 'password', 'role', 'created_at'], 'trim'],
27+
'trim' => [['login', 'email', 'password', 'created_at'], 'trim'],
2828
'required' => [['login', 'email', 'password'], 'required'],
2929
'login_unique' => [['login'], 'unique'],
3030
'email_unique' => [['email'], 'unique'],
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
return [
4+
'openApiPath' => '@specs/issue_fix/158_bug_giiapi_generated_rules_enum_with_trim/index.yaml',
5+
'generateUrls' => false,
6+
'generateModels' => true,
7+
'excludeModels' => [
8+
'Error',
9+
],
10+
'generateControllers' => false,
11+
'generateMigrations' => false,
12+
'generateModelFaker' => true, // `generateModels` must be `true` in orde to use `generateModelFaker` as `true`
13+
];
14+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
2+
openapi: 3.0.3
3+
4+
info:
5+
title: 'Proxy-Service'
6+
version: 1.0.0
7+
8+
components:
9+
10+
schemas:
11+
12+
Mailing:
13+
description: Mailing
14+
type: object
15+
required:
16+
- id
17+
- name
18+
properties:
19+
id:
20+
type: integer
21+
readOnly: true
22+
name:
23+
description: name
24+
type: string
25+
maxLength: 128
26+
paymentMethodName:
27+
type: string
28+
enum:
29+
- card
30+
- cash
31+
- ewallet
32+
33+
paths:
34+
'/':
35+
get:
36+
operationId: opId
37+
summary: summary
38+
responses:
39+
'200':
40+
description: OK
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
<?php
2+
3+
namespace app\models;
4+
5+
use Faker\Factory as FakerFactory;
6+
use Faker\Generator;
7+
use Faker\UniqueGenerator;
8+
9+
/**
10+
* Base fake data generator
11+
*/
12+
abstract class BaseModelFaker
13+
{
14+
/**
15+
* @var Generator
16+
*/
17+
protected $faker;
18+
/**
19+
* @var UniqueGenerator
20+
*/
21+
protected $uniqueFaker;
22+
23+
public function __construct()
24+
{
25+
$this->faker = FakerFactory::create(str_replace('-', '_', \Yii::$app->language));
26+
$this->uniqueFaker = new UniqueGenerator($this->faker);
27+
}
28+
29+
abstract public function generateModel($attributes = []);
30+
31+
public function getFaker():Generator
32+
{
33+
return $this->faker;
34+
}
35+
36+
public function getUniqueFaker():UniqueGenerator
37+
{
38+
return $this->uniqueFaker;
39+
}
40+
41+
public function setFaker(Generator $faker):void
42+
{
43+
$this->faker = $faker;
44+
}
45+
46+
public function setUniqueFaker(UniqueGenerator $faker):void
47+
{
48+
$this->uniqueFaker = $faker;
49+
}
50+
51+
/**
52+
* Generate and return model
53+
* @param array|callable $attributes
54+
* @param UniqueGenerator|null $uniqueFaker
55+
* @return \yii\db\ActiveRecord
56+
* @example MyFaker::makeOne(['user_id' => 1, 'title' => 'foo']);
57+
* @example MyFaker::makeOne( function($model, $faker) {
58+
* $model->scenario = 'create';
59+
* $model->setAttributes(['user_id' => 1, 'title' => $faker->sentence]);
60+
* return $model;
61+
* });
62+
*/
63+
public static function makeOne($attributes = [], ?UniqueGenerator $uniqueFaker = null)
64+
{
65+
$fakeBuilder = new static();
66+
if ($uniqueFaker !== null) {
67+
$fakeBuilder->setUniqueFaker($uniqueFaker);
68+
}
69+
$model = $fakeBuilder->generateModel($attributes);
70+
return $model;
71+
}
72+
73+
/**
74+
* Generate, save and return model
75+
* @param array|callable $attributes
76+
* @param UniqueGenerator|null $uniqueFaker
77+
* @return \yii\db\ActiveRecord
78+
* @example MyFaker::saveOne(['user_id' => 1, 'title' => 'foo']);
79+
* @example MyFaker::saveOne( function($model, $faker) {
80+
* $model->scenario = 'create';
81+
* $model->setAttributes(['user_id' => 1, 'title' => $faker->sentence]);
82+
* return $model;
83+
* });
84+
*/
85+
public static function saveOne($attributes = [], ?UniqueGenerator $uniqueFaker = null)
86+
{
87+
$model = static::makeOne($attributes, $uniqueFaker);
88+
$model->save();
89+
return $model;
90+
}
91+
92+
/**
93+
* Generate and return multiple models
94+
* @param int $number
95+
* @param array|callable $commonAttributes
96+
* @return \yii\db\ActiveRecord[]|array
97+
* @example TaskFaker::make(5, ['project_id'=>1, 'user_id' => 2]);
98+
* @example TaskFaker::make(5, function($model, $faker, $uniqueFaker) {
99+
* $model->setAttributes(['name' => $uniqueFaker->username, 'state'=>$faker->boolean(20)]);
100+
* return $model;
101+
* });
102+
*/
103+
public static function make(int $number, $commonAttributes = [], ?UniqueGenerator $uniqueFaker = null):array
104+
{
105+
if ($number < 1) {
106+
return [];
107+
}
108+
$fakeBuilder = new static();
109+
if ($uniqueFaker !== null) {
110+
$fakeBuilder->setUniqueFaker($uniqueFaker);
111+
}
112+
return array_map(function () use ($commonAttributes, $fakeBuilder) {
113+
$model = $fakeBuilder->generateModel($commonAttributes);
114+
return $model;
115+
}, range(0, $number -1));
116+
}
117+
118+
/**
119+
* Generate, save and return multiple models
120+
* @param int $number
121+
* @param array|callable $commonAttributes
122+
* @return \yii\db\ActiveRecord[]|array
123+
* @example TaskFaker::save(5, ['project_id'=>1, 'user_id' => 2]);
124+
* @example TaskFaker::save(5, function($model, $faker, $uniqueFaker) {
125+
* $model->setAttributes(['name' => $uniqueFaker->username, 'state'=>$faker->boolean(20)]);
126+
* return $model;
127+
* });
128+
*/
129+
public static function save(int $number, $commonAttributes = [], ?UniqueGenerator $uniqueFaker = null):array
130+
{
131+
if ($number < 1) {
132+
return [];
133+
}
134+
$fakeBuilder = new static();
135+
if ($uniqueFaker !== null) {
136+
$fakeBuilder->setUniqueFaker($uniqueFaker);
137+
}
138+
return array_map(function () use ($commonAttributes, $fakeBuilder) {
139+
$model = $fakeBuilder->generateModel($commonAttributes);
140+
$model->save();
141+
return $model;
142+
}, range(0, $number -1));
143+
}
144+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
namespace app\models;
4+
5+
class Mailing extends \app\models\base\Mailing
6+
{
7+
8+
9+
}
10+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
namespace app\models;
3+
4+
use Faker\UniqueGenerator;
5+
6+
/**
7+
* Fake data generator for Mailing
8+
* @method static Mailing makeOne($attributes = [], ?UniqueGenerator $uniqueFaker = null);
9+
* @method static Mailing saveOne($attributes = [], ?UniqueGenerator $uniqueFaker = null);
10+
* @method static Mailing[] make(int $number, $commonAttributes = [], ?UniqueGenerator $uniqueFaker = null)
11+
* @method static Mailing[] save(int $number, $commonAttributes = [], ?UniqueGenerator $uniqueFaker = null)
12+
*/
13+
class MailingFaker extends BaseModelFaker
14+
{
15+
16+
/**
17+
* @param array|callable $attributes
18+
* @return Mailing|\yii\db\ActiveRecord
19+
* @example
20+
* $model = (new PostFaker())->generateModels(['author_id' => 1]);
21+
* $model = (new PostFaker())->generateModels(function($model, $faker, $uniqueFaker) {
22+
* $model->scenario = 'create';
23+
* $model->author_id = 1;
24+
* return $model;
25+
* });
26+
**/
27+
public function generateModel($attributes = [])
28+
{
29+
$faker = $this->faker;
30+
$uniqueFaker = $this->uniqueFaker;
31+
$model = new Mailing();
32+
//$model->id = $uniqueFaker->numberBetween(0, 1000000);
33+
$model->name = substr($faker->text(128), 0, 128);
34+
$model->paymentMethodName = $faker->randomElement(['card','cash','ewallet']);
35+
if (!is_callable($attributes)) {
36+
$model->setAttributes($attributes, false);
37+
} else {
38+
$model = $attributes($model, $faker, $uniqueFaker);
39+
}
40+
return $model;
41+
}
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
namespace app\models\base;
4+
5+
/**
6+
* Mailing
7+
*
8+
* @property int $id
9+
* @property string $name name
10+
* @property string $paymentMethodName
11+
*
12+
*/
13+
abstract class Mailing extends \yii\db\ActiveRecord
14+
{
15+
public static function tableName()
16+
{
17+
return '{{%mailings}}';
18+
}
19+
20+
public function rules()
21+
{
22+
return [
23+
'trim' => [['name'], 'trim'],
24+
'required' => [['name'], 'required'],
25+
'name_string' => [['name'], 'string', 'max' => 128],
26+
'paymentMethodName_string' => [['paymentMethodName'], 'string'],
27+
'paymentMethodName_in' => [['paymentMethodName'], 'in', 'range' => [
28+
'card',
29+
'cash',
30+
'ewallet',
31+
]],
32+
];
33+
}
34+
}

Diff for: tests/specs/postgres_custom/models/base/Custom.php

-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ public static function tableName()
2626
public function rules()
2727
{
2828
return [
29-
'trim' => [['status', 'status_x'], 'trim'],
3029
'num_integer' => [['num'], 'integer'],
3130
'num_default' => [['num'], 'default', 'value' => 0],
3231
'json1_default' => [['json1'], 'default', 'value' => []],

Diff for: tests/unit/IssueFixTest.php

+15
Original file line numberDiff line numberDiff line change
@@ -345,4 +345,19 @@ public function test159BugGiiapiGeneratedRulesEmailid()
345345
]);
346346
$this->checkFiles($actualFiles, $expectedFiles);
347347
}
348+
349+
// https://github.com/cebe/yii2-openapi/issues/158
350+
public function test158BugGiiapiGeneratedRulesEnumWithTrim()
351+
{
352+
$this->changeDbToMariadb();
353+
$testFile = Yii::getAlias("@specs/issue_fix/158_bug_giiapi_generated_rules_enum_with_trim/index.php");
354+
$this->runGenerator($testFile, 'maria');
355+
$actualFiles = FileHelper::findFiles(Yii::getAlias('@app'), [
356+
'recursive' => true,
357+
]);
358+
$expectedFiles = FileHelper::findFiles(Yii::getAlias("@specs/issue_fix/158_bug_giiapi_generated_rules_enum_with_trim/maria"), [
359+
'recursive' => true,
360+
]);
361+
$this->checkFiles($actualFiles, $expectedFiles);
362+
}
348363
}

Diff for: tests/unit/ValidatorRulesBuilderTest.php

-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ public function testBuild()
4242
'trim' => new ValidationRule([
4343
'title',
4444
'article',
45-
'state',
4645
'created_at',
4746
'contact_email',
4847
'required_with_def',

0 commit comments

Comments
 (0)