-
-
Notifications
You must be signed in to change notification settings - Fork 13
/
UserTrait.php
238 lines (190 loc) · 6.16 KB
/
UserTrait.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
<?php
declare(strict_types=1);
namespace DrevOps\BehatSteps;
use Behat\Gherkin\Node\TableNode;
use Drupal\user\Entity\User;
/**
* Trait UserTrait.
*
* User-related steps.
*
* @package DrevOps\BehatSteps\D7
*/
trait UserTrait {
use DateTrait;
/**
* Visit profile page of the specified user.
*
* @When I visit user :name profile
*/
public function userVisitProfile(string $name): void {
$users = $this->userLoadMultiple(['name' => $name]);
if (empty($users)) {
throw new \RuntimeException(sprintf('User "%s" does not exist.', $name));
}
$user = reset($users);
$this->visitPath('/user/' . $user->id());
}
/**
* Visit edit page of the current user.
*
* @When I go to my profile edit page
*/
public function userVisitOwnProfile(): void {
$user = $this->getUserManager()->getCurrentUser();
if ($user instanceof \stdClass) {
$id = $user->uid;
}
else {
throw new \RuntimeException('Require user to login before visiting profile page.');
}
$this->visitPath(sprintf('/user/%s/edit', $id));
}
/**
* Visit edit page of the specified user.
*
* @When I edit user :name profile
*/
public function userEditProfile(string $name): void {
$users = $this->userLoadMultiple(['name' => $name]);
if (empty($users)) {
throw new \RuntimeException(sprintf('User "%s" does not exist.', $name));
}
$user = reset($users);
$this->visitPath('/user/' . $user->id() . '/edit');
}
/**
* Remove users specified in the table.
*
* @Given no users:
*/
public function userDelete(TableNode $usersTable): void {
foreach ($usersTable->getHash() as $userHash) {
$users = [];
if (isset($userHash['mail'])) {
$users = $this->userLoadMultiple(['mail' => $userHash['mail']]);
}
elseif (isset($userHash['name'])) {
$users = $this->userLoadMultiple(['name' => $userHash['name']]);
}
if (!empty($users)) {
$user = reset($users);
$user->delete();
$this->getUserManager()->removeUser($user->getAccountName());
}
}
}
/**
* Assert that a user has roles assigned.
*
* @Then user :name has :roles role(s) assigned
*/
public function userAssertHasRoles(string $name, string $roles): void {
$users = $this->userLoadMultiple(['name' => $name]);
if (empty($users)) {
throw new \RuntimeException(sprintf('User "%s" does not exist.', $name));
}
$user = reset($users);
$roles = explode(',', $roles);
$roles = array_map(function ($value): string {
return trim($value);
}, $roles);
if (count(array_intersect($roles, $user->getRoles())) !== count($roles)) {
throw new \Exception(sprintf('User "%s" does not have role(s) "%s", but has roles "%s".', $name, implode('", "', $roles), implode('", "', $user->getRoles())));
}
}
/**
* Assert that a user does not have roles assigned.
*
* @Then user :name does not have :roles role(s) assigned
*/
public function userAssertHasNoRoles(string $name, string $roles): void {
$users = $this->userLoadMultiple(['name' => $name]);
if (empty($users)) {
throw new \RuntimeException(sprintf('User "%s" does not exist.', $name));
}
$user = reset($users);
$roles = explode(',', $roles);
$roles = array_map(function ($value): string {
return trim($value);
}, $roles);
if (count(array_intersect($roles, $user->getRoles())) > 0) {
throw new \Exception(sprintf('User "%s" should not have roles(s) "%s", but has "%s".', $name, implode('", "', $roles), implode('", "', $user->getRoles())));
}
}
/**
* Assert that a user is active or not.
*
* @Then user :name has :status status
*/
public function userAssertHasStatus(string $name, string $status): void {
if (!in_array($status, ['active', 'blocked'])) {
throw new \Exception(sprintf('Invalid status "%s".', $status));
}
$users = $this->userLoadMultiple(['name' => $name]);
if (empty($users)) {
throw new \RuntimeException(sprintf('User "%s" does not exist.', $name));
}
$user = reset($users);
if ($status === 'active') {
if (!$user->isActive()) {
throw new \Exception(sprintf('User "%s" is expected to have status "active", but has status "blocked".', $name));
}
}
elseif ($user->isActive()) {
throw new \Exception(sprintf('User "%s" is expected to have status "blocked", but has status "active".', $name));
}
}
/**
* Set a password for a user.
*
* @Then I set user :user password to :password
*/
public function userSetPassword(string $name, string $password): void {
if (empty($password)) {
throw new \RuntimeException('Password must be not empty.');
}
$users = $this->userLoadMultiple(['name' => $name]);
if (empty($users)) {
$users = $this->userLoadMultiple(['mail' => $name]);
}
if (empty($users)) {
throw new \RuntimeException(sprintf('Unable to find a user with name or email "%s".', $name));
}
$user = reset($users);
$user->setPassword($password)->save();
}
/**
* Set last access time for user.
*
* @Then the last access time of user :name is :time
*/
public function setUserLastAccess(string $name, string $time): void {
$users = $this->userLoadMultiple(['name' => $name]);
if (empty($users)) {
throw new \RuntimeException(sprintf('User "%s" does not exist.', $name));
}
$user = reset($users);
$timestamp = (int) static::dateRelativeProcessValue($time, time());
$user->setLastAccessTime($timestamp)->save();
}
/**
* Load multiple users with specified conditions.
*
* @param array<string,string> $conditions
* Conditions keyed by field names.
*
* @return array<int,\Drupal\user\UserInterface>
* Array of loaded user objects.
*/
protected function userLoadMultiple(array $conditions = []): array {
$query = \Drupal::entityQuery('user')->accessCheck(FALSE);
foreach ($conditions as $k => $v) {
$and = $query->andConditionGroup();
$and->condition($k, $v);
$query->condition($and);
}
$ids = $query->execute();
return $ids ? User::loadMultiple($ids) : [];
}
}