FOSSology  4.7.1
Open Source License Compliance by Open Source Software
UserControllerTest.php
Go to the documentation of this file.
1 <?php
2 /*
3  SPDX-FileCopyrightText: © 2020 Siemens AG
4  Author: Gaurav Mishra <mishra.gaurav@siemens.com>
5 
6  SPDX-License-Identifier: GPL-2.0-only
7 */
14 
15 require_once dirname(__DIR__, 4) . '/lib/php/Plugin/FO_Plugin.php';
16 
20 use Mockery as M;
30 use Slim\Psr7\Request;
31 
36 class UserControllerTest extends \PHPUnit\Framework\TestCase
37 {
38 
44 
49  private $dbHelper;
50 
55  private $restHelper;
56 
61  protected function setUp() : void
62  {
63  global $container;
64  $container = M::mock('ContainerBuilder');
65  $this->dbHelper = M::mock(DbHelper::class);
66  $this->restHelper = M::mock(RestHelper::class);
67  $this->userDao = M::mock(UserDao::class);
68 
69  $this->restHelper->shouldReceive('getDbHelper')->andReturn($this->dbHelper);
70  $this->restHelper->shouldReceive('getUserDao')
71  ->andReturn($this->userDao);
72 
73  $container->shouldReceive('get')->withArgs(array(
74  'helper.restHelper'))->andReturn($this->restHelper);
75  $this->userController = new UserController($container);
76  $this->assertCountBefore = \Hamcrest\MatcherAssert::getCount();
78  }
79 
84  protected function tearDown() : void
85  {
86  $this->addToAssertionCount(
87  \Hamcrest\MatcherAssert::getCount() - $this->assertCountBefore);
88  M::close();
89  unset($_SESSION[Auth::USER_LEVEL]);
90  }
91 
98  private function getResponseJson($response)
99  {
100  $response->getBody()->seek(0);
101  return json_decode($response->getBody()->getContents(), true);
102  }
103 
109  private function getUsers($userIds)
110  {
111  $userArray = array();
112  foreach ($userIds as $userId) {
113  if ($userId == 2) {
114  $accessLevel = PLUGIN_DB_ADMIN;
115  } elseif ($userId > 2 && $userId <= 4) {
116  $accessLevel = PLUGIN_DB_WRITE;
117  } elseif ($userId == 5) {
118  $accessLevel = PLUGIN_DB_READ;
119  } else {
120  continue;
121  }
122  $user = new User($userId, "user$userId", "User $userId",
123  "user$userId@example.com", $accessLevel, 2, 4, "");
124  $userArray[] = $user;
125  }
126  return $userArray;
127  }
128 
134  public function testGetSpecificUserV1()
135  {
136  $this->testGetSpecificUser(ApiVersion::V1);
137  }
143  public function testGetSpecificUserV2()
144  {
145  $this->testGetSpecificUser();
146  }
151  private function testGetSpecificUser($version = ApiVersion::V2)
152  {
153  $userId = 2;
154  $userName = 'fossy';
155  $userArray = ['user_pk' => $userId];
156  $user = $this->getUsers([$userId]);
157  if ($version == ApiVersion::V2) {
158  $userArray = ['user_pk' => $userId];
159  $this->restHelper->getUserDao()->shouldReceive('getUserByName')
160  ->withArgs([$userId])->andReturn($userArray);
161  }
162  $request = M::mock(Request::class);
163  $this->restHelper->getUserDao()->shouldReceive('getUserByName')
164  ->withArgs([$userName])->andReturn($userArray);
165  $request->shouldReceive('getAttribute')->andReturn($version);
166  $this->dbHelper->shouldReceive('doesIdExist')
167  ->withArgs(["users", "user_pk", $userId])->andReturn(true);
168  $this->dbHelper->shouldReceive('getUsers')->withArgs([$userId])
169  ->andReturn($user);
170  $expectedResponse = (new ResponseHelper())->withJson($user[0]->getArray($version), 200);
171  $actualResponse = $this->userController->getUsers($request, new ResponseHelper(),
172  ['pathParam' => $userId]);
173  $this->assertEquals($expectedResponse->getStatusCode(),
174  $actualResponse->getStatusCode());
175  $this->assertEquals($this->getResponseJson($expectedResponse),
176  $this->getResponseJson($actualResponse));
177  }
178 
185  {
186  $this->testGetSpecificUserNotFound(ApiVersion::V1);
187  }
194  {
196  }
201  private function testGetSpecificUserNotFound($version = ApiVersion::V2)
202  {
203  $userId = 6;
204  $request = M::mock(Request::class);
205  if ($version == ApiVersion::V2) {
206  $userArray = ['user_pk' => $userId];
207  $this->restHelper->getUserDao()->shouldReceive('getUserByName')
208  ->withArgs([$userId])->andReturn($userArray);
209  }
210  $request->shouldReceive('getAttribute')->andReturn($version);
211  $this->dbHelper->shouldReceive('doesIdExist')
212  ->withArgs(["users", "user_pk", $userId])->andReturn(false);
213  $this->expectException(HttpNotFoundException::class);
214 
215  $this->userController->getUsers($request, new ResponseHelper(),
216  ['pathParam' => $userId]);
217  }
218 
224  public function testGetAllUsersV1()
225  {
226  $this->testGetAllUsers(ApiVersion::V1);
227  }
233  public function testGetAllUsersV2()
234  {
235  $this->testGetAllUsers();
236  }
241  private function testGetAllUsers($version = ApiVersion::V2)
242  {
243  $userId = 2;
244  $users = $this->getUsers([2, 3, 4]);
245  if ($version == ApiVersion::V2) {
246  $userArray = ['user_pk' => $userId];
247  $this->restHelper->getUserDao()->shouldReceive('getUserByName')
248  ->withArgs([$userId])->andReturn($userArray);
249  }
250  $request = M::mock(Request::class);
251  $request->shouldReceive('getAttribute')->andReturn($version);
252  $this->dbHelper->shouldReceive('getUsers')->withArgs([null])
253  ->andReturn($users);
254 
255  $allUsers = array();
256  foreach ($users as $user) {
257  $allUsers[] = $user->getArray($version);
258  }
259 
260  $expectedResponse = (new ResponseHelper())->withJson($allUsers, 200);
261  $actualResponse = $this->userController->getUsers($request, new ResponseHelper(), []);
262  $this->assertEquals($expectedResponse->getStatusCode(),
263  $actualResponse->getStatusCode());
264  $this->assertEquals($this->getResponseJson($expectedResponse),
265  $this->getResponseJson($actualResponse));
266  }
267 
273  public function testDeleteUserV1()
274  {
275  $this->testDeleteUser(ApiVersion::V1);
276  }
282  public function testDeleteUserV2()
283  {
284  $this->testDeleteUser();
285  }
290  private function testDeleteUser($version = ApiVersion::V2)
291  {
292  $userId = 4;
293  $userArray = ['user_pk' => $userId];
294  $request = M::mock(Request::class);
295  $request->shouldReceive('getAttribute')->andReturn($version);
296  $this->restHelper->getUserDao()->shouldReceive('getUserByName')
297  ->withArgs([$userId])->andReturn($userArray);
298  $this->dbHelper->shouldReceive('doesIdExist')
299  ->withArgs(["users", "user_pk", $userId])->andReturn(true);
300  $this->dbHelper->shouldReceive('deleteUser')->withArgs([$userId]);
301  $info = new Info(202, "User will be deleted", InfoType::INFO);
302  $expectedResponse = (new ResponseHelper())->withJson($info->getArray(),
303  $info->getCode());
304  $actualResponse = $this->userController->deleteUser($request, new ResponseHelper(),
305  ['pathParam' => $userId]);
306  $this->assertEquals($expectedResponse->getStatusCode(),
307  $actualResponse->getStatusCode());
308  $this->assertEquals($this->getResponseJson($expectedResponse),
309  $this->getResponseJson($actualResponse));
310  }
311 
318  {
319  $this->testDeleteUserDoesNotExists(ApiVersion::V1);
320  }
327  {
329  }
334  private function testDeleteUserDoesNotExists($version = ApiVersion::V2)
335  {
336  $userId = 8;
337  $userArray = ['user_pk' => $userId];
338  $request = M::mock(Request::class);
339  $request->shouldReceive('getAttribute')->andReturn($version);
340  $this->restHelper->getUserDao()->shouldReceive('getUserByName')
341  ->withArgs([$userId])->andReturn($userArray);
342  $this->dbHelper->shouldReceive('doesIdExist')
343  ->withArgs(["users", "user_pk", $userId])->andReturn(false);
344  $this->expectException(HttpNotFoundException::class);
345 
346  $this->userController->deleteUser($request, new ResponseHelper(),
347  ['pathParam' => $userId]);
348  }
349 
355  public function testGetCurrentUserV1()
356  {
357  $this->testGetCurrentUser(ApiVersion::V1);
358  }
364  public function testGetCurrentUserV2()
365  {
366  $this->testGetCurrentUser();
367  }
372  private function testGetCurrentUser($version = ApiVersion::V2)
373  {
374  $userId = 2;
375  $user = $this->getUsers([$userId]);
376  $request = M::mock(Request::class);
377  $request->shouldReceive('getAttribute')->andReturn($version);
378  $this->restHelper->shouldReceive('getUserId')->andReturn($userId);
379  $this->dbHelper->shouldReceive('getUsers')->withArgs([$userId])
380  ->andReturn($user);
381  $this->userDao->shouldReceive('getUserAndDefaultGroupByUserName')->withArgs([$user[0]->getArray()["name"]])
382  ->andReturn(["group_name" => "fossy"]);
383 
384  $expectedUser = $user[0]->getArray($version);
385  if ($version == ApiVersion::V1) {
386  $expectedUser["default_group"] = "fossy";
387  }
388  $expectedResponse = (new ResponseHelper())->withJson($expectedUser, 200);
389 
390  $actualResponse = $this->userController->getCurrentUser($request,
391  new ResponseHelper(), []);
392  $this->assertEquals($expectedResponse->getStatusCode(),
393  $actualResponse->getStatusCode());
394  $this->assertEquals($this->getResponseJson($expectedResponse),
395  $this->getResponseJson($actualResponse));
396  }
397 
403  public function testAddUserEmptyBody()
404  {
405  $request = M::mock(Request::class);
406  $request->shouldReceive('getHeaderLine')
407  ->withArgs(['Content-Type'])->andReturn('');
408  $request->shouldReceive('getAttribute')->andReturn(ApiVersion::V1);
409  $request->shouldReceive('getParsedBody')->andReturn(null);
410 
411  $this->expectException(HttpBadRequestException::class);
412  $this->expectExceptionMessage("Request body is empty or malformed.");
413 
414  $this->userController->addUser($request, new ResponseHelper(), []);
415  }
416 
422  public function testAddUserMissingName()
423  {
424  $request = M::mock(Request::class);
425  $request->shouldReceive('getHeaderLine')
426  ->withArgs(['Content-Type'])->andReturn('');
427  $request->shouldReceive('getAttribute')->andReturn(ApiVersion::V1);
428  $request->shouldReceive('getParsedBody')->andReturn(['email' => 'test@test.com']);
429 
430  $this->expectException(HttpBadRequestException::class);
431  $this->expectExceptionMessage("Username must be specified.");
432 
433  $this->userController->addUser($request, new ResponseHelper(), []);
434  }
435 }
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
#define PLUGIN_DB_WRITE
Plugin requires write permission on DB.
Definition: libfossology.h:38
#define PLUGIN_DB_READ
Plugin requires read permission on DB.
Definition: libfossology.h:37
#define PLUGIN_DB_ADMIN
Plugin requires admin level permission on DB.
Definition: libfossology.h:39