Skip to content

Commit

Permalink
Added AppGroup functional test case for team list builder (#1011)
Browse files Browse the repository at this point in the history
  • Loading branch information
shishir-intelli authored Dec 14, 2023
1 parent 6d1ca8b commit 1b692f7
Show file tree
Hide file tree
Showing 3 changed files with 290 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,243 @@
<?php

/**
* Copyright 2023 Google Inc.
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License version 2 as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
* License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc., 51
* Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/

namespace Drupal\Tests\apigee_edge_teams\Functional\ApigeeX;

use Drupal\apigee_edge\Entity\Developer;
use Drupal\Core\Url;
use Symfony\Component\HttpFoundation\Response;

/**
* Apigee Edge Teams list builder tests.
*
* @group apigee_edge
* @group apigee_edge_teams
*/
class TeamListBuilderTest extends ApigeeEdgeTeamsFunctionalTestBase {

/**
* Indicates this test class is mock API client ready.
*
* @var bool
*/
protected static $mock_api_client_ready = TRUE;

/**
* {@inheritdoc}
*/
protected static $modules = [
'system',
'user',
'options',
'key',
'apigee_edge',
'apigee_edge_teams',
'apigee_mock_api_client',
];

/**
* The team entity storage.
*
* @var \Drupal\apigee_edge_teams\Entity\Storage\TeamStorageInterface
*/
protected $teamStorage;

/**
* The user 1 account.
*
* @var \Drupal\user\UserInterface
*/
protected $account;

/**
* Drupal user who is a member team A.
*
* @var \Drupal\user\UserInterface
*/
protected $aMemberAccount;

/**
* Drupal user who is a member team B.
*
* @var \Drupal\user\UserInterface
*/
protected $bMemberAccount;

/**
* Drupal user who is an admin.
*
* @var \Drupal\user\UserInterface
*/
protected $cMemberAccount;

/**
* Team A entity to test.
*
* @var \Drupal\apigee_edge_teams\Entity\TeamInterface
*/
protected $teamA;

/**
* Team B entity to test.
*
* @var \Drupal\apigee_edge_teams\Entity\TeamInterface
*/
protected $teamB;

/**
* A role.
*
* @var \Drupal\user\Entity\Role
*/
protected $customRole;

/**
* {@inheritdoc}
*/
protected function setUp(): void {
parent::setUp();

$this->storeToken();
$this->addApigeexOrganizationMatchedResponse();

$this->teamStorage = $this->entityTypeManager->getStorage('team');

$config_factory = \Drupal::configFactory();
$config = $config_factory->getEditable('apigee_edge_teams.team_settings');
$config->set('cache_expiration', 300);
$config->save(TRUE);

// Create accounts: user 1, for members of two teams, and an extra one.
$this->account = $this->rootUser;
$this->aMemberAccount = $this->createNewAccount();
$this->bMemberAccount = $this->createNewAccount();
$this->cMemberAccount = $this->createNewAccount();

$this->customRole = $this->drupalCreateRole(['view any team']);

// Create teams.
$this->teamA = $this->createApigeexTeam();
$this->teamB = $this->createApigeexTeam();

// Add accounts to teams.
$this->addUserToXteam($this->teamA, $this->aMemberAccount);
$this->addUserToXteam($this->teamB, $this->bMemberAccount);
}

/**
* {@inheritdoc}
*/
protected function tearDown(): void {
parent::tearDown();

try {
$this->teamStorage->delete([$this->teamA, $this->teamB]);
$this->account->delete();
$this->aMemberAccount->delete();
$this->bMemberAccount->delete();
$this->cMemberAccount->delete();
}
catch (\Error $error) {
// Do nothing.
}
catch (\Exception $exception) {
// Do nothing.
}
}

/**
* Tests team list cache.
*/
public function testTeamListCache() {
$appgroups = [
$this->teamA->decorated(),
$this->teamB->decorated(),
];

// aMemberAccount should only see teamA.
$this->drupalLogin($this->aMemberAccount);
$this->queueAppGroupsResponse($appgroups);

$this->queueDeveloperResponse($this->aMemberAccount, 200, ['appgroups' => [$this->teamA->id()]]);
$this->drupalGet(Url::fromRoute('entity.team.collection'));
$assert = $this->assertSession();
$assert->pageTextContains($this->teamA->label());
$assert->pageTextNotContains($this->teamB->label());
$this->drupalLogout();

// bMemberAccount should only see teamB.
$this->drupalLogin($this->bMemberAccount);
$this->queueAppGroupsResponse($appgroups);
$this->queueDeveloperResponse($this->bMemberAccount, 200, ['appgroups' => [$this->teamB->id()]]);
$this->drupalGet(Url::fromUserInput('/teams'));
$assert = $this->assertSession();
$assert->pageTextNotContains($this->teamA->label());
$assert->pageTextContains($this->teamB->label());
$this->drupalLogout();

// cMemberAccount should not see any teams.
$this->drupalLogin($this->cMemberAccount);
$this->queueAppGroupsResponse($appgroups);
$this->queueDeveloperResponse($this->cMemberAccount);
$this->queueDeveloperResponse($this->cMemberAccount);
$this->drupalGet(Url::fromUserInput('/teams'));
$assert = $this->assertSession();
$assert->pageTextNotContains($this->teamA->label());
$assert->pageTextNotContains($this->teamB->label());

// Give cMemberAccount permission to view all teams.
$this->cMemberAccount->addRole($this->customRole);
$this->cMemberAccount->save();

// cMemberAccount should see both teams now.
$this->queueAppGroupsResponse($appgroups);
$this->queueDeveloperResponse($this->cMemberAccount);
$this->drupalGet(Url::fromUserInput('/teams'));
$assert = $this->assertSession();
$assert->pageTextContains($this->teamA->label());
$assert->pageTextContains($this->teamB->label());
}

/**
* Helper function to create a random user account.
*
* @return \Drupal\Core\Entity\EntityInterface
* The user account.
*/
protected function createNewAccount() {
$this->disableUserPresave();
$account = $this->createAccount();

$fields = [
'email' => $account->getEmail(),
'userName' => $account->getAccountName(),
'firstName' => $this->getRandomGenerator()->word(8),
'lastName' => $this->getRandomGenerator()->word(8),
];

// Stack developer responses for "created" and "set active".
$this->queueDeveloperResponse($account, Response::HTTP_CREATED);
$this->stack->queueMockResponse('no_content');
$developer = Developer::create($fields);
$developer->save();

return $account;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
* Variables:
* - appgroup: The team (appgroup).
* - org_name: The org name.
* - members: The member email id.
*/
#}
{
Expand All @@ -21,7 +22,7 @@
"attributes": [
{
"name": "__apigee_reserved__developer_details",
"value": "[{\"developer\":\"doe@example.com\",\"roles\":[\"admin\"]}]"
"value": "[{\"developer\":\"{{ members|default('foo@example.com') }}\",\"roles\":[\"admin\"]}]"
}
],
"createdAt": 1506959878351,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -271,15 +271,17 @@ protected function queueCompanyResponse(Company $company, $response_code = NULL)
*
* @param \Apigee\Edge\Api\ApigeeX\Entity\AppGroup $appgroup
* The appgroup to get properties from.
* @param string|null $developer
* Member email.
* @param string|null $response_code
* Add a response code to override the default.
*/
protected function queueAppGroupResponse(AppGroup $appgroup, $response_code = NULL) {
protected function queueAppGroupResponse(AppGroup $appgroup, $developer = NULL, $response_code = NULL) {
$context = empty($response_code) ? [] : ['status_code' => $response_code];

$context['appgroup'] = $appgroup;
$context['org_name'] = $this->sdkConnector->getOrganization();

$context['members'] = $developer;
$this->stack->queueMockResponse(['appgroup' => $context]);
}

Expand Down Expand Up @@ -428,6 +430,47 @@ public function addUserToTeam(TeamInterface $team, UserInterface $user) {
return $this->entityTypeManager->getStorage('developer')->load($user->getEmail());
}

/**
* Adds a user to a X team.
*
* Adding a team to a user will add the team as long as the developer entity
* is loaded from cache.
*
* @param \Drupal\apigee_edge_teams\Entity\TeamInterface $team
* The team.
* @param \Drupal\user\UserInterface $user
* A drupal user.
*
* @return \Drupal\apigee_edge\Entity\DeveloperInterface
* The developer entity.
*/
public function addUserToXteam(TeamInterface $team, UserInterface $user) {
$this->queueDevsInCompanyResponse([
['email' => $user->getEmail()],
]);
$this->queueAppGroupResponse($team->decorated(), $user->getEmail());
$this->queueAppGroupResponse($team->decorated(), $user->getEmail());

/** @var \Drupal\apigee_edge_teams\Entity\TeamMemberRoleInterface $team_member_roles */
$team_member_role_storage = \Drupal::entityTypeManager()->getStorage('team_member_role');
$team_member_role_storage->addTeamRoles($user, $team, ['admin']);
$team_member_roles = $team_member_role_storage->loadByDeveloperAndTeam($user, $team);
$team_member_roles->save();

$this->queueDevsInCompanyResponse([
['email' => $user->getEmail()],
]);
$teamMembershipManager = \Drupal::service('apigee_edge_teams.team_membership_manager');
$this->queueAppGroupResponse($team->decorated(), $user->getEmail());
$teamMembershipManager->addMembers($team->id(), [$user->getEmail() => ['admin']]);

$this->queueDeveloperResponse($user, 200, [
'appgroups' => [$team->id()],
]);

return $this->entityTypeManager->getStorage('developer')->load($user->getEmail());
}

/**
* Helper to add Edge entity response to stack.
*
Expand Down

0 comments on commit 1b692f7

Please sign in to comment.