Skip to content

Commit 1b804ee

Browse files
authored
Merge pull request #96 from silinternational/develop
Release 2.8.0: Add query filtering on role to members.listMembers
2 parents 1a2f959 + 603cc8e commit 1b804ee

File tree

5 files changed

+107
-28
lines changed

5 files changed

+107
-28
lines changed

SilMock/Google/Service/Directory/Resource/Members.php

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -69,20 +69,20 @@ public function listMembers($groupKey, $optParams = [])
6969
$this->validateGroupExists($groupKey);
7070
$pageSize = $optParams['pageSize'] ?? 10;
7171
$pageToken = $optParams['pageToken'] ?? 0;
72+
$query = $optParams['query'] ?? null;
73+
$expectedRoles = $this->extractRoles($query);
7274
$members = new GoogleDirectory_Members();
7375
$directoryMemberRecords = $this->getRecords();
7476
$memberCounter = 0;
7577
foreach ($directoryMemberRecords as $memberRecord) {
7678
$memberData = json_decode($memberRecord['data'], true);
77-
if ($memberData['groupKey'] === $groupKey) {
78-
$memberCounter = $memberCounter + 1;
79-
if ($memberCounter >= ($pageToken * $pageSize)) {
80-
$currentMembers = $members->getMembers();
81-
$currentMember = new GoogleDirectory_Member();
82-
ObjectUtils::initialize($currentMember, $memberData['member']);
83-
$currentMembers[] = $currentMember;
84-
$members->setMembers($currentMembers);
85-
}
79+
if (
80+
$memberData['groupKey'] === $groupKey // Matches the expected group
81+
&& $memberCounter >= ($pageToken * $pageSize) // Matches the subsection of all the members
82+
&& (empty($expectedRoles) || in_array($memberData['member']['role'], $expectedRoles)) // Matches role
83+
) {
84+
$memberCounter = $memberCounter + 1;
85+
$this->addToMembers($memberData, $members);
8686
}
8787
$currentMembers = $members->getMembers();
8888
$currentResultSize = count($currentMembers);
@@ -98,6 +98,32 @@ public function listMembers($groupKey, $optParams = [])
9898
return $members;
9999
}
100100

101+
protected function extractRoles(?string $query): array
102+
{
103+
if (! empty($query) && str_contains($query, 'roles')) {
104+
$roleSegmentStart = substr($query, strpos($query, 'roles'));
105+
$roleSegmentEnd = strrpos($roleSegmentStart, ' ');
106+
if ($roleSegmentEnd === false) {
107+
$roleSegmentEnd = strlen($roleSegmentStart);
108+
}
109+
$roleSegment = trim(substr($roleSegmentStart, 0, $roleSegmentEnd));
110+
$roleValue = substr($roleSegment, 6); // roles= is 0-5
111+
$expectedRoles = explode(',', $roleValue);
112+
} else {
113+
$expectedRoles = [];
114+
}
115+
return $expectedRoles;
116+
}
117+
118+
protected function addToMembers(array $memberData, GoogleDirectory_Members $members): void
119+
{
120+
$currentMembers = $members->getMembers();
121+
$currentMember = new GoogleDirectory_Member();
122+
ObjectUtils::initialize($currentMember, $memberData['member']);
123+
$currentMembers[] = $currentMember;
124+
$members->setMembers($currentMembers);
125+
}
126+
101127
protected function validateGroupExists(string $groupKey): void
102128
{
103129
$mockGroupsObject = new Groups($this->dbFile);

SilMock/Google/Service/Directory/Tokens.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ protected function assertIsValidUserKey(string $userId)
5050
*/
5151
protected function isValidEmailAddress(string $email): bool
5252
{
53-
return (filter_var($email, FILTER_VALIDATE_EMAIL) !== false);
53+
return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
5454
}
5555

5656
protected function listTokensFor(string $userId): array

SilMock/Google/Service/Directory/UsersAliasesResource.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
class UsersAliasesResource extends DbClass
1313
{
14+
public const ACCOUNT_DOESNT_EXIST = "Account doesn't exist: ";
15+
1416
public function __construct(?string $dbFile = null)
1517
{
1618
parent::__construct($dbFile, 'directory', 'users_alias');
@@ -37,7 +39,7 @@ public function delete($userKey, $alias)
3739
$matchingUsers = $dir->users->get($userKey);
3840

3941
if ($matchingUsers === null) {
40-
throw new Exception("Account doesn't exist: " . $userKey, 201407101645);
42+
throw new Exception(self::ACCOUNT_DOESNT_EXIST . $userKey, 201407101645);
4143
}
4244

4345
// Get all the aliases for that user
@@ -87,7 +89,7 @@ public function insert($userKey, $postBody)
8789
$matchingUsers = $dir->users->get($userKey);
8890

8991
if ($matchingUsers === null) {
90-
throw new Exception("Account doesn't exist: " . $userKey, 201407110830);
92+
throw new Exception(self::ACCOUNT_DOESNT_EXIST . $userKey, 201407110830);
9193
}
9294

9395
if ($postBody->$key === null) {
@@ -145,7 +147,7 @@ public function listUsersAliases($userKey): ?Google_Service_Directory_Aliases
145147
$matchingUsers = $dir->users->get($userKey);
146148

147149
if ($matchingUsers === null) {
148-
throw new Exception("Account doesn't exist: " . $userKey, 201407101420);
150+
throw new Exception(self::ACCOUNT_DOESNT_EXIST . $userKey, 201407101420);
149151
}
150152

151153
$foundAliases = $this->fetchAliasesByUser($key, $userKey);

SilMock/Google/Service/Directory/UsersResource.php

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -112,18 +112,20 @@ protected function getDbUserByAlias($userKey)
112112
}
113113

114114
$allUsers = $this->getAllDbUsers();
115-
116-
foreach ($allUsers as $aUser) {
117-
if (! isset($aUser['data'])) {
118-
continue;
115+
$usersWithData = array_filter(
116+
$allUsers,
117+
function ($user) {
118+
return isset($user['data']);
119119
}
120-
120+
);
121+
122+
foreach ($usersWithData as $aUser) {
121123
$userData = json_decode($aUser['data'], true);
122124
if ($userData === null) {
123125
continue;
124126
}
125127

126-
$primaryEmail = isset($userData['primaryEmail']) ? $userData['primaryEmail'] : null;
128+
$primaryEmail = $userData['primaryEmail'] ?? null;
127129

128130
$aliasesResource = $this->getAliasesForUser($primaryEmail);
129131
if ($aliasesResource) {
@@ -408,7 +410,8 @@ private function doesUserMatch($entry, $query = '')
408410
}
409411
} elseif (is_array($checkValue)) {
410412
throw new \Exception(
411-
"Did not expect something other than name as an array. Got VALUE: " . var_dump($checkValue)
413+
"Did not expect something other than name as an array. Got VALUE: "
414+
. var_export($checkValue, true)
412415
);
413416
}
414417
} elseif (isset($entry['name'][$field])) {

SilMock/tests/Google/Service/Directory/Resource/MembersTest.php

Lines changed: 56 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public function testInsert()
2121

2222
$member = new GoogleDirectory_Member();
2323
$member->setEmail($emailAddress);
24+
$member->setRole('MEMBER');
2425

2526
$mockGoogleServiceDirectory = new GoogleMock_Directory('anyclient', $this->dataFile);
2627
try {
@@ -72,24 +73,71 @@ public function testHasMember()
7273
self::assertTrue($hasMember);
7374
}
7475

75-
public function testListMembers()
76+
public function testListMembersAll()
7677
{
7778
$groupEmailAddress = '[email protected]';
7879
$mockGoogleServiceDirectory = new GoogleMock_Directory('anyclient', $this->dataFile);
7980
$members = [];
8081
try {
8182
$members = $mockGoogleServiceDirectory->members->listMembers($groupEmailAddress);
8283
} catch (Exception $exception) {
83-
self::fail(
84-
sprintf(
85-
'Was expecting the members.list method to function, but got: %s',
86-
$exception->getMessage()
87-
)
84+
$this->failure($exception);
85+
}
86+
self::assertNotEmpty(
87+
$members->getMembers(),
88+
'Was expecting the members.list method to have at least one member entry.'
89+
);
90+
}
91+
92+
public function testListMembersOnlyMember()
93+
{
94+
$groupEmailAddress = '[email protected]';
95+
$mockGoogleServiceDirectory = new GoogleMock_Directory('anyclient', $this->dataFile);
96+
$members = [];
97+
try {
98+
$members = $mockGoogleServiceDirectory->members->listMembers(
99+
$groupEmailAddress,
100+
[
101+
'query' => 'roles=MEMBER'
102+
]
88103
);
104+
} catch (Exception $exception) {
105+
$this->failure($exception);
89106
}
90107
self::assertNotEmpty(
91-
$members,
92-
'Was expecting the members.list method to have at least one member.'
108+
$members->getMembers(),
109+
'Was expecting the members.list method to have at least one member type entry.'
110+
);
111+
}
112+
113+
public function testListMembersOnlyOwner()
114+
{
115+
$groupEmailAddress = '[email protected]';
116+
$mockGoogleServiceDirectory = new GoogleMock_Directory('anyclient', $this->dataFile);
117+
$members = [];
118+
try {
119+
$members = $mockGoogleServiceDirectory->members->listMembers(
120+
$groupEmailAddress,
121+
[
122+
'query' => 'roles=OWNER'
123+
]
124+
);
125+
} catch (Exception $exception) {
126+
$this->failure($exception);
127+
}
128+
self::assertEmpty(
129+
$members->getMembers(),
130+
'Was expecting the members.list method to have no owner types.'
131+
);
132+
}
133+
134+
protected function failure(Exception $exception): void
135+
{
136+
self::fail(
137+
sprintf(
138+
'Was expecting the members.insert method to function, but got: %s',
139+
$exception->getMessage()
140+
)
93141
);
94142
}
95143
}

0 commit comments

Comments
 (0)