Skip to content

Commit 1a7302e

Browse files
committedAug 26, 2024·
Complete the test
1 parent 12a2a42 commit 1a7302e

15 files changed

+547
-17
lines changed
 

‎TODO.taskpaper

-9
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
/**
4+
* Table for User
5+
*/
6+
class m200000_000000_create_table_users extends \yii\db\Migration
7+
{
8+
public function up()
9+
{
10+
$this->createTable('{{%users}}', [
11+
'id' => $this->primaryKey(),
12+
'name' => $this->string(128)->notNull(),
13+
]);
14+
}
15+
16+
public function down()
17+
{
18+
$this->dropTable('{{%users}}');
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
/**
4+
* Table for Account
5+
*/
6+
class m200000_000001_create_table_accounts extends \yii\db\Migration
7+
{
8+
public function up()
9+
{
10+
$this->createTable('{{%accounts}}', [
11+
'id' => $this->primaryKey(),
12+
'name' => $this->string(128)->notNull(),
13+
'paymentMethodName' => $this->text()->null(),
14+
'user_id' => $this->integer()->null()->defaultValue(null),
15+
'user2_id' => $this->integer()->null()->defaultValue(null),
16+
'user3' => $this->integer()->null()->defaultValue(null),
17+
]);
18+
$this->addForeignKey('fk_accounts_user_id_users_id', '{{%accounts}}', 'user_id', '{{%users}}', 'id');
19+
$this->addForeignKey('fk_accounts_user2_id_users_id', '{{%accounts}}', 'user2_id', '{{%users}}', 'id');
20+
$this->addForeignKey('fk_accounts_user3_users_id', '{{%accounts}}', 'user3', '{{%users}}', 'id');
21+
}
22+
23+
public function down()
24+
{
25+
$this->dropForeignKey('fk_accounts_user3_users_id', '{{%accounts}}');
26+
$this->dropForeignKey('fk_accounts_user2_id_users_id', '{{%accounts}}');
27+
$this->dropForeignKey('fk_accounts_user_id_users_id', '{{%accounts}}');
28+
$this->dropTable('{{%accounts}}');
29+
}
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
/**
4+
* Table for Menu
5+
*/
6+
class m200000_000002_create_table_menus extends \yii\db\Migration
7+
{
8+
public function up()
9+
{
10+
$this->createTable('{{%menus}}', [
11+
'id' => $this->bigPrimaryKey(),
12+
'name' => $this->string(100)->notNull(),
13+
'parent_id' => $this->bigInteger()->null()->defaultValue(null),
14+
]);
15+
$this->addForeignKey('fk_menus_parent_id_menus_id', '{{%menus}}', 'parent_id', '{{%menus}}', 'id');
16+
}
17+
18+
public function down()
19+
{
20+
$this->dropForeignKey('fk_menus_parent_id_menus_id', '{{%menus}}');
21+
$this->dropTable('{{%menus}}');
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
namespace app\models;
4+
5+
class Account extends \app\models\base\Account
6+
{
7+
8+
9+
}
10+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php
2+
namespace app\models;
3+
4+
use Faker\UniqueGenerator;
5+
6+
/**
7+
* Fake data generator for Account
8+
* @method static Account makeOne($attributes = [], ?UniqueGenerator $uniqueFaker = null);
9+
* @method static Account saveOne($attributes = [], ?UniqueGenerator $uniqueFaker = null);
10+
* @method static Account[] make(int $number, $commonAttributes = [], ?UniqueGenerator $uniqueFaker = null)
11+
* @method static Account[] save(int $number, $commonAttributes = [], ?UniqueGenerator $uniqueFaker = null)
12+
*/
13+
class AccountFaker extends BaseModelFaker
14+
{
15+
16+
/**
17+
* @param array|callable $attributes
18+
* @return Account|\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 Account();
32+
//$model->id = $uniqueFaker->numberBetween(0, 1000000);
33+
$model->name = substr($faker->text(128), 0, 128);
34+
$model->paymentMethodName = $faker->sentence;
35+
$model->user_id = $faker->randomElement(\app\models\User::find()->select("id")->column());
36+
$model->user2_id = $faker->randomElement(\app\models\User::find()->select("id")->column());
37+
$model->user3 = $faker->randomElement(\app\models\User::find()->select("id")->column());
38+
if (!is_callable($attributes)) {
39+
$model->setAttributes($attributes, false);
40+
} else {
41+
$model = $attributes($model, $faker, $uniqueFaker);
42+
}
43+
return $model;
44+
}
45+
46+
public static function dependentOn()
47+
{
48+
return [
49+
// just model class names
50+
'User',
51+
52+
];
53+
}
54+
}
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 Menu extends \app\models\base\Menu
6+
{
7+
8+
9+
}
10+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
namespace app\models;
3+
4+
use Faker\UniqueGenerator;
5+
6+
/**
7+
* Fake data generator for Menu
8+
* @method static Menu makeOne($attributes = [], ?UniqueGenerator $uniqueFaker = null);
9+
* @method static Menu saveOne($attributes = [], ?UniqueGenerator $uniqueFaker = null);
10+
* @method static Menu[] make(int $number, $commonAttributes = [], ?UniqueGenerator $uniqueFaker = null)
11+
* @method static Menu[] save(int $number, $commonAttributes = [], ?UniqueGenerator $uniqueFaker = null)
12+
*/
13+
class MenuFaker extends BaseModelFaker
14+
{
15+
16+
/**
17+
* @param array|callable $attributes
18+
* @return Menu|\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 Menu();
32+
//$model->id = $uniqueFaker->numberBetween(0, 1000000);
33+
$model->name = substr($faker->text(100), 0, 100);
34+
$model->parent_id = $faker->randomElement(\app\models\Menu::find()->select("id")->column());
35+
if (!is_callable($attributes)) {
36+
$model->setAttributes($attributes, false);
37+
} else {
38+
$model = $attributes($model, $faker, $uniqueFaker);
39+
}
40+
return $model;
41+
}
42+
43+
public static function dependentOn()
44+
{
45+
return [
46+
// just model class names
47+
'Menu',
48+
49+
];
50+
}
51+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
namespace app\models;
4+
5+
class User extends \app\models\base\User
6+
{
7+
8+
9+
}
10+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?php
2+
namespace app\models;
3+
4+
use Faker\UniqueGenerator;
5+
6+
/**
7+
* Fake data generator for User
8+
* @method static User makeOne($attributes = [], ?UniqueGenerator $uniqueFaker = null);
9+
* @method static User saveOne($attributes = [], ?UniqueGenerator $uniqueFaker = null);
10+
* @method static User[] make(int $number, $commonAttributes = [], ?UniqueGenerator $uniqueFaker = null)
11+
* @method static User[] save(int $number, $commonAttributes = [], ?UniqueGenerator $uniqueFaker = null)
12+
*/
13+
class UserFaker extends BaseModelFaker
14+
{
15+
16+
/**
17+
* @param array|callable $attributes
18+
* @return User|\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 User();
32+
//$model->id = $uniqueFaker->numberBetween(0, 1000000);
33+
$model->name = substr($faker->text(128), 0, 128);
34+
if (!is_callable($attributes)) {
35+
$model->setAttributes($attributes, false);
36+
} else {
37+
$model = $attributes($model, $faker, $uniqueFaker);
38+
}
39+
return $model;
40+
}
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<?php
2+
3+
namespace app\models\base;
4+
5+
/**
6+
* Account
7+
*
8+
* @property int $id
9+
* @property string $name account name
10+
* @property string $paymentMethodName
11+
* @property int $user_id
12+
* @property int $user2_id
13+
* @property int $user3
14+
*
15+
* @property \app\models\User $user
16+
* @property \app\models\User $user2
17+
* @property \app\models\User $user3
18+
*/
19+
abstract class Account extends \yii\db\ActiveRecord
20+
{
21+
public static function tableName()
22+
{
23+
return '{{%accounts}}';
24+
}
25+
26+
public function rules()
27+
{
28+
return [
29+
'trim' => [['name', 'paymentMethodName'], 'trim'],
30+
'required' => [['name'], 'required'],
31+
'user_id_integer' => [['user_id'], 'integer'],
32+
'user_id_exist' => [['user_id'], 'exist', 'targetRelation' => 'User'],
33+
'user2_id_integer' => [['user2_id'], 'integer'],
34+
'user2_id_exist' => [['user2_id'], 'exist', 'targetRelation' => 'User2'],
35+
'user3_integer' => [['user3'], 'integer'],
36+
'user3_exist' => [['user3'], 'exist', 'targetRelation' => 'User3'],
37+
'name_string' => [['name'], 'string', 'max' => 128],
38+
'paymentMethodName_string' => [['paymentMethodName'], 'string'],
39+
];
40+
}
41+
42+
public function getUser()
43+
{
44+
return $this->hasOne(\app\models\User::class, ['id' => 'user_id']);
45+
}
46+
47+
public function getUser2()
48+
{
49+
return $this->hasOne(\app\models\User::class, ['id' => 'user2_id']);
50+
}
51+
52+
public function getUser3()
53+
{
54+
return $this->hasOne(\app\models\User::class, ['id' => 'user3']);
55+
}
56+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
namespace app\models\base;
4+
5+
/**
6+
*
7+
*
8+
* @property int $id
9+
* @property string $name
10+
* @property int $parent_id
11+
*
12+
* @property \app\models\Menu $parent
13+
* @property array|\app\models\Menu[] $childes
14+
*/
15+
abstract class Menu extends \yii\db\ActiveRecord
16+
{
17+
public static function tableName()
18+
{
19+
return '{{%menus}}';
20+
}
21+
22+
public function rules()
23+
{
24+
return [
25+
'trim' => [['name'], 'trim'],
26+
'required' => [['name'], 'required'],
27+
'parent_id_integer' => [['parent_id'], 'integer'],
28+
'parent_id_exist' => [['parent_id'], 'exist', 'targetRelation' => 'Parent'],
29+
'name_string' => [['name'], 'string', 'min' => 3, 'max' => 100],
30+
];
31+
}
32+
33+
public function getParent()
34+
{
35+
return $this->hasOne(\app\models\Menu::class, ['id' => 'parent_id']);
36+
}
37+
38+
public function getChildes()
39+
{
40+
return $this->hasMany(\app\models\Menu::class, ['parent_id' => 'id']);
41+
}
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?php
2+
3+
namespace app\models\base;
4+
5+
/**
6+
*
7+
*
8+
* @property int $id
9+
* @property string $name
10+
*
11+
* @property array|\app\models\Account[] $accounts
12+
*/
13+
abstract class User extends \yii\db\ActiveRecord
14+
{
15+
public static function tableName()
16+
{
17+
return '{{%users}}';
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+
];
27+
}
28+
29+
public function getAccounts()
30+
{
31+
return $this->hasMany(\app\models\Account::class, ['user_id' => 'id'])->inverseOf('user');
32+
}
33+
34+
public function getAccount()
35+
{
36+
return $this->hasOne(\app\models\Account::class, ['user_id' => 'id'])->inverseOf('user');
37+
}
38+
39+
public function getAccount2()
40+
{
41+
return $this->hasOne(\app\models\Account::class, ['user2_id' => 'id'])->inverseOf('user2');
42+
}
43+
44+
public function getAccount3()
45+
{
46+
return $this->hasOne(\app\models\Account::class, ['user3' => 'id'])->inverseOf('user3');
47+
}
48+
}

‎tests/unit/IssueFixTest.php

+8-8
Original file line numberDiff line numberDiff line change
@@ -364,15 +364,15 @@ public function test158BugGiiapiGeneratedRulesEnumWithTrim()
364364
// https://github.com/php-openapi/yii2-openapi/issues/25
365365
public function test25GenerateInverseRelations()
366366
{
367-
// 25_generate_inverse_relations
368367
$testFile = Yii::getAlias("@specs/issue_fix/25_generate_inverse_relations/index.php");
369368
$this->runGenerator($testFile);
370-
// $actualFiles = FileHelper::findFiles(Yii::getAlias('@app'), [
371-
// 'recursive' => true,
372-
// ]);
373-
// $expectedFiles = FileHelper::findFiles(Yii::getAlias("@specs/issue_fix/25_generate_inverse_relations/mysql"), [
374-
// 'recursive' => true,
375-
// ]);
376-
// $this->checkFiles($actualFiles, $expectedFiles);
369+
$this->runActualMigrations('mysql', 3);
370+
$actualFiles = FileHelper::findFiles(Yii::getAlias('@app'), [
371+
'recursive' => true,
372+
]);
373+
$expectedFiles = FileHelper::findFiles(Yii::getAlias("@specs/issue_fix/25_generate_inverse_relations/mysql"), [
374+
'recursive' => true,
375+
]);
376+
$this->checkFiles($actualFiles, $expectedFiles);
377377
}
378378
}

0 commit comments

Comments
 (0)
Please sign in to comment.