1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace yii2mod\rbac\tests\models; |
4
|
|
|
|
5
|
|
|
use Yii; |
6
|
|
|
use yii\base\Exception; |
7
|
|
|
use yii\rbac\Item; |
8
|
|
|
use yii2mod\rbac\models\AssignmentModel; |
9
|
|
|
use yii2mod\rbac\models\AuthItemModel; |
10
|
|
|
use yii2mod\rbac\tests\data\User; |
11
|
|
|
use yii2mod\rbac\tests\TestCase; |
12
|
|
|
|
13
|
|
|
/** |
14
|
|
|
* Class AssignmentTest |
15
|
|
|
* |
16
|
|
|
* @package yii2mod\rbac\tests\models |
17
|
|
|
*/ |
18
|
|
|
class AssignmentTest extends TestCase |
19
|
|
|
{ |
20
|
|
|
/** |
21
|
|
|
* @var string |
22
|
|
|
*/ |
23
|
|
|
private $_roleName = 'admin'; |
24
|
|
|
|
25
|
|
|
/** |
26
|
|
|
* @var string |
27
|
|
|
*/ |
28
|
|
|
private $_permissionName = 'viewArticles'; |
29
|
|
|
|
30
|
|
|
// Tests : |
31
|
|
|
|
32
|
|
View Code Duplication |
public function testAssignRole() |
|
|
|
|
33
|
|
|
{ |
34
|
|
|
$this->createRole(); |
35
|
|
|
|
36
|
|
|
$user = User::find()->one(); |
37
|
|
|
$model = new AssignmentModel($user); |
|
|
|
|
38
|
|
|
|
39
|
|
|
$this->assertTrue($model->assign([$this->_roleName])); |
40
|
|
|
$this->assertArrayHasKey($this->_roleName, Yii::$app->authManager->getAssignments($user->id)); |
41
|
|
|
|
42
|
|
|
return $model; |
43
|
|
|
} |
44
|
|
|
|
45
|
|
View Code Duplication |
public function testAssignPermission() |
|
|
|
|
46
|
|
|
{ |
47
|
|
|
$this->createPermission(); |
48
|
|
|
|
49
|
|
|
$user = User::find()->one(); |
50
|
|
|
$model = new AssignmentModel($user); |
|
|
|
|
51
|
|
|
|
52
|
|
|
$this->assertTrue($model->assign([$this->_permissionName])); |
53
|
|
|
$this->assertArrayHasKey($this->_permissionName, Yii::$app->authManager->getAssignments($user->id)); |
54
|
|
|
|
55
|
|
|
return $model; |
56
|
|
|
} |
57
|
|
|
|
58
|
|
|
/** |
59
|
|
|
* @depends testAssignRole |
60
|
|
|
* @depends testAssignPermission |
61
|
|
|
* |
62
|
|
|
* @param AssignmentModel $role |
63
|
|
|
* @param AssignmentModel $permission |
64
|
|
|
*/ |
65
|
|
|
public function testGetItems(AssignmentModel $role, AssignmentModel $permission) |
66
|
|
|
{ |
67
|
|
|
$this->assertArrayHasKey($this->_roleName, $role->getItems()['assigned']); |
68
|
|
|
$this->assertArrayHasKey($this->_permissionName, $permission->getItems()['assigned']); |
69
|
|
|
} |
70
|
|
|
|
71
|
|
|
/** |
72
|
|
|
* @depends testAssignRole |
73
|
|
|
* |
74
|
|
|
* @param AssignmentModel $model |
75
|
|
|
*/ |
76
|
|
|
public function testRevokeRole(AssignmentModel $model) |
77
|
|
|
{ |
78
|
|
|
$this->assertTrue($model->revoke([$this->_roleName])); |
79
|
|
|
} |
80
|
|
|
|
81
|
|
|
/** |
82
|
|
|
* @depends testAssignPermission |
83
|
|
|
* |
84
|
|
|
* @param AssignmentModel $model |
85
|
|
|
*/ |
86
|
|
|
public function testRevokePermission(AssignmentModel $model) |
87
|
|
|
{ |
88
|
|
|
$this->assertTrue($model->revoke([$this->_permissionName])); |
89
|
|
|
} |
90
|
|
|
|
91
|
|
|
/** |
92
|
|
|
* Create role for testing purposes |
93
|
|
|
* |
94
|
|
|
* @throws Exception |
95
|
|
|
*/ |
96
|
|
View Code Duplication |
private function createRole() |
|
|
|
|
97
|
|
|
{ |
98
|
|
|
$model = new AuthItemModel(); |
99
|
|
|
$model->type = Item::TYPE_ROLE; |
100
|
|
|
$model->name = $this->_roleName; |
101
|
|
|
|
102
|
|
|
if (!$model->save()) { |
103
|
|
|
throw new Exception("A Role '{$this->_roleName}' has not been created."); |
104
|
|
|
} |
105
|
|
|
} |
106
|
|
|
|
107
|
|
|
/** |
108
|
|
|
* Create permission for testing purposes |
109
|
|
|
* |
110
|
|
|
* @throws Exception |
111
|
|
|
*/ |
112
|
|
View Code Duplication |
private function createPermission() |
|
|
|
|
113
|
|
|
{ |
114
|
|
|
$model = new AuthItemModel(); |
115
|
|
|
$model->type = Item::TYPE_ROLE; |
116
|
|
|
$model->name = $this->_permissionName; |
117
|
|
|
|
118
|
|
|
if (!$model->save()) { |
119
|
|
|
throw new Exception("A Permission '{$this->_permissionName}' has not been created."); |
120
|
|
|
} |
121
|
|
|
} |
122
|
|
|
} |
123
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.