FOSSology  4.7.1
Open Source License Compliance by Open Source Software
GroupControllerTest.php
Go to the documentation of this file.
1 <?php
2 /*
3  * SPDX-FileCopyrightText: © 2022 Samuel Dushimimana <dushsam100@gmail.com>
4  *
5  * SPDX-License-Identifier: GPL-2.0-only
6 */
13 
14 require_once dirname(__DIR__, 4) . '/lib/php/Plugin/FO_Plugin.php';
15 
16 
33 use Mockery as M;
34 use Slim\Psr7\Factory\StreamFactory;
35 use Slim\Psr7\Headers;
36 use Slim\Psr7\Request;
37 use Slim\Psr7\Uri;
38 
39 
44 class GroupControllerTest extends \PHPUnit\Framework\TestCase
45 {
46 
51  const YAML_LOC = __DIR__ . '/../../../ui/api/documentation/openapi.yaml';
52 
58 
63  private $dbHelper;
64 
69  private $restHelper;
70 
75  private $adminPlugin;
76 
82 
87  protected function setUp() : void
88  {
89  global $container;
90  $container = M::mock('ContainerBuilder');
91  $this->dbHelper = M::mock(DbHelper::class);
92  $this->restHelper = M::mock(RestHelper::class);
93  $this->userDao = M::mock(UserDao::class);
94  $this->adminPlugin = M::mock('AdminGroupUsers');
95  $this->adminEditPlugin = M::mock('AdminGroupEdit');
96 
97  $this->restHelper->shouldReceive('getDbHelper')->andReturn($this->dbHelper);
98  $this->restHelper->shouldReceive('getUserDao')
99  ->andReturn($this->userDao);
100 
101  $this->restHelper->shouldReceive('getPlugin')
102  ->withArgs(array('group_manage_users'))->andReturn($this->adminPlugin);
103 
104  $this->restHelper->shouldReceive('getPlugin')
105  ->withArgs(array('group_edit'))->andReturn($this->adminEditPlugin);
106 
107  $container->shouldReceive('get')->withArgs(array(
108  'helper.restHelper'))->andReturn($this->restHelper);
109  $this->groupController = new GroupController($container);
110  $this->assertCountBefore = \Hamcrest\MatcherAssert::getCount();
111  $this->dbManager = M::mock(DbManager::class);
112  $this->dbHelper->shouldReceive('getDbManager')->andReturn($this->dbManager);
113  $this->streamFactory = new StreamFactory();
114  }
115 
116 
121  protected function tearDown() : void
122  {
123  $this->addToAssertionCount(
124  \Hamcrest\MatcherAssert::getCount() - $this->assertCountBefore);
125  M::close();
126  }
127 
134  private function getResponseJson($response)
135  {
136  $response->getBody()->seek(0);
137  return json_decode($response->getBody()->getContents(), true);
138  }
139 
145  private function getGroupMembers($userIds)
146  {
147  $groupPermissions = array("NONE" => -1, UserDao::USER => 0,
148  UserDao::ADMIN => 1, UserDao::ADVISOR => 2);
149 
150  $memberList = array();
151  foreach ($userIds as $userId) {
152  $key = array_rand($groupPermissions);
153  $userGroupMember = new UserGroupMember(new User($userId, "user$userId", "User $userId",
154  null, null, null, null, null),$groupPermissions[$key]) ;
155  $memberList[] = $userGroupMember->getArray();
156  }
157  return $memberList;
158  }
159 
165  private function getUsersWithGroup($userIds)
166  {
167  $groupPermissions = array("NONE" => -1, UserDao::USER => 0,
168  UserDao::ADMIN => 1, UserDao::ADVISOR => 2);
169 
170  $usersWithGroup = array();
171  foreach ($userIds as $userId) {
172  $perm = array_rand($groupPermissions);
173  $user = [
174  "user_pk" => $userId,
175  "group_perm"=> $perm,
176  "user_name" => $userId."username",
177  "user_desc" => $userId."desc",
178  "user_status"=> 'active'
179  ];
180  $usersWithGroup[] = $user;
181  }
182  return $usersWithGroup;
183  }
189  public function testCreateGroupV1()
190  {
191  $this->testCreateGroup(ApiVersion::V1);
192  }
198  public function testCreateGroupV2()
199  {
200  $this->testCreateGroup();
201  }
206  private function testCreateGroup($version = ApiVersion::V2)
207  {
208  $groupName = 'fossyGroup';
209  $groupId = 4;
210  $userId = 1;
211 
212  $this->restHelper->shouldReceive('getUserId')->andReturn($userId);
213  $this->userDao->shouldReceive('addGroup')->withArgs([$groupName])
214  ->andReturn($groupId);
215  $this->userDao->shouldReceive('addGroupMembership')
216  ->withArgs([$groupId, $userId]);
217 
218  $requestHeaders = new Headers();
219  if ($version == ApiVersion::V2) {
220  $request = new Request("POST",
221  new Uri("HTTP", "localhost", null, "/groups", "name=" . $groupName),
222  $requestHeaders, [], [], $this->streamFactory->createStream());
223  } else {
224  $requestHeaders->setHeader('name', $groupName);
225  $request = new Request("POST", new Uri("HTTP", "localhost"),
226  $requestHeaders, [], [], $this->streamFactory->createStream());
227  }
228  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME, $version);
229 
230  $expectedCode = $version == ApiVersion::V2 ? 201 : 200;
231  $expectedResponse = new Info($expectedCode,
232  "Group $groupName added.", InfoType::INFO);
233 
234  $actualResponse = $this->groupController->createGroup($request,
235  new ResponseHelper(), []);
236 
237  $this->assertEquals($expectedResponse->getCode(),
238  $actualResponse->getStatusCode());
239  $this->assertEquals($expectedResponse->getArray(),
240  $this->getResponseJson($actualResponse));
241  }
247  public function testDeleteGroupV1()
248  {
249  $this->testDeleteGroup(ApiVersion::V1);
250  }
256  public function testDeleteGroupV2()
257  {
258  $this->testDeleteGroup();
259  }
264  private function testDeleteGroup($version = ApiVersion::V2)
265  {
266  $groupId = 4;
267  $userId = 1;
268  $userPk = 1;
269  $newUser = 2;
270  $request = M::mock(Request::class);
271  $userArray = ['user_pk' => $newUser];
272 
273  $_SESSION[Auth::USER_LEVEL] = Auth::PERM_WRITE;
274  if ($version == ApiVersion::V2) {
275  $this->restHelper->getUserDao()->shouldReceive('getGroupIdByName')->withArgs([$groupId])->andReturn($groupId);
276  $this->restHelper->getUserDao()->shouldReceive('getUserByName')->withArgs([$userPk])->andReturn($userArray);
277  }
278  $request->shouldReceive('getAttribute')->andReturn($version);
279  $this->restHelper->shouldReceive('getUserId')->andReturn($userId);
280  $this->dbHelper->shouldReceive('doesIdExist')
281  ->withArgs(["groups", "group_pk", $groupId])->andReturn(true);
282  $_SESSION[Auth::USER_LEVEL] = Auth::PERM_WRITE;
283  $this->userDao->shouldReceive('getDeletableAdminGroupMap')->withArgs([$userId,$_SESSION[Auth::USER_LEVEL]]);
284  $this->userDao->shouldReceive('deleteGroup')->withArgs([$groupId]);
285 
286  $info = new Info(202, "User Group will be deleted", InfoType::INFO);
287  $expectedResponse = (new ResponseHelper())->withJson($info->getArray(),
288  $info->getCode());
289  $actualResponse = $this->groupController->deleteGroup($request, new ResponseHelper(),
290  ['pathParam' => $groupId]);
291 
292  $this->assertEquals($expectedResponse->getStatusCode(),
293  $actualResponse->getStatusCode());
294  $this->assertEquals($this->getResponseJson($expectedResponse),
295  $this->getResponseJson($actualResponse));
296  }
302  public function testUpdateGroupV1()
303  {
304  $this->testUpdateGroup(ApiVersion::V1);
305  }
311  public function testUpdateGroupV2()
312  {
313  $this->testUpdateGroup();
314  }
319  private function testUpdateGroup($version = ApiVersion::V2)
320  {
321  $groupId = 4;
322  $groupName = 'fossyGroup';
323  $newGroupName = 'newFossyGroup';
324  $userId = 1;
325 
326  $_SESSION[Auth::USER_LEVEL] = Auth::PERM_ADMIN;
327  if ($version == ApiVersion::V2) {
328  $this->userDao->shouldReceive('getGroupIdByName')
329  ->withArgs([$groupName])->andReturn($groupId);
330  }
331  $this->adminEditPlugin->shouldReceive('validateGroupName')
332  ->withArgs([$newGroupName])->andReturn("");
333  $this->restHelper->shouldReceive('getUserId')->andReturn($userId);
334  $this->dbHelper->shouldReceive('doesIdExist')
335  ->withArgs(["groups", "group_pk", $groupId])->andReturn(true);
336  $this->userDao->shouldReceive('getDeletableAdminGroupMap')
337  ->withArgs([$userId, $_SESSION[Auth::USER_LEVEL]])
338  ->andReturn([$groupId => $groupName]);
339  $this->userDao->shouldReceive('editGroup')
340  ->withArgs([$groupId, $newGroupName]);
341 
342  $request = $this->getUpdateGroupRequest($newGroupName, $version);
343  $pathParam = $version == ApiVersion::V2 ? $groupName : $groupId;
344 
345  $expectedResponse = new Info(200, "Group $newGroupName updated.",
346  InfoType::INFO);
347  $actualResponse = $this->groupController->updateGroup($request,
348  new ResponseHelper(), ['pathParam' => $pathParam]);
349 
350  $this->assertEquals($expectedResponse->getCode(),
351  $actualResponse->getStatusCode());
352  $this->assertEquals($expectedResponse->getArray(),
353  $this->getResponseJson($actualResponse));
354  }
355 
362  {
363  $request = $this->getUpdateGroupRequest(" ");
364 
365  $this->expectException(HttpBadRequestException::class);
366  $this->groupController->updateGroup($request, new ResponseHelper(),
367  ['pathParam' => 'fossyGroup']);
368  }
369 
376  {
377  $newGroupName = '123';
378  $this->adminEditPlugin->shouldReceive('validateGroupName')
379  ->withArgs([$newGroupName])
380  ->andReturn("Invalid: Group name cannot be numeric-only");
381 
382  $request = $this->getUpdateGroupRequest($newGroupName);
383 
384  $this->expectException(HttpBadRequestException::class);
385  $this->groupController->updateGroup($request, new ResponseHelper(),
386  ['pathParam' => 'fossyGroup']);
387  }
388 
394  public function testUpdateGroupNotFoundV2()
395  {
396  $groupName = 'fossyGroup';
397  $newGroupName = 'newFossyGroup';
398 
399  $this->userDao->shouldReceive('getGroupIdByName')
400  ->withArgs([$groupName])->andReturn(null);
401  $this->adminEditPlugin->shouldReceive('validateGroupName')
402  ->withArgs([$newGroupName])->andReturn("");
403  $this->dbHelper->shouldReceive('doesIdExist')
404  ->withArgs(["groups", "group_pk", 0])->andReturn(false);
405 
406  $request = $this->getUpdateGroupRequest($newGroupName);
407 
408  $this->expectException(HttpNotFoundException::class);
409  $this->groupController->updateGroup($request, new ResponseHelper(),
410  ['pathParam' => $groupName]);
411  }
412 
419  {
420  $groupId = 4;
421  $groupName = 'fossyGroup';
422  $newGroupName = 'newFossyGroup';
423  $userId = 1;
424 
425  $_SESSION[Auth::USER_LEVEL] = Auth::PERM_WRITE;
426  $this->userDao->shouldReceive('getGroupIdByName')
427  ->withArgs([$groupName])->andReturn($groupId);
428  $this->adminEditPlugin->shouldReceive('validateGroupName')
429  ->withArgs([$newGroupName])->andReturn("");
430  $this->restHelper->shouldReceive('getUserId')->andReturn($userId);
431  $this->dbHelper->shouldReceive('doesIdExist')
432  ->withArgs(["groups", "group_pk", $groupId])->andReturn(true);
433  $this->userDao->shouldReceive('getDeletableAdminGroupMap')
434  ->withArgs([$userId, $_SESSION[Auth::USER_LEVEL]])->andReturn([]);
435 
436  $request = $this->getUpdateGroupRequest($newGroupName);
437 
438  $this->expectException(HttpForbiddenException::class);
439  $this->groupController->updateGroup($request, new ResponseHelper(),
440  ['pathParam' => $groupName]);
441  }
442 
449  {
450  $groupId = 4;
451  $groupName = 'fossyGroup';
452  $newGroupName = 'newFossyGroup';
453  $userId = 1;
454 
455  $_SESSION[Auth::USER_LEVEL] = Auth::PERM_ADMIN;
456  $this->userDao->shouldReceive('getGroupIdByName')
457  ->withArgs([$groupName])->andReturn($groupId);
458  $this->adminEditPlugin->shouldReceive('validateGroupName')
459  ->withArgs([$newGroupName])->andReturn("");
460  $this->restHelper->shouldReceive('getUserId')->andReturn($userId);
461  $this->dbHelper->shouldReceive('doesIdExist')
462  ->withArgs(["groups", "group_pk", $groupId])->andReturn(true);
463  $this->userDao->shouldReceive('getDeletableAdminGroupMap')
464  ->withArgs([$userId, $_SESSION[Auth::USER_LEVEL]])
465  ->andReturn([$groupId => $groupName]);
466  $this->userDao->shouldReceive('editGroup')
467  ->withArgs([$groupId, $newGroupName])
468  ->andThrow(new \Exception("Group exists."));
469 
470  $request = $this->getUpdateGroupRequest($newGroupName);
471 
472  $this->expectException(HttpConflictException::class);
473  $this->groupController->updateGroup($request, new ResponseHelper(),
474  ['pathParam' => $groupName]);
475  }
476 
483  private function getUpdateGroupRequest($newGroupName,
484  $version = ApiVersion::V2)
485  {
486  $body = $this->streamFactory->createStream(json_encode([
487  "name" => $newGroupName
488  ]));
489  $requestHeaders = new Headers();
490  $requestHeaders->setHeader('Content-Type', 'application/json');
491  $request = new Request("PUT", new Uri("HTTP", "localhost"),
492  $requestHeaders, [], [], $body);
493  return $request->withAttribute(ApiVersion::ATTRIBUTE_NAME, $version);
494  }
495 
501  public function testGetDeletableGroupsV1()
502  {
503  $this->testGetDeletableGroups(ApiVersion::V1);
504  }
510  public function testGetDeletableGroupsV2()
511  {
512  $this->testGetDeletableGroups();
513  }
518  private function testGetDeletableGroups($version = ApiVersion::V2)
519  {
520  $userId = 2;
521  $groupList = array();
522  $this->restHelper->shouldReceive('getUserId')->andReturn($userId);
523  $_SESSION[Auth::USER_LEVEL] = Auth::PERM_WRITE;
524  $this->userDao->shouldReceive('getDeletableAdminGroupMap')->withArgs([$userId,
525  $_SESSION[Auth::USER_LEVEL]])->andReturn([]);
526  $expectedResponse = (new ResponseHelper())->withJson($groupList, 200);
527  $actualResponse = $this->groupController->getDeletableGroups(null, new ResponseHelper(), []);
528  $this->assertEquals($expectedResponse->getStatusCode(), $actualResponse->getStatusCode());
529  $this->assertEquals($this->getResponseJson($expectedResponse), $this->getResponseJson($actualResponse));
530  }
536  public function testGetGroupMembersV2()
537  {
538  $this->testGetGroupMembers();
539  }
545  public function testGetGroupMembersV1()
546  {
547  $this->testGetGroupMembers(APiVersion::V1);
548  }
553  private function testGetGroupMembers($version = ApiVersion::V2)
554  {
555  $userIds = [2];
556  $groupId = 1;
557  $newuser = 3;
558  $userPk = 2;
559  $memberList = $this->getGroupMembers($userIds);
560  $request = M::mock(Request::class);
561  $groupIds = [1,2,3,4,5,6];
562  $userArray = ['user_pk' => $newuser];
563 
564  $_SESSION[Auth::USER_LEVEL] = Auth::PERM_WRITE;
565  if ($version == ApiVersion::V2) {
566  $this->restHelper->getUserDao()->shouldReceive('getGroupIdByName')->withArgs([$groupIds[0]])->andReturn($groupIds[0]);
567  $this->restHelper->getUserDao()->shouldReceive('getUserByName')->withArgs([$userPk])->andReturn($userArray);
568  }
569  $request->shouldReceive('getAttribute')->andReturn($version);
570  $this->restHelper->shouldReceive('getUserId')->andReturn($userIds[0]);
571  $this->dbHelper->shouldReceive('doesIdExist')
572  ->withArgs(["groups", "group_pk", $groupId])->andReturn(true);
573  $this->userDao->shouldReceive('isAdvisorOrAdmin')
574  ->withArgs([$userIds[0], $groupId])->andReturn(true);
575 
576  $this->dbManager->shouldReceive('prepare')->withArgs([M::any(),M::any()]);
577  $this->dbManager->shouldReceive('execute')->withArgs([M::any(),array($groupId)])->andReturn(1);
578  $this->dbManager->shouldReceive('fetchAll')->withArgs([1])->andReturn($this->getUsersWithGroup($userIds));
579  $this->dbManager->shouldReceive('freeResult')->withArgs([1]);
580 
581  $user = $this->getUsersWithGroup($userIds)[0];
582  $users = [];
583  $users[] = new User($user["user_pk"], $user["user_name"], $user["user_desc"],
584  null, null, null, null, null);
585  $this->dbHelper->shouldReceive("getUsers")->withArgs([$user['user_pk']])->andReturn($users);
586 
587  $expectedResponse = (new ResponseHelper())->withJson($memberList, 200);
588 
589  $actualResponse = $this->groupController->getGroupMembers($request, new ResponseHelper(), ['pathParam' => $groupId]);
590  $this->assertEquals($expectedResponse->getStatusCode(),$actualResponse->getStatusCode());
591  }
592 
600  {
601  $groupId = 4;
602  $userId = 1;
603 
604  $_SESSION[Auth::USER_LEVEL] = Auth::PERM_WRITE;
605  $this->restHelper->shouldReceive('getUserId')->andReturn($userId);
606  $this->dbHelper->shouldReceive('doesIdExist')
607  ->withArgs(["groups", "group_pk", $groupId])->andReturn(true);
608  $this->userDao->shouldReceive('isAdvisorOrAdmin')
609  ->withArgs([$userId, $groupId])->andReturn(false);
610 
611  $requestHeaders = new Headers();
612  $request = new Request("GET", new Uri("HTTP", "localhost"),
613  $requestHeaders, [], [], $this->streamFactory->createStream());
614  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME, ApiVersion::V1);
615 
616  $this->expectException(HttpForbiddenException::class);
617  $this->groupController->getGroupMembers($request, new ResponseHelper(),
618  ['pathParam' => $groupId]);
619  }
620 
627  {
628  $groupId = 999;
629  $userId = 1;
630 
631  $_SESSION[Auth::USER_LEVEL] = Auth::PERM_WRITE;
632  $this->restHelper->shouldReceive('getUserId')->andReturn($userId);
633  $this->dbHelper->shouldReceive('doesIdExist')
634  ->withArgs(["groups", "group_pk", $groupId])->andReturn(false);
635  $this->userDao->shouldReceive('isAdvisorOrAdmin')
636  ->withArgs([$userId, $groupId])->andReturn(false);
637 
638  $requestHeaders = new Headers();
639  $request = new Request("GET", new Uri("HTTP", "localhost"),
640  $requestHeaders, [], [], $this->streamFactory->createStream());
641  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME, ApiVersion::V1);
642 
643  $this->expectException(HttpNotFoundException::class);
644  $this->groupController->getGroupMembers($request, new ResponseHelper(),
645  ['pathParam' => $groupId]);
646  }
647 
655  {
656  $userIds = [2];
657  $groupId = 1;
658  $callerId = 99;
659  $memberList = $this->getGroupMembers($userIds);
660 
661  $_SESSION[Auth::USER_LEVEL] = Auth::PERM_ADMIN;
662  $this->restHelper->shouldReceive('getUserId')->andReturn($callerId);
663  $this->dbHelper->shouldReceive('doesIdExist')
664  ->withArgs(["groups", "group_pk", $groupId])->andReturn(true);
665  $this->userDao->shouldReceive('isAdvisorOrAdmin')
666  ->withArgs([$callerId, $groupId])->andReturn(false);
667 
668  $this->dbManager->shouldReceive('prepare')->withArgs([M::any(),M::any()]);
669  $this->dbManager->shouldReceive('execute')->withArgs([M::any(),array($groupId)])->andReturn(1);
670  $this->dbManager->shouldReceive('fetchAll')->withArgs([1])->andReturn($this->getUsersWithGroup($userIds));
671  $this->dbManager->shouldReceive('freeResult')->withArgs([1]);
672 
673  $user = $this->getUsersWithGroup($userIds)[0];
674  $users = [];
675  $users[] = new User($user["user_pk"], $user["user_name"], $user["user_desc"],
676  null, null, null, null, null);
677  $this->dbHelper->shouldReceive("getUsers")->withArgs([$user['user_pk']])->andReturn($users);
678 
679  $requestHeaders = new Headers();
680  $request = new Request("GET", new Uri("HTTP", "localhost"),
681  $requestHeaders, [], [], $this->streamFactory->createStream());
682  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME, ApiVersion::V1);
683 
684  $expectedResponse = (new ResponseHelper())->withJson($memberList, 200);
685  $actualResponse = $this->groupController->getGroupMembers($request,
686  new ResponseHelper(), ['pathParam' => $groupId]);
687  $this->assertEquals($expectedResponse->getStatusCode(),
688  $actualResponse->getStatusCode());
689  }
690 
700  {
701  $this->testAddMemberUserNotMember(ApiVersion::V1);
702  }
712  {
714  }
719  public function testAddMemberUserNotMember($version = ApiVersion::V2)
720  {
721  $groupId = 1;
722  $newuser = 1;
723  $newPerm = 2;
724  $emptyArr=[];
725  $groupIds = [1,2,3,4,5,6];
726  $userArray = ['user_pk' => $newuser];
727  $userId = 1;
728 
729  $_SESSION[Auth::USER_LEVEL] = Auth::PERM_ADMIN;
730  if ($version == ApiVersion::V2) {
731  $this->restHelper->getUserDao()->shouldReceive('getGroupIdByName')->withArgs([$groupIds[0]])->andReturn($groupId);
732  $this->restHelper->getUserDao()->shouldReceive('getUserByName')->withArgs([$userId])->andReturn($userArray);
733  }
734  $this->dbHelper->shouldReceive('doesIdExist')->withArgs(["groups", "group_pk", $groupId])->andReturn(true);
735  $this->dbHelper->shouldReceive('doesIdExist')->withArgs(["users","user_pk",$newuser])->andReturn(true);
736  $this->dbManager->shouldReceive('getSingleRow')->withArgs([M::any(),M::any(),M::any()])->andReturn($emptyArr);
737  $this->restHelper->shouldReceive('getUserId')->andReturn($userId);
738  $this->userDao->shouldReceive('isAdvisorOrAdmin')->withArgs([$userId, $groupId])->andReturn(true);
739 
740  $this->dbManager->shouldReceive('prepare')->withArgs([M::any(),M::any()]);
741  $this->dbManager->shouldReceive('execute')->withArgs([M::any(),array($groupId, $newuser,$newPerm)])->andReturn(1);
742  $this->dbManager->shouldReceive('freeResult')->withArgs([1]);
743 
744  $body = $this->streamFactory->createStream(json_encode([
745  "perm" => $newPerm
746  ]));
747  $requestHeaders = new Headers();
748  $requestHeaders->setHeader('Content-Type', 'application/json');
749  $request = new Request("POST", new Uri("HTTP", "localhost"),
750  $requestHeaders, [], [], $body);
751  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME,$version);
752  $expectedResponse = new Info(201, "User added to group.", InfoType::INFO);
753 
754  $actualResponse = $this->groupController->addMember($request, new ResponseHelper(), ['pathParam' => $groupId,'userPathParam' => $newuser]);
755  $this->assertEquals($expectedResponse->getCode(),$actualResponse->getStatusCode());
756  $this->assertEquals($expectedResponse->getArray(),$this->getResponseJson($actualResponse));
757  }
764  public function testAddMemberUserNotAdminV2()
765  {
766  $this->testAddMemberUserNotAdmin();
767  }
774  public function testAddMemberUserNotAdminV1()
775  {
776  $this->testAddMemberUserNotAdmin(ApiVersion::V1);
777  }
782  private function testAddMemberUserNotAdmin($version = ApiVersion::V2)
783  {
784  $groupId = 1;
785  $newuser = 1;
786  $newPerm = 2;
787  $groupIds = [1,2,3,4,5,6];
788  $userArray = ['user_pk' => $newuser];
789  $userId = 1;
790 
791  $_SESSION[Auth::USER_LEVEL] = Auth::PERM_WRITE;
792  if ($version == ApiVersion::V2) {
793  $this->restHelper->getUserDao()->shouldReceive('getGroupIdByName')->withArgs([$groupIds[0]])->andReturn($groupId);
794  $this->restHelper->getUserDao()->shouldReceive('getUserByName')->withArgs([$userId])->andReturn($userArray);
795  }
796  $this->dbHelper->shouldReceive('doesIdExist')->withArgs(["groups", "group_pk", $groupId])->andReturn(true);
797  $this->dbHelper->shouldReceive('doesIdExist')->withArgs(["users","user_pk",$newuser])->andReturn(true);
798  $this->restHelper->shouldReceive('getUserId')->andReturn($userId);
799  $this->userDao->shouldReceive('isAdvisorOrAdmin')->withArgs([$userId, $groupId])->andReturn(false);
800 
801  $body = $this->streamFactory->createStream(json_encode([
802  "perm" => $newPerm
803  ]));
804  $requestHeaders = new Headers();
805  $requestHeaders->setHeader('Content-Type', 'application/json');
806  $request = new Request("POST", new Uri("HTTP", "localhost"),
807  $requestHeaders, [], [], $body);
808  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME,$version);
809  $this->expectException(HttpForbiddenException::class);
810 
811  $this->groupController->addMember($request, new ResponseHelper(),
812  ['pathParam' => $groupId,'userPathParam' => $newuser]);
813  }
814 
822  {
823  $this->testAddMemberUserGroupAdmin(ApiVersion::V1);
824  }
832  {
833  $this->testAddMemberUserGroupAdmin();
834  }
835  private function testAddMemberUserGroupAdmin($version = ApiVersion::V2)
836  {
837  $groupId = 1;
838  $newuser = 1;
839  $newPerm = 2;
840  $emptyArr=[];
841  $groupIds = [1,2,3,4,5,6];
842  $userArray = ['user_pk' => $newuser];
843  $userId = 1;
844 
845  $_SESSION[Auth::USER_LEVEL] = Auth::PERM_WRITE;
846  if ($version == ApiVersion::V2) {
847  $this->restHelper->getUserDao()->shouldReceive('getGroupIdByName')->withArgs([$groupIds[0]])->andReturn($groupId);
848  $this->restHelper->getUserDao()->shouldReceive('getUserByName')->withArgs([$userId])->andReturn($userArray);
849  }
850  $this->dbHelper->shouldReceive('doesIdExist')->withArgs(["groups", "group_pk", $groupId])->andReturn(true);
851  $this->dbHelper->shouldReceive('doesIdExist')->withArgs(["users","user_pk",$newuser])->andReturn(true);
852  $this->dbManager->shouldReceive('getSingleRow')->withArgs([M::any(),M::any(),M::any()])->andReturn($emptyArr);
853  $this->restHelper->shouldReceive('getUserId')->andReturn($userId);
854  $this->userDao->shouldReceive('isAdvisorOrAdmin')->withArgs([$userId, $groupId])->andReturn(true);
855 
856  $this->dbManager->shouldReceive('prepare')->withArgs([M::any(),M::any()]);
857  $this->dbManager->shouldReceive('execute')->withArgs([M::any(),array($groupId, $newuser,$newPerm)])->andReturn(1);
858  $this->dbManager->shouldReceive('freeResult')->withArgs([1]);
859 
860  $body = $this->streamFactory->createStream(json_encode([
861  "perm" => $newPerm
862  ]));
863  $requestHeaders = new Headers();
864  $requestHeaders->setHeader('Content-Type', 'application/json');
865  $request = new Request("POST", new Uri("HTTP", "localhost"),
866  $requestHeaders, [], [], $body);
867  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME,$version);
868  $expectedResponse = new Info(201, "User added to group.", InfoType::INFO);
869 
870  $actualResponse = $this->groupController->addMember($request, new ResponseHelper(), ['pathParam' => $groupId,'userPathParam' => $newuser]);
871  $this->assertEquals($expectedResponse->getCode(),$actualResponse->getStatusCode());
872  $this->assertEquals($expectedResponse->getArray(),$this->getResponseJson($actualResponse));
873  }
874 
884  {
886  }
896  {
897  $this->testAddMemberUserAlreadyMember(ApiVersion::V1);
898  }
899 
904  private function testAddMemberUserAlreadyMember($version = ApiVersion::V2)
905  {
906  $groupId = 1;
907  $newuser = 1;
908  $newPerm = 2;
909  $groupIds = [1,2,3,4,5,6];
910  $userArray = ['user_pk' => $newuser];
911  $userId = 1;
912 
913  $_SESSION[Auth::USER_LEVEL] = Auth::PERM_ADMIN;
914  if ($version == ApiVersion::V2) {
915  $this->restHelper->getUserDao()->shouldReceive('getGroupIdByName')->withArgs([$groupIds[0]])->andReturn($groupId);
916  $this->restHelper->getUserDao()->shouldReceive('getUserByName')->withArgs([$userId])->andReturn($userArray);
917  }
918  $this->dbHelper->shouldReceive('doesIdExist')->withArgs(["groups", "group_pk", $groupId])->andReturn(true);
919  $this->dbHelper->shouldReceive('doesIdExist')->withArgs(["users","user_pk",$newuser])->andReturn(true);
920  $this->dbManager->shouldReceive('getSingleRow')->withArgs([M::any(),M::any(),M::any()])->andReturn(true);
921  $this->restHelper->shouldReceive('getUserId')->andReturn($userId);
922  $this->userDao->shouldReceive('isAdvisorOrAdmin')->withArgs([$userId, $groupId])->andReturn(true);
923 
924  $body = $this->streamFactory->createStream(json_encode([
925  "perm" => $newPerm
926  ]));
927  $requestHeaders = new Headers();
928  $requestHeaders->setHeader('Content-Type', 'application/json');
929  $request = new Request("POST", new Uri("HTTP", "localhost"),
930  $requestHeaders, [], [], $body);
931  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME,$version);
932  $this->expectException(HttpBadRequestException::class);
933 
934  $this->groupController->addMember($request, new ResponseHelper(),
935  ['pathParam' => $groupId,'userPathParam' => $newuser]);
936  }
937 
943  public function testChangeUserPermissionV2()
944  {
945  $this->testChangeUserPermission();
946  }
952  public function testChangeUserPermissionV1()
953  {
954  $this->testChangeUserPermission(ApiVersion::V1);
955  }
960  private function testChangeUserPermission($version = ApiVersion::V2)
961  {
962  $group_user_member_pk = 1;
963  $newPerm = 2;
964  $userPk = 1;
965  $groupId = 1;
966  $groupIds = [1,2,3,4,5,6];
967  $userArray = ['user_pk' => $userPk];
968  $userId = 1;
969 
970  $_SESSION[Auth::USER_LEVEL] = Auth::PERM_ADMIN;
971  if ($version == ApiVersion::V2) {
972  $this->restHelper->getUserDao()->shouldReceive('getGroupIdByName')->withArgs([$groupIds[0]])->andReturn($groupId);
973  $this->restHelper->getUserDao()->shouldReceive('getUserByName')->withArgs([$userId])->andReturn($userArray);
974  }
975  $this->dbHelper->shouldReceive('doesIdExist')->withArgs(["groups", "group_pk", $groupIds[0]])->andReturn(true);
976  $this->dbHelper->shouldReceive('doesIdExist')->withArgs(["users","user_pk",$userPk])->andReturn(true);
977  $this->dbManager->shouldReceive('getSingleRow')->withArgs([M::any(),M::any(),M::any()])->andReturn(['group_pk'=>$groupIds[0],'group_user_member_pk'=>$group_user_member_pk,'permission'=>$newPerm]);
978  $this->restHelper->shouldReceive('getUserId')->andReturn($userId);
979  $this->userDao->shouldReceive('isAdvisorOrAdmin')->withArgs([$userPk, $groupIds[0]])->andReturn(true);
980  $this->userDao->shouldReceive('getUserByName')->withArgs([M::any(),M::any()]);
981 
982  $this->adminPlugin->shouldReceive('updateGUMPermission')->withArgs([$group_user_member_pk,$newPerm, $this->dbManager ]);
983 
984  $body = $this->streamFactory->createStream(json_encode([
985  "perm" => $newPerm
986  ]));
987  $requestHeaders = new Headers();
988  $requestHeaders->setHeader('Content-Type', 'application/json');
989  $request = new Request("POST", new Uri("HTTP", "localhost"),
990  $requestHeaders, [], [], $body);
991  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME,$version);
992  $expectedResponse = new Info(202, "Permission updated successfully.", InfoType::INFO);
993 
994  $actualResponse = $this->groupController->changeUserPermission($request, new ResponseHelper(), ['pathParam' => $groupIds[0],'userPathParam' => $userId]);
995  $this->assertEquals($expectedResponse->getCode(),$actualResponse->getStatusCode());
996  $this->assertEquals($expectedResponse->getArray(),$this->getResponseJson($actualResponse));
997  }
998 
1005  {
1007  }
1008 
1015  {
1016  $this->testDeleteGroupMemberSuccess(ApiVersion::V1);
1017  }
1018 
1022  private function testDeleteGroupMemberSuccess($version = ApiVersion::V2)
1023  {
1024  $groupId = 1;
1025  $userId = 2;
1026  $groupMemberPk = 5;
1027  $userArray = ['user_pk' => $userId];
1028 
1029  $_SESSION[Auth::USER_LEVEL] = Auth::PERM_ADMIN;
1030  if ($version == ApiVersion::V2) {
1031  $this->userDao->shouldReceive('getUserByName')
1032  ->withArgs([$userId])->andReturn($userArray);
1033  $this->userDao->shouldReceive('getGroupIdByName')
1034  ->withArgs([$groupId])->andReturn($groupId);
1035  }
1036  $this->restHelper->shouldReceive('getUserId')->andReturn(1);
1037  $this->dbHelper->shouldReceive('doesIdExist')
1038  ->withArgs(["groups", "group_pk", $groupId])->andReturn(true);
1039  $this->dbHelper->shouldReceive('doesIdExist')
1040  ->withArgs(["users", "user_pk", $userId])->andReturn(true);
1041  $this->userDao->shouldReceive('isAdvisorOrAdmin')->andReturn(true);
1042  $this->dbManager->shouldReceive('getSingleRow')->withArgs([M::any(), M::any(), M::any()])
1043  ->andReturn(['group_user_member_pk' => $groupMemberPk]);
1044  $this->adminPlugin->shouldReceive('updateGUMPermission')
1045  ->withArgs([$groupMemberPk, -1, $this->dbManager]);
1046 
1047  $requestHeaders = new Headers();
1048  $request = new Request("DELETE", new Uri("HTTP", "localhost"),
1049  $requestHeaders, [], [], $this->streamFactory->createStream());
1050  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME, $version);
1051 
1052  $expectedResponse = new Info(202, "User will be removed from group.", InfoType::INFO);
1053  $actualResponse = $this->groupController->deleteGroupMember($request,
1054  new ResponseHelper(), ['pathParam' => $groupId, 'userPathParam' => $userId]);
1055 
1056  $this->assertEquals($expectedResponse->getCode(), $actualResponse->getStatusCode());
1057  $this->assertEquals($expectedResponse->getArray(), $this->getResponseJson($actualResponse));
1058  }
1059 
1066  {
1067  $groupId = 1;
1068  $userId = 99;
1069 
1070  $_SESSION[Auth::USER_LEVEL] = Auth::PERM_ADMIN;
1071  $this->userDao->shouldReceive('getUserByName')
1072  ->withArgs([$userId])->andReturn(null);
1073 
1074  $requestHeaders = new Headers();
1075  $request = new Request("DELETE", new Uri("HTTP", "localhost"),
1076  $requestHeaders, [], [], $this->streamFactory->createStream());
1077  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME, ApiVersion::V2);
1078 
1079  $this->expectException(HttpNotFoundException::class);
1080  $this->groupController->deleteGroupMember($request,
1081  new ResponseHelper(), ['pathParam' => $groupId, 'userPathParam' => $userId]);
1082  }
1083 
1090  {
1091  $groupId = 1;
1092  $userId = 99;
1093  $newPerm = 1;
1094 
1095  $_SESSION[Auth::USER_LEVEL] = Auth::PERM_ADMIN;
1096  $this->userDao->shouldReceive('getUserByName')
1097  ->withArgs([$userId])->andReturn(null);
1098 
1099  $body = $this->streamFactory->createStream(json_encode(["perm" => $newPerm]));
1100  $requestHeaders = new Headers();
1101  $requestHeaders->setHeader('Content-Type', 'application/json');
1102  $request = new Request("POST", new Uri("HTTP", "localhost"),
1103  $requestHeaders, [], [], $body);
1104  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME, ApiVersion::V2);
1105 
1106  $this->expectException(HttpNotFoundException::class);
1107  $this->groupController->addMember($request,
1108  new ResponseHelper(), ['pathParam' => $groupId, 'userPathParam' => $userId]);
1109  }
1110 
1117  {
1118  $groupId = 1;
1119  $userId = 99;
1120  $newPerm = 1;
1121 
1122  $_SESSION[Auth::USER_LEVEL] = Auth::PERM_ADMIN;
1123  $this->userDao->shouldReceive('getUserByName')
1124  ->withArgs([$userId])->andReturn(null);
1125 
1126  $body = $this->streamFactory->createStream(json_encode(["perm" => $newPerm]));
1127  $requestHeaders = new Headers();
1128  $requestHeaders->setHeader('Content-Type', 'application/json');
1129  $request = new Request("PATCH", new Uri("HTTP", "localhost"),
1130  $requestHeaders, [], [], $body);
1131  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME, ApiVersion::V2);
1132 
1133  $this->expectException(HttpNotFoundException::class);
1134  $this->groupController->changeUserPermission($request,
1135  new ResponseHelper(), ['pathParam' => $groupId, 'userPathParam' => $userId]);
1136  }
1137 }
Contains the constants and helpers for authentication of user.
Definition: Auth.php:24
Provides helper methods to access database for REST api.
Definition: DbHelper.php:38
Override Slim response for withJson function.
Provides various DAO helper functions for REST api.
Definition: RestHelper.php:32
Different type of infos provided by REST.
Definition: InfoType.php:16
Info model to contain general error and return values.
Definition: Info.php:19
Model to hold user information.
Definition: User.php:21
getUpdateGroupRequest($newGroupName, $version=ApiVersion::V2)
fo_dbManager * dbManager
fo_dbManager object
Definition: process.c:16