FOSSology  4.7.0-rc1
Open Source License Compliance by Open Source Software
UploadControllerTest.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  SPDX-FileCopyrightText: © 2022 Samuel Dushimimana <dushsam100@gmail.com>
6  SPDX-FileContributor: Kaushlendra Pratap <kaushlendra-pratap.singh@siemens.com>
7 
8  SPDX-License-Identifier: GPL-2.0-only
9 */
16 
47 use Mockery as M;
48 use Slim\Psr7\Factory\StreamFactory;
49 use Slim\Psr7\Headers;
50 use Slim\Psr7\Request;
51 use Slim\Psr7\Uri;
52 
53 function TryToDelete($uploadpk, $user_pk, $group_pk, $uploadDao)
54 {
55  return UploadControllerTest::$functions->TryToDelete($uploadpk, $user_pk,
56  $group_pk, $uploadDao);
57 }
58 
63 class UploadControllerTest extends \PHPUnit\Framework\TestCase
64 {
69  public static $functions;
70 
76 
81  private $userId;
82 
87  private $groupId;
88 
93  private $dbHelper;
94 
99  private $dbManager;
100 
105  private $restHelper;
106 
112 
117  private $uploadDao;
118 
124 
129  private $folderDao;
130 
135  private $agentDao;
136 
141  private $clearingDao;
142 
147  private $licenseDao;
148 
154 
159  private $streamFactory;
160 
164  private $copyrightPlugin;
165 
169  private $downloadPlugin;
170 
175  protected function setUp() : void
176  {
177  global $container;
178  $this->userId = 2;
179  $this->groupId = 2;
180  $container = M::mock('ContainerBuilder');
181  self::$functions = M::mock();
182  $this->dbHelper = M::mock(DbHelper::class);
183  $this->dbManager = M::mock(DbManager::class);
184  $this->restHelper = M::mock(RestHelper::class);
185  $this->uploadDao = M::mock(UploadDao::class);
186  $this->folderDao = M::mock(FolderDao::class);
187  $this->agentDao = M::mock(AgentDao::class);
188  $this->userDao = M::mock(UserDao::class);
189  $this->clearingDao = M::mock(ClearingDao::class);
190  $this->licenseDao = M::mock(LicenseDao::class);
191  $this->reuseReportProcess = M::mock(ReuseReportProcessor::class);
192  $this->uploadPermissionDao = M::mock(UploadPermissionDao::class);
193  $this->downloadPlugin = M::mock("download");
194 
195  $this->dbManager->shouldReceive('getSingleRow')
196  ->withArgs([M::any(), [$this->groupId, UploadStatus::OPEN,
197  Auth::PERM_READ]]);
198  $this->dbHelper->shouldReceive('getDbManager')->andReturn($this->dbManager);
199 
200  $this->restHelper->shouldReceive('getDbHelper')->andReturn($this->dbHelper);
201  $this->restHelper->shouldReceive('getGroupId')->andReturn($this->groupId);
202  $this->restHelper->shouldReceive('getUserId')->andReturn($this->userId);
203  $this->restHelper->shouldReceive('getPlugin')->withArgs(array("download"))->andReturn($this->downloadPlugin);
204  $this->restHelper->shouldReceive('getUploadDao')
205  ->andReturn($this->uploadDao);
206  $this->restHelper->shouldReceive('getFolderDao')
207  ->andReturn($this->folderDao);
208  $this->restHelper->shouldReceive('getUserDao')
209  ->andReturn($this->userDao);
210  $container->shouldReceive('get')->withArgs(['dao.license'])->andReturn(
211  $this->licenseDao);
212  $container->shouldReceive('get')->withArgs(array(
213  'dao.clearing'))->andReturn($this->clearingDao);
214  $container->shouldReceive('get')->withArgs(array(
215  'helper.restHelper'))->andReturn($this->restHelper);
216  $container->shouldReceive('get')->withArgs(array(
217  'dao.agent'))->andReturn($this->agentDao);
218  $container->shouldReceive('get')->withArgs(array(
219  'dao.upload'))->andReturn($this->uploadDao);
220  $container->shouldReceive('get')->withArgs(
221  ['db.manager'])->andReturn($this->dbManager);
222  $container->shouldReceive('get')->withArgs(array('dao.license'))->andReturn($this->licenseDao);
223  $container->shouldReceive('get')->withArgs(array(
224  'businessrules.reusereportprocessor'))->andReturn($this->reuseReportProcess);
225  $this->uploadController = new UploadController($container);
226  $this->assertCountBefore = \Hamcrest\MatcherAssert::getCount();
227  $this->streamFactory = new StreamFactory();
228  }
229 
234  protected function tearDown() : void
235  {
236  $this->addToAssertionCount(
237  \Hamcrest\MatcherAssert::getCount() - $this->assertCountBefore);
238  M::close();
239  }
240 
247  private function getResponseJson($response)
248  {
249  $response->getBody()->seek(0);
250  return json_decode($response->getBody()->getContents(), true);
251  }
252 
258  private function getUploadBounds($id)
259  {
260  if ($id > 4) {
261  return false;
262  }
263  $itemId = ($id * 100) + 1;
264  $left = ($id * 100) + 2;
265  $right = ($id * 100) + 50;
266  return new ItemTreeBounds($itemId, 'uploadtree_a', $id, $left, $right);
267  }
268 
274  private function getUpload($id)
275  {
276  $uploadName = "";
277  $description = "";
278  $uploadDate = "";
279  $folderId = 2;
280  $folderName = "SR";
281  $fileSize = 0;
282  switch ($id) {
283  case 2:
284  $uploadName = "top$id";
285  $uploadDate = "01-01-2020";
286  $fileSize = 123;
287  break;
288  case 3:
289  $uploadName = "child$id";
290  $uploadDate = "02-01-2020";
291  $fileSize = 133;
292  break;
293  case 4:
294  $uploadName = "child$id";
295  $uploadDate = "03-01-2020";
296  $fileSize = 153;
297  break;
298  default:
299  return null;
300  }
301  $hash = new Hash('sha1checksum', 'md5checksum', 'sha256checksum', $fileSize);
302  return new Upload($folderId, $folderName, $id, $description,
303  $uploadName, $uploadDate, null, $hash);
304  }
305 
311  public function testGetSingleUploadV1()
312  {
313  $this->testGetSingleUpload(ApiVersion::V1);
314  }
320  public function testGetSingleUploadV2()
321  {
322  $this->testGetSingleUpload(ApiVersion::V2);
323  }
324 
330  private function testGetSingleUpload($version)
331  {
332  $uploadId = 3;
333  $options = [
334  "folderId" => null,
335  "name" => null,
336  "status" => null,
337  "assignee" => null,
338  "since" => null
339  ];
340  $upload = $this->getUpload($uploadId);
341  $requestHeaders = new Headers();
342  $body = $this->streamFactory->createStream();
343  $request = new Request("GET", new Uri("HTTP", "localhost", 80,
344  "/uploads/$uploadId"), $requestHeaders, [], [], $body);
345  if ($version == ApiVersion::V2) {
346  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME,
347  ApiVersion::V2);
348  }
349  $this->dbHelper->shouldReceive('doesIdExist')
350  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
351  $this->uploadDao->shouldReceive('isAccessible')
352  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
353  $this->uploadDao->shouldReceive('getParentItemBounds')
354  ->withArgs([$uploadId])->andReturn($this->getUploadBounds($uploadId));
355  $this->dbHelper->shouldReceive('getUploads')
356  ->withArgs([$this->userId, $this->groupId, 100, 1, $uploadId, $options,
357  true, $version])->andReturn([1, [$upload->getArray()]]);
358  $expectedResponse = (new ResponseHelper())->withJson($upload->getArray(), 200);
359  $actualResponse = $this->uploadController->getUploads($request,
360  new ResponseHelper(), ['id' => $uploadId]);
361  $this->assertEquals($expectedResponse->getStatusCode(),
362  $actualResponse->getStatusCode());
363  $this->assertEquals($this->getResponseJson($expectedResponse),
364  $this->getResponseJson($actualResponse));
365  }
366 
373  {
374  $uploadId = 3;
375  $requestHeaders = new Headers();
376  $body = $this->streamFactory->createStream();
377  $request = new Request("GET", new Uri("HTTP", "localhost", 80,
378  "/uploads/$uploadId"), $requestHeaders, [], [], $body);
379  $this->dbHelper->shouldReceive('doesIdExist')
380  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
381  $this->uploadDao->shouldReceive('isAccessible')
382  ->withArgs([$uploadId, $this->groupId])->andReturn(false);
383  $this->expectException(HttpForbiddenException::class);
384 
385  $this->uploadController->getUploads($request, new ResponseHelper(),
386  ['id' => $uploadId]);
387  }
388 
396  public function testGetUploadWithFiltersV1()
397  {
398  $this->testGetUploadWithFilters(ApiVersion::V1);
399  }
407  public function testGetUploadWithFiltersV2()
408  {
409  $this->testGetUploadWithFilters(ApiVersion::V2);
410  }
411 
412  private function testGetUploadWithFilters($version)
413  {
414  $options = [
415  "folderId" => null,
416  "name" => null,
417  "status" => null,
418  "assignee" => null,
419  "since" => null
420  ];
421 
422  // Test for folder filter
423  $folderId = 2;
424  $folderOptions = $options;
425  $folderOptions["folderId"] = $folderId;
426  $requestHeaders = new Headers();
427  $body = $this->streamFactory->createStream();
428  $request = new Request("GET", new Uri("HTTP", "localhost", 80,
429  "/uploads", UploadController::FOLDER_PARAM . "=$folderId"),
430  $requestHeaders, [], [], $body);
431  if ($version == ApiVersion::V2) {
432  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME,
433  ApiVersion::V2);
434  }
435  $this->folderDao->shouldReceive('isFolderAccessible')
436  ->withArgs([$folderId, $this->userId])->andReturn(true)->once();
437  $this->dbHelper->shouldReceive('getUploads')
438  ->withArgs([$this->userId, $this->groupId, 100, 1, null, $folderOptions,
439  true, $version])->andReturn([1, []])->once();
440  $this->uploadController->getUploads($request, new ResponseHelper(), []);
441 
442  // Test for name filter
443  $name = "foss";
444  $nameOptions = $options;
445  $nameOptions["name"] = $name;
446  $requestHeaders = new Headers();
447  $body = $this->streamFactory->createStream();
448  $request = new Request("GET", new Uri("HTTP", "localhost", 80,
449  "/uploads", UploadController::FILTER_NAME . "=$name"), $requestHeaders,
450  [], [], $body);
451  if ($version == ApiVersion::V2) {
452  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME,
453  ApiVersion::V2);
454  }
455  $this->dbHelper->shouldReceive('getUploads')
456  ->withArgs([$this->userId, $this->groupId, 100, 1, null, $nameOptions,
457  true, $version])->andReturn([1, []])->once();
458  $this->uploadController->getUploads($request, new ResponseHelper(), []);
459 
460  // Test for status filter
461  $statusString = "InProgress";
462  $status = UploadStatus::IN_PROGRESS;
463  $statusOptions = $options;
464  $statusOptions["status"] = $status;
465  $requestHeaders = new Headers();
466  $body = $this->streamFactory->createStream();
467  $request = new Request("GET", new Uri("HTTP", "localhost", 80,
468  "/uploads", UploadController::FILTER_STATUS . "=$statusString"),
469  $requestHeaders, [], [], $body);
470  if ($version == ApiVersion::V2) {
471  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME,
472  ApiVersion::V2);
473  }
474  $this->dbHelper->shouldReceive('getUploads')
475  ->withArgs([$this->userId, $this->groupId, 100, 1, null, $statusOptions,
476  true, $version])->andReturn([1, []])->once();
477  $this->uploadController->getUploads($request, new ResponseHelper(), []);
478 
479  // Test for assignee filter
480  $assignee = "-me-";
481  $assigneeOptions = $options;
482  $assigneeOptions["assignee"] = $this->userId;
483  $requestHeaders = new Headers();
484  $body = $this->streamFactory->createStream();
485  $request = new Request("GET", new Uri("HTTP", "localhost", 80,
486  "/uploads", UploadController::FILTER_ASSIGNEE . "=$assignee"),
487  $requestHeaders, [], [], $body);
488  if ($version == ApiVersion::V2) {
489  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME,
490  ApiVersion::V2);
491  }
492  $this->dbHelper->shouldReceive('getUploads')
493  ->withArgs([$this->userId, $this->groupId, 100, 1, null, $assigneeOptions,
494  true, $version])->andReturn([1, []])->once();
495  $this->uploadController->getUploads($request, new ResponseHelper(), []);
496 
497  // Test for since filter
498  $since = "2021-02-28";
499  $sinceOptions = $options;
500  $sinceOptions["since"] = strtotime($since);
501  $requestHeaders = new Headers();
502  $body = $this->streamFactory->createStream();
503  $request = new Request("GET", new Uri("HTTP", "localhost", 80,
504  "/uploads", UploadController::FILTER_DATE . "=$since"),
505  $requestHeaders, [], [], $body);
506  if ($version == ApiVersion::V2) {
507  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME,
508  ApiVersion::V2);
509  }
510  $this->dbHelper->shouldReceive('getUploads')
511  ->withArgs([$this->userId, $this->groupId, 100, 1, null, $sinceOptions,
512  true, $version])->andReturn([1, []])->once();
513  $this->uploadController->getUploads($request, new ResponseHelper(), []);
514 
515  // Test for status and since filter
516  $statusString = "Open";
517  $status = UploadStatus::OPEN;
518  $since = "2021-02-28";
519  $combOptions = $options;
520  $combOptions["since"] = strtotime($since);
521  $combOptions["status"] = $status;
522  $requestHeaders = new Headers();
523  $body = $this->streamFactory->createStream();
524  $request = new Request("GET", new Uri("HTTP", "localhost", 80,
525  "/uploads", UploadController::FILTER_DATE . "=$since&" .
526  UploadController::FILTER_STATUS . "=$statusString"),
527  $requestHeaders, [], [], $body);
528  if ($version == ApiVersion::V2) {
529  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME,
530  ApiVersion::V2);
531  }
532  $this->dbHelper->shouldReceive('getUploads')
533  ->withArgs([$this->userId, $this->groupId, 100, 1, null, $combOptions,
534  true, $version])->andReturn([1, []])->once();
535  $this->uploadController->getUploads($request, new ResponseHelper(), []);
536  }
537 
543  public function testGetUploadsV1(){
544  $this->testGetUploads(ApiVersion::V1);
545  }
551  public function testGetUploadsV2(){
552  $this->testGetUploads(ApiVersion::V2);
553  }
554  private function testGetUploads($version)
555  {
556  $uploads = [
557  $this->getUpload(2)->getArray(),
558  $this->getUpload(3)->getArray(),
559  $this->getUpload(4)->getArray()
560  ];
561  $options = [
562  "folderId" => null,
563  "name" => null,
564  "status" => null,
565  "assignee" => null,
566  "since" => null
567  ];
568  $requestHeaders = new Headers();
569  $body = $this->streamFactory->createStream();
570  $request = new Request("GET", new Uri("HTTP", "localhost", 80,
571  "/uploads/"), $requestHeaders, [], [], $body);
572  if ($version == ApiVersion::V2) {
573  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME,
574  ApiVersion::V2);
575  }
576  $this->dbHelper->shouldReceive('getUploads')
577  ->withArgs([$this->userId, $this->groupId, 100, 1, null, $options, true, $version])
578  ->andReturn([1, $uploads]);
579  $expectedResponse = (new ResponseHelper())->withJson($uploads, 200);
580  $actualResponse = $this->uploadController->getUploads($request,
581  new ResponseHelper(), []);
582  $this->assertEquals($expectedResponse->getStatusCode(),
583  $actualResponse->getStatusCode());
584  $this->assertEquals($this->getResponseJson($expectedResponse),
585  $this->getResponseJson($actualResponse));
586  }
587 
595  {
596  $uploadId = 3;
597  $requestHeaders = new Headers();
598  $body = $this->streamFactory->createStream();
599  $request = new Request("GET", new Uri("HTTP", "localhost", 80,
600  "/uploads/"), $requestHeaders, [], [], $body);
601  $this->dbHelper->shouldReceive('doesIdExist')
602  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
603  $this->uploadDao->shouldReceive('isAccessible')
604  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
605  $this->uploadDao->shouldReceive('getParentItemBounds')
606  ->withArgs([$uploadId])->andReturn(false);
607  $this->expectException(HttpServiceUnavailableException::class);
608 
609  $this->uploadController->getUploads($request, new ResponseHelper(),
610  ['id' => $uploadId]);
611  }
612 
618  public function testCopyUploadV1()
619  {
620  $this->testCopyUpload(ApiVersion::V1);
621  }
627  public function testCopyUploadV2()
628  {
629  $this->testCopyUpload(ApiVersion::V2);
630  }
636  private function testCopyUpload($version)
637  {
638  $uploadId = 3;
639  $folderId = 5;
640  $info = new Info(202, "Upload $uploadId will be copied to folder $folderId",
641  InfoType::INFO);
642 
643  $this->restHelper->shouldReceive('copyUpload')
644  ->withArgs([$uploadId, $folderId, true])->andReturn($info);
645  $expectedResponse = (new ResponseHelper())->withJson($info->getArray(),
646  $info->getCode());
647 
648  $requestHeaders = new Headers();
649  $body = $this->streamFactory->createStream();
650 
651  if($version==ApiVersion::V1){
652  $requestHeaders->setHeader('folderId', $folderId);
653  $requestHeaders->setHeader('action', 'copy');
654  $request = new Request("PUT", new Uri("HTTP", "localhost"),
655  $requestHeaders, [], [], $body);
656  $actualResponse = $this->uploadController->moveUpload($request,
657  new ResponseHelper(), ['id' => $uploadId]);
658  }
659  else{
660  $request = new Request("PUT", new Uri("HTTP", "localhost"),
661  $requestHeaders, [], [], $body);
662  if ($version == ApiVersion::V2) {
663  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME,
664  ApiVersion::V2);
665  }
666  $actualResponse = $this->uploadController->moveUpload($request->withUri($request->getUri()->withQuery("folderId=$folderId&action=copy")),
667  new ResponseHelper(), ['id' => $uploadId]);
668  }
669  $this->assertEquals($expectedResponse->getStatusCode(),
670  $actualResponse->getStatusCode());
671  $this->assertEquals($this->getResponseJson($expectedResponse),
672  $this->getResponseJson($actualResponse));
673  }
684  {
685  $this->testMoveUploadInvalidFolder(ApiVersion::V1);
686  }
693  {
695  }
700  private function testMoveUploadInvalidFolder($version = ApiVersion::V2)
701  {
702  $uploadId = 3;
703 
704  $requestHeaders = new Headers();
705  $requestHeaders->setHeader('folderId', 'alpha');
706  $requestHeaders->setHeader('action', 'move');
707  $body = $this->streamFactory->createStream();
708  $request = new Request("PATCH", new Uri("HTTP", "localhost"),
709  $requestHeaders, [], [], $body);
710  if ($version==ApiVersion::V2) {
711  $request = $request->withQueryParams(['folderId' => 'alpha', 'action' => 'move']);
712  } else {
713  $request = $request->withHeader("folderId", "alpha")
714  ->withHeader("action", "move");
715  }
716  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME,$version);
717  $this->expectException(HttpBadRequestException::class);
718 
719  $this->uploadController->moveUpload($request, new ResponseHelper(),
720  ['id' => $uploadId]);
721  }
722 
730  public function testPostUploadV1()
731  {
732  $this->testPostUpload(ApiVersion::V1);
733  }
734 
742  public function testPostUploadV2()
743  {
744  $this->testPostUpload(ApiVersion::V2);
745  }
746 
751  private function testPostUpload(int $version)
752  {
753  $folderId = 2;
754  $uploadId = 20;
755  $uploadDescription = "Test Upload";
756 
757  $requestHeaders = new Headers();
758  $requestHeaders->setHeader('Content-Type', 'application/json');
759  if ($version == ApiVersion::V2) {
760  $reqBody = [
761  "location" => "data",
762  "folderId" => $folderId,
763  "uploadDescription" => $uploadDescription,
764  "ignoreScm" => "true",
765  "scanOptions" => "scanOptions",
766  "uploadType" => "vcs",
767  "excludeFolder" => "false"
768  ];
769  } else {
770  $reqBody = [
771  "location" => "data",
772  "scanOptions" => "scanOptions"
773  ];
774  $requestHeaders->setHeader('folderId', $folderId);
775  $requestHeaders->setHeader('uploadDescription', $uploadDescription);
776  $requestHeaders->setHeader('ignoreScm', 'true');
777  $requestHeaders->setHeader('Content-Type', 'application/json');
778  $requestHeaders->setHeader('uploadType', 'vcs');
779  }
780 
781  $body = $this->streamFactory->createStream(json_encode(
782  $reqBody
783  ));
784  $request = new Request("POST", new Uri("HTTP", "localhost"),
785  $requestHeaders, [], [], $body);
786  if ($version == ApiVersion::V2) {
787  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME,
788  ApiVersion::V2);
789  }
790  $uploadHelper = M::mock('overload:Fossology\UI\Api\Helper\UploadHelper');
791  if ($version == ApiVersion::V2) {
792  $uploadHelper->shouldReceive('createNewUpload')
793  ->withArgs([$reqBody["location"], $folderId, $uploadDescription, 'protected', 'true',
794  'vcs', false, false])
795  ->andReturn([true, '', '', $uploadId]);
796  } else {
797  $uploadHelper->shouldReceive('createNewUpload')
798  ->withArgs([$reqBody["location"], $folderId, $uploadDescription, 'protected', 'true',
799  'vcs', false])
800  ->andReturn([true, '', '', $uploadId]);
801  }
802 
803  $info = new Info(201, intval(20), InfoType::INFO);
804 
805  $uploadHelper->shouldReceive('handleScheduleAnalysis')->withArgs([$uploadId,$folderId,$reqBody["scanOptions"],false])
806  ->andReturn($info);
807 
808  $this->folderDao->shouldReceive('getAllFolderIds')->andReturn([2,3,4]);
809  $this->folderDao->shouldReceive('isFolderAccessible')
810  ->withArgs([$folderId])->andReturn(true);
811 
812  $expectedResponse = (new ResponseHelper())->withJson($info->getArray(),
813  $info->getCode());
814  $actualResponse = $this->uploadController->postUpload($request,
815  new ResponseHelper(), []);
816  $this->assertEquals($expectedResponse->getStatusCode(),
817  $actualResponse->getStatusCode());
818  $this->assertEquals($this->getResponseJson($expectedResponse),
819  $this->getResponseJson($actualResponse));
820  }
829  {
830  $folderId = -1;
831  $requestHeaders = new Headers();
832  $requestHeaders->setHeader('Content-Type', 'application/json');
833 
834  $body = $this->streamFactory->createStream(json_encode([
835  "location" => "vcsData",
836  "folderId" => $folderId,
837  "uploadDescription" => "Test Upload",
838  "ignoreScm" => "true",
839  "scanOptions" => "scanOptions",
840  "uploadType" => "vcs"
841  ]));
842 
843  $request = new Request(
844  "POST",
845  new Uri("HTTP", "localhost"),
846  $requestHeaders,
847  [],
848  [],
849  $body
850  );
851 
852  $request = $request->withAttribute(
853  ApiVersion::ATTRIBUTE_NAME,
854  ApiVersion::V2
855  );
856 
857  M::mock('overload:Fossology\UI\Api\Helper\UploadHelper');
858 
859  $this->expectException(HttpBadRequestException::class);
860 
861  $this->uploadController->postUpload($request, new ResponseHelper(), []);
862  }
871  {
872  $this->testPostUploadFolderNotAccessible(ApiVersion::V1);
873  }
874 
883  {
884  $this->testPostUploadFolderNotAccessible(ApiVersion::V2);
885  }
886 
891  private function testPostUploadFolderNotAccessible(int $version)
892  {
893  $folderId = 2;
894  $uploadDescription = "Test Upload";
895 
896  $requestHeaders = new Headers();
897  $requestHeaders->setHeader('Content-type', 'application/json');
898  if ($version == ApiVersion::V2) {
899  $body = $this->streamFactory->createStream(json_encode([
900  "location" => "data",
901  "folderId" => $folderId,
902  "uploadDescription" => $uploadDescription,
903  "ignoreScm" => "true",
904  "scanOptions" => "scanOptions",
905  "uploadType" => "vcs"
906  ]));
907  } else {
908  $body = $this->streamFactory->createStream(json_encode([
909  "location" => "data",
910  "scanOptions" => "scanOptions"
911  ]));
912  $requestHeaders->setHeader('folderId', $folderId);
913  $requestHeaders->setHeader('uploadDescription', $uploadDescription);
914  $requestHeaders->setHeader('ignoreScm', 'true');
915  $requestHeaders->setHeader('Content-Type', 'application/json');
916  $requestHeaders->setHeader('uploadType', 'vcs');
917  }
918  $request = new Request("POST", new Uri("HTTP", "localhost"),
919  $requestHeaders, [], [], $body);
920  if ($version == ApiVersion::V2) {
921  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME,
922  ApiVersion::V2);
923  }
924 
925  $uploadHelper = M::mock('overload:Fossology\UI\Api\Helper\UploadHelper');
926 
927  $this->folderDao->shouldReceive('getAllFolderIds')->andReturn([2,3,4]);
928  $this->folderDao->shouldReceive('isFolderAccessible')
929  ->withArgs([$folderId])->andReturn(false);
930  $this->expectException(HttpForbiddenException::class);
931 
932  $this->uploadController->postUpload($request, new ResponseHelper(),
933  []);
934  }
935 
944  {
945  $this->testPostUploadFolderNotFound(ApiVersion::V1);
946  }
947 
956  {
957  $this->testPostUploadFolderNotFound(ApiVersion::V2);
958  }
959 
964  private function testPostUploadFolderNotFound(int $version)
965  {
966  $folderId = 8;
967  $uploadDescription = "Test Upload";
968 
969  $requestHeaders = new Headers();
970  $requestHeaders->setHeader('Content-type', 'application/json');
971  if ($version == ApiVersion::V2) {
972  $body = $this->streamFactory->createStream(json_encode([
973  "location" => "vcsData",
974  "folderId" => $folderId,
975  "uploadDescription" => $uploadDescription,
976  "ignoreScm" => "true",
977  "scanOptions" => "scanOptions",
978  "uploadType" => "vcs"
979  ]));
980  } else {
981  $body = $this->streamFactory->createStream(json_encode([
982  "location" => "vcsData",
983  "scanOptions" => "scanOptions"
984  ]));
985  $requestHeaders->setHeader('folderId', $folderId);
986  $requestHeaders->setHeader('uploadDescription', $uploadDescription);
987  $requestHeaders->setHeader('ignoreScm', 'true');
988  $requestHeaders->setHeader('Content-Type', 'application/json');
989  $requestHeaders->setHeader('uploadType', 'vcs');
990  }
991  $request = new Request("POST", new Uri("HTTP", "localhost"),
992  $requestHeaders, [], [], $body);
993  if ($version == ApiVersion::V2) {
994  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME,
995  ApiVersion::V2);
996  }
997 
998  $uploadHelper = M::mock('overload:Fossology\UI\Api\Helper\UploadHelper');
999 
1000  $this->folderDao->shouldReceive('getAllFolderIds')->andReturn([2,3,4]);
1001  $this->expectException(HttpNotFoundException::class);
1002 
1003  $this->uploadController->postUpload($request, new ResponseHelper(),
1004  []);
1005  }
1006 
1015  {
1016  $this->testPostUploadInternalError(ApiVersion::V1);
1017  }
1018 
1027  {
1028  $this->testPostUploadInternalError(ApiVersion::V2);
1029  }
1030 
1035  private function testPostUploadInternalError(int $version)
1036  {
1037  $folderId = 3;
1038  $uploadDescription = "Test Upload";
1039  $errorMessage = "Failed to insert upload record";
1040  $errorDesc = "";
1041 
1042  $requestHeaders = new Headers();
1043  $requestHeaders->setHeader('Content-type', 'application/json');
1044  if ($version == ApiVersion::V2) {
1045  $body = $this->streamFactory->createStream(json_encode([
1046  "location" => "vcsData",
1047  "folderId" => $folderId,
1048  "uploadDescription" => $uploadDescription,
1049  "ignoreScm" => "true",
1050  "scanOptions" => "scanOptions",
1051  "uploadType" => "vcs",
1052  "excludeFolder" => "false"
1053  ]));
1054  } else {
1055  $body = $this->streamFactory->createStream(json_encode([
1056  "location" => "vcsData",
1057  "scanOptions" => "scanOptions"
1058  ]));
1059  $requestHeaders->setHeader('folderId', $folderId);
1060  $requestHeaders->setHeader('uploadDescription', $uploadDescription);
1061  $requestHeaders->setHeader('ignoreScm', 'true');
1062  $requestHeaders->setHeader('Content-Type', 'application/json');
1063  $requestHeaders->setHeader('uploadType', 'vcs');
1064  }
1065 
1066  $request = new Request("POST", new Uri("HTTP", "localhost"),
1067  $requestHeaders, [], [], $body);
1068  if ($version == ApiVersion::V2) {
1069  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME,
1070  ApiVersion::V2);
1071  }
1072 
1073  $uploadHelper = M::mock('overload:Fossology\UI\Api\Helper\UploadHelper');
1074  if ($version == ApiVersion::V2) {
1075  $uploadHelper->shouldReceive('createNewUpload')
1076  ->withArgs(['vcsData', $folderId, $uploadDescription, 'protected', 'true',
1077  'vcs', false, false])
1078  ->andReturn([false, $errorMessage, $errorDesc, [-1]]);
1079  } else {
1080  $uploadHelper->shouldReceive('createNewUpload')
1081  ->withArgs(['vcsData', $folderId, $uploadDescription, 'protected', 'true',
1082  'vcs', false])
1083  ->andReturn([false, $errorMessage, $errorDesc, [-1]]);
1084  }
1085 
1086  $this->folderDao->shouldReceive('getAllFolderIds')->andReturn([2,3,4]);
1087  $this->folderDao->shouldReceive('isFolderAccessible')
1088  ->withArgs([$folderId])->andReturn(true);
1089  $this->expectException(HttpInternalServerErrorException::class);
1090 
1091  $this->uploadController->postUpload($request, new ResponseHelper(), []);
1092  }
1093 
1101  public function testGetUploadLicensesV1()
1102  {
1103  $this->testGetUploadLicenses(ApiVersion::V1);
1104  }
1112  public function testGetUploadLicensesV2()
1113  {
1114  $this->testGetUploadLicenses(ApiVersion::V2);
1115  }
1116  private function testGetUploadLicenses($version)
1117  {
1118  $uploadId = 3;
1119  $agentsRun = [
1120  ['agentName' => 'nomos', 'currentAgentId' => 2, 'isAgentRunning' => false],
1121  ['agentName' => 'monk', 'currentAgentId' => 3, 'isAgentRunning' => false]
1122  ];
1123  $licenseResponse = [
1124  ['filePath' => 'filea', 'agentFindings' => 'MIT', 'conclusions' => 'MIT'],
1125  ['filePath' => 'fileb', 'agentFindings' => 'MIT',
1126  'conclusions' => 'No_license_found']
1127  ];
1128 
1129  $requestHeaders = new Headers();
1130  $body = $this->streamFactory->createStream();
1131  $request = new Request("POST", new Uri("HTTP", "localhost", 80,
1132  "/uploads/$uploadId/licenses", UploadController::AGENT_PARAM .
1133  "=nomos,monk&containers=false"),
1134  $requestHeaders, [], [], $body);
1135  if ($version == ApiVersion::V2) {
1136  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME,
1137  ApiVersion::V2);
1138  }
1139  $this->dbHelper->shouldReceive('doesIdExist')
1140  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1141  $this->uploadDao->shouldReceive('isAccessible')
1142  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
1143  $this->uploadDao->shouldReceive('getParentItemBounds')
1144  ->withArgs([$uploadId])->andReturn($this->getUploadBounds($uploadId));
1145  $this->agentDao->shouldReceive('arsTableExists')
1146  ->withArgs([M::anyOf('nomos', 'monk')])->andReturn(true);
1147 
1148  $scanJobProxy = M::mock('overload:Fossology\Lib\Proxy\ScanJobProxy');
1149  $scanJobProxy->shouldReceive('createAgentStatus')
1150  ->withArgs([['nomos', 'monk']])
1151  ->andReturn($agentsRun);
1152 
1153  $uploadHelper = M::mock('overload:Fossology\UI\Api\Helper\UploadHelper');
1154  $uploadHelper->shouldReceive('getUploadLicenseList')
1155  ->withArgs([$uploadId, ['nomos', 'monk'], false, true, false, 0, 50, $version])
1156  ->andReturn(([[$licenseResponse], 1]));
1157 
1158  $expectedResponse = (new ResponseHelper())->withJson($licenseResponse, 200);
1159 
1160  $actualResponse = $this->uploadController->getUploadLicenses($request,
1161  new ResponseHelper(), ['id' => $uploadId]);
1162  $this->assertEquals($expectedResponse->getStatusCode(),
1163  $actualResponse->getStatusCode());
1164  $this->assertEquals($this->getResponseJson($expectedResponse),
1165  $this->getResponseJson($actualResponse)[0]);
1166  $this->assertEquals('1',
1167  $actualResponse->getHeaderLine('X-Total-Pages'));
1168  }
1169 
1179  {
1180  $this->testGetUploadLicensesPendingScan(ApiVersion::V1);
1181  }
1191  {
1193  }
1198  private function testGetUploadLicensesPendingScan($version = ApiVersion::V2)
1199  {
1200  $uploadId = 3;
1201  $agentsRun = [
1202  ['agentName' => 'nomos', 'currentAgentId' => 2, 'isAgentRunning' => true],
1203  ['agentName' => 'monk', 'currentAgentId' => 3, 'isAgentRunning' => false]
1204  ];
1205 
1206  $requestHeaders = new Headers();
1207  $body = $this->streamFactory->createStream();
1208  $request = new Request("POST", new Uri("HTTP", "localhost", 80,
1209  "/uploads/$uploadId/licenses", UploadController::AGENT_PARAM .
1210  "=nomos,monk&containers=false"),
1211  $requestHeaders, [], [], $body);
1212  if ($version == ApiVersion::V2) {
1213  $request = $request->withQueryParams(['page' => 1, 'limit' => 2, "agent" =>"nomos,monk" ]);
1214  } else {
1215  $request = $request->withHeader("limit",2)
1216  ->withHeader("page",1);
1217  }
1218  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME,$version);
1219 
1220  $this->agentDao->shouldReceive("arsTableExists")->withAnyArgs()->andReturn(true);
1221  $this->agentDao->shouldReceive("getRunningAgentIds")->withAnyArgs()->andReturn([$agentsRun]);
1222  $this->agentDao->shouldReceive("getSuccessfulAgentEntries")->withAnyArgs()->andReturn([]);
1223  $scanJobProxy = M::mock('overload:Fossology\Lib\Proxy\ScanJobProxy');
1224  $this->dbHelper->shouldReceive('doesIdExist')
1225  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1226  $this->uploadDao->shouldReceive('isAccessible')
1227  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
1228  $this->uploadDao->shouldReceive('getParentItemBounds')
1229  ->withArgs([$uploadId])->andReturn($this->getUploadBounds($uploadId));
1230  $this->agentDao->shouldReceive('arsTableExists')
1231  ->withArgs([M::anyOf('nomos', 'monk')])->andReturn(true);
1232 
1233  $scanJobProxy->shouldReceive('createAgentStatus')
1234  ->withArgs([['nomos', 'monk']])
1235  ->andReturn($agentsRun);
1236  $this->expectException(HttpServiceUnavailableException::class);
1237 
1238  $this->uploadController->getUploadLicenses($request, new ResponseHelper(),
1239  ['id' => $uploadId]);
1240  }
1241 
1247  public function testUpdateUpload()
1248  {
1249  $upload = 2;
1250  $assignee = 4;
1251  $status = UploadStatus::REJECTED;
1252  $comment = "Not helpful";
1253 
1254  $resource = fopen('data://text/plain;base64,' .
1255  base64_encode($comment), 'r+');
1256  $body = $this->streamFactory->createStreamFromResource($resource);
1257  $request = new Request("POST", new Uri("HTTP", "localhost", 80,
1258  "/uploads/$upload", UploadController::FILTER_STATUS . "=Rejected&" .
1259  UploadController::FILTER_ASSIGNEE . "=$assignee"),
1260  new Headers(), [], [], $body);
1261 
1262  $this->userDao->shouldReceive('isAdvisorOrAdmin')
1263  ->withArgs([$this->userId, $this->groupId])
1264  ->andReturn(true);
1265  $this->userDao->shouldReceive('getUserChoices')
1266  ->withArgs([$this->groupId])
1267  ->andReturn([$this->userId => "fossy", $assignee => "friendly-fossy"]);
1268  $this->dbManager->shouldReceive('getSingleRow')
1269  ->withArgs([M::any(), [$assignee, $this->groupId, $upload], M::any()]);
1270  $this->dbManager->shouldReceive('getSingleRow')
1271  ->withArgs([M::any(), [$status, $comment, $this->groupId, $upload],
1272  M::any()]);
1273  $this->dbManager->shouldReceive('getSingleRow')
1274  ->withArgs([M::any(), [$upload], M::any()])
1275  ->andReturn(["exists" => ""]);
1276 
1277  $info = new Info(202, "Upload updated successfully.", InfoType::INFO);
1278  $expectedResponse = (new ResponseHelper())->withJson($info->getArray(),
1279  $info->getCode());
1280  $actualResponse = $this->uploadController->updateUpload($request,
1281  new ResponseHelper(), ['id' => $upload]);
1282  $this->assertEquals($expectedResponse->getStatusCode(),
1283  $actualResponse->getStatusCode());
1284  $this->assertEquals($this->getResponseJson($expectedResponse),
1285  $this->getResponseJson($actualResponse));
1286  }
1287 
1293  public function testUpdateUploadNoPerm()
1294  {
1295  $upload = 2;
1296  $assignee = 4;
1297  $comment = "Not helpful";
1298 
1299  $resource = fopen('data://text/plain;base64,' .
1300  base64_encode($comment), 'r+');
1301  $body = $this->streamFactory->createStreamFromResource($resource);
1302  $request = new Request("POST", new Uri("HTTP", "localhost", 80,
1303  "/uploads/$upload", UploadController::FILTER_STATUS . "=Rejected&" .
1304  UploadController::FILTER_ASSIGNEE . "=$assignee"),
1305  new Headers(), [], [], $body);
1306 
1307  $this->userDao->shouldReceive('isAdvisorOrAdmin')
1308  ->withArgs([$this->userId, $this->groupId])
1309  ->andReturn(false);
1310  $this->expectException(HttpForbiddenException::class);
1311 
1312  $this->uploadController->updateUpload($request, new ResponseHelper(),
1313  ['id' => $upload]);
1314  }
1315 
1321  public function testGetMainLicenses()
1322  {
1323  $uploadId = 1;
1324  $licenseIds = array();
1325  $licenseId = 123;
1326  $licenseIds[$licenseId] = $licenseId;
1327  $license = new License($licenseId, "MIT", "MIT License", "risk", "texts", [],
1328  'type', false);
1329 
1330  $this->uploadDao->shouldReceive('isAccessible')
1331  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
1332  $this->dbHelper->shouldReceive('doesIdExist')
1333  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1334  $this->clearingDao->shouldReceive('getMainLicenseIds')->withArgs([$uploadId, $this->groupId])->andReturn($licenseIds);
1335  $this->licenseDao->shouldReceive('getLicenseObligations')->withArgs([[$licenseId], false])->andReturn([]);
1336  $this->licenseDao->shouldReceive('getLicenseObligations')->withArgs([[$licenseId], true])->andReturn([]);
1337  $this->licenseDao->shouldReceive('getLicenseById')->withArgs([$licenseId])->andReturn($license);
1338 
1339  $licenses[] = $license->getArray();
1340  $expectedResponse = (new ResponseHelper())->withJson($licenses, 200);
1341  $actualResponse = $this->uploadController->getMainLicenses(null, new ResponseHelper(), ['id' => $uploadId]);
1342  $this->assertEquals($expectedResponse->getStatusCode(), $actualResponse->getStatusCode());
1343  $this->assertEquals($this->getResponseJson($expectedResponse), $this->getResponseJson($actualResponse));
1344  }
1345 
1346 
1352  public function testSetMainLicense()
1353  {
1354  $uploadId = 2;
1355  $shortName = "MIT";
1356  $licenseId = 1;
1357  $rq = [
1358  "shortName" => $shortName,
1359  ];
1360  $license = new License(2, $shortName, "MIT License", "risk", "texts", [],
1361  'type', 1);
1362  $licenseIds[$licenseId] = $licenseId;
1363  $this->uploadDao->shouldReceive('isAccessible')
1364  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
1365  $this->dbHelper->shouldReceive('doesIdExist')
1366  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1367  $this->licenseDao->shouldReceive('getLicenseByShortName')
1368  ->withArgs([$shortName, $this->groupId])->andReturn($license);
1369  $this->clearingDao->shouldReceive('getMainLicenseIds')->withArgs([$uploadId, $this->groupId])->andReturn($licenseIds);
1370  $this->clearingDao->shouldReceive('makeMainLicense')
1371  ->withArgs([$uploadId, $this->groupId, $license->getId()])->andReturn(null);
1372 
1373  $info = new Info(200, "Successfully added new main license", InfoType::INFO);
1374 
1375  $expectedResponse = (new ResponseHelper())->withJson($info->getArray(), $info->getCode());
1376  $reqBody = $this->streamFactory->createStream(json_encode(
1377  $rq
1378  ));
1379  $requestHeaders = new Headers();
1380  $requestHeaders->setHeader('Content-Type', 'application/json');
1381  $request = new Request("POST", new Uri("HTTP", "localhost"),
1382  $requestHeaders, [], [], $reqBody);
1383 
1384  $actualResponse = $this->uploadController->setMainLicense($request, new ResponseHelper(), ['id' => $uploadId]);
1385 
1386  $this->assertEquals($expectedResponse->getStatusCode(),
1387  $actualResponse->getStatusCode());
1388  $this->assertEquals($this->getResponseJson($expectedResponse),
1389  $this->getResponseJson($actualResponse));
1390  }
1391 
1397  public function testSetMainLicense_exists()
1398  {
1399  $uploadId = 2;
1400  $shortName = "MIT";
1401  $licenseId = 1;
1402  $rq = [
1403  "shortName" => $shortName,
1404  ];
1405  $license = new License($licenseId, $shortName, "MIT License", "risk", "texts", [],
1406  'type', 1);
1407  $licenseIds[$licenseId] = $licenseId;
1408  $this->uploadDao->shouldReceive('isAccessible')
1409  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
1410  $this->dbHelper->shouldReceive('doesIdExist')
1411  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1412  $this->licenseDao->shouldReceive('getLicenseByShortName')
1413  ->withArgs([$shortName, $this->groupId])->andReturn($license);
1414  $this->clearingDao->shouldReceive('getMainLicenseIds')->withArgs([$uploadId, $this->groupId])->andReturn($licenseIds);
1415  $this->clearingDao->shouldReceive('makeMainLicense')
1416  ->withArgs([$uploadId, $this->groupId, $license->getId()])->andReturn(null);
1417 
1418  $reqBody = $this->streamFactory->createStream(json_encode(
1419  $rq
1420  ));
1421  $requestHeaders = new Headers();
1422  $requestHeaders->setHeader('Content-Type', 'application/json');
1423  $request = new Request("POST", new Uri("HTTP", "localhost"),
1424  $requestHeaders, [], [], $reqBody);
1425  $this->expectException(HttpBadRequestException::class);
1426 
1427  $this->uploadController->setMainLicense($request, new ResponseHelper(), ['id' => $uploadId]);
1428  }
1429 
1430 
1436  public function testRemoveMainLicense()
1437  {
1438  $uploadId = 3;
1439  $licenseId = 1;
1440  $shortName = "MIT";
1441  $license = new License($licenseId, $shortName, "MIT License", "risk", "texts", [],
1442  'type', 1);
1443  $licenseIds[$licenseId] = $licenseId;
1444 
1445  $this->uploadDao->shouldReceive('isAccessible')
1446  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
1447  $this->dbHelper->shouldReceive('doesIdExist')
1448  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1449  $this->dbHelper->shouldReceive('doesIdExist')
1450  ->withArgs(["license_ref", "rf_pk", $licenseId])->andReturn(true);
1451  $this->clearingDao->shouldReceive('getMainLicenseIds')->withArgs([$uploadId, $this->groupId])->andReturn($licenseIds);
1452 
1453  $this->clearingDao->shouldReceive('removeMainLicense')->withArgs([$uploadId, $this->groupId, $licenseId])->andReturn(null);
1454  $this->licenseDao->shouldReceive('getLicenseByShortName')
1455  ->withArgs([$shortName, $this->groupId])->andReturn($license);
1456 
1457  $info = new Info(200, "Main license removed successfully.", InfoType::INFO);
1458  $expectedResponse = (new ResponseHelper())->withJson($info->getArray(),
1459  $info->getCode());
1460  $actualResponse = $this->uploadController->removeMainLicense(null,
1461  new ResponseHelper(), ['id' => $uploadId, 'shortName' => $shortName]);
1462  $this->assertEquals($expectedResponse->getStatusCode(),
1463  $actualResponse->getStatusCode());
1464  $this->assertEquals($this->getResponseJson($expectedResponse),
1465  $this->getResponseJson($actualResponse));
1466  }
1467 
1474  {
1475  $uploadId = 3;
1476  $this->uploadDao->shouldReceive('isAccessible')
1477  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
1478  $this->dbHelper->shouldReceive('doesIdExist')
1479  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1480  $this->uploadDao->shouldReceive("getUploadtreeTableName")->withArgs([$uploadId])->andReturn("uploadtree");
1481  $this->uploadDao->shouldReceive("getGlobalDecisionSettingsFromInfo")->andReturn(false);
1482  $this->agentDao->shouldReceive("arsTableExists")->andReturn(true);
1483  $this->agentDao->shouldReceive("getSuccessfulAgentEntries")->andReturn([['agent_id' => 1, 'agent_rev' => 1]]);
1484  $this->agentDao->shouldReceive("getCurrentAgentRef")->andReturn(new AgentRef(1, "agent", 1));
1485  $this->dbManager->shouldReceive("getSingleRow")
1486  ->withArgs([M::any(), [], 'no_license_uploadtree' . $uploadId])
1487  ->andReturn(['count' => 1]);
1488  $this->dbManager->shouldReceive("getSingleRow")
1489  ->withArgs([M::any(), [], 'already_cleared_uploadtree' . $uploadId])
1490  ->andReturn(['count' => 0]);
1491  $this->licenseDao->shouldReceive('getLicenseByShortName')
1492  ->withArgs(['No_license_found'])->andReturn(null);
1493  $this->licenseDao->shouldReceive('getLicenseByShortName')
1494  ->withArgs(['Void'])->andReturn(null);
1495  $res = [
1496  "totalFilesOfInterest" => 1,
1497  "totalFilesCleared" => 1,
1498  ];
1499  $expectedResponse = (new ResponseHelper())->withJson($res, 200);
1500  $actualResponse = $this->uploadController->getClearingProgressInfo(null,
1501  new ResponseHelper(), ['id' => $uploadId]);
1502  $this->assertEquals($expectedResponse->getStatusCode(),
1503  $actualResponse->getStatusCode());
1504  $this->assertEquals($this->getResponseJson($expectedResponse),
1505  $this->getResponseJson($actualResponse));
1506  }
1512  public function testGetReuseReportSummary()
1513  {
1514  $uploadId = 2;
1515  $reuseReportSummary = [
1516  'declearedLicense' => "",
1517  'clearedLicense' => "MIT, BSD-3-Clause",
1518  'usedLicense' => "",
1519  'unusedLicense' => "",
1520  'missingLicense' => "MIT, BSD-3-Clause",
1521  ];
1522  $this->uploadDao->shouldReceive('isAccessible')
1523  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
1524  $this->dbHelper->shouldReceive('doesIdExist')
1525  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1526  $this->reuseReportProcess->shouldReceive('getReuseSummary')
1527  ->withArgs([$uploadId])->andReturn($reuseReportSummary);
1528 
1529  $expectedResponse = (new ResponseHelper())->withJson($reuseReportSummary,
1530  200);
1531  $actualResponse = $this->uploadController->getReuseReportSummary(
1532  null, new ResponseHelper(), ['id' => $uploadId]);
1533  $this->assertEquals($expectedResponse->getStatusCode(),
1534  $actualResponse->getStatusCode());
1535  $this->assertEquals($this->getResponseJson($expectedResponse),
1536  $this->getResponseJson($actualResponse));
1537  }
1538 
1539 
1548  {
1549  $publicPerm = 0;
1550  $uploadId = 2;
1551 
1552  $this->uploadDao->shouldReceive('isAccessible')
1553  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
1554  $this->dbHelper->shouldReceive('doesIdExist')
1555  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1556 
1557  $this->restHelper->shouldReceive('getUploadPermissionDao')->andReturn($this->uploadPermissionDao);
1558  $this->uploadPermissionDao->shouldReceive("getPublicPermission")->withAnyArgs()->andReturn($publicPerm);
1559  $this->uploadPermissionDao->shouldReceive("getPermissionGroups")->withAnyArgs()->andReturn([]);
1560  $this->restHelper->shouldReceive("getGroupId")->andReturn($this->groupId);
1561  $this->restHelper->shouldReceive("getUserId")->andReturn($this->userId);
1562  $this->restHelper->shouldReceive("getUploadDao")->andReturn($this->uploadDao);
1563 
1564  $body = $this->streamFactory->createStream();
1565  $requestHeaders = new Headers();
1566  $request = new Request("PATCH", new Uri("HTTP", "localhost"),
1567  $requestHeaders, [], [], $body);
1568  $response = new ResponseHelper();
1569  $actualResponse = $this->uploadController->getGroupsWithPermissions($request,$response,["id"=>$this->groupId]);
1570  $this->assertEquals(200,$actualResponse->getStatusCode());
1571 
1572  }
1573 
1581  {
1582  $uploadId = 2;
1583  $this->dbHelper->shouldReceive('doesIdExist')->withAnyArgs()->andReturn(false);
1584 
1585  $this->dbHelper->shouldReceive('doesIdExist')
1586  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(false);
1587  $body = $this->streamFactory->createStream();
1588  $requestHeaders = new Headers();
1589  $request = new Request("PATCH", new Uri("HTTP", "localhost"),
1590  $requestHeaders, [], [], $body);
1591  $response = new ResponseHelper();
1592  $this->expectException(HttpNotFoundException::class);
1593  $this->uploadController->getGroupsWithPermissions($request,$response,["id"=>$this->groupId]);
1594 
1595  }
1596 
1604  {
1605  $this->dbHelper->shouldReceive('doesIdExist')->withAnyArgs()->andReturn(true);
1606  $this->uploadDao->shouldReceive('isAccessible')->withAnyArgs()->andReturn(false);
1607 
1608  $body = $this->streamFactory->createStream();
1609  $requestHeaders = new Headers();
1610  $request = new Request("PATCH", new Uri("HTTP", "localhost"),
1611  $requestHeaders, [], [], $body);
1612  $response = new ResponseHelper();
1613  $this->expectException(HttpForbiddenException::class);
1614  $this->uploadController->getGroupsWithPermissions($request,$response,["id"=>$this->groupId]);
1615 
1616  }
1617 
1622  public function testGetAllAgents()
1623  {
1624  $groupId = 2;
1625  $uploadId = 3;
1626  $agentsRun = [
1627  ["uploadId" => $uploadId, 'agentName' => 'nomos', 'successfulAgents'=> [], 'currentAgentId' => 2, 'isAgentRunning' => false],
1628  ["uploadId" => $uploadId,'agentName' => 'monk', "successfulAgents" => [], 'currentAgentId' => 3, 'isAgentRunning' => false]
1629  ];
1630 
1631  $this->restHelper->shouldReceive("getGroupId")->andReturn($groupId);
1632  $this->agentDao->shouldReceive("getCurrentAgentRef")->withAnyArgs()->andReturn(new AgentRef($uploadId,"momoa",45));
1633 
1634  $this->uploadDao->shouldReceive("isAccessible")->withAnyArgs()->andReturn(true);
1635  $this->dbHelper->shouldReceive('doesIdExist')->withAnyArgs()->andReturn(true);
1636  $scanJobProxy = M::mock('overload:Fossology\Lib\Proxy\ScanJobProxy');
1637  $scanJobProxy->shouldReceive('createAgentStatus')
1638  ->withAnyArgs()
1639  ->andReturn($agentsRun);
1640  $this->agentDao->shouldReceive("arsTableExists")->withAnyArgs()->andReturn(true);
1641  $this->agentDao->shouldReceive("getRunningAgentIds")->withAnyArgs()->andReturn([$agentsRun]);
1642  $this->agentDao->shouldReceive("getSuccessfulAgentEntries")->withAnyArgs()->andReturn([]);
1643 
1644  $body = $this->streamFactory->createStream();
1645  $requestHeaders = new Headers();
1646  $request = new Request("POST", new Uri("HTTP", "localhost"),
1647  $requestHeaders, [], [], $body);
1648 
1649  $actualResponse = $this->uploadController->getAllAgents($request, new ResponseHelper(),["id"=>$uploadId]);
1650  $this->assertEquals(200,$actualResponse->getStatusCode());
1651 
1652  }
1660  {
1661  $uploadId = 3;
1662  $this->dbHelper->shouldReceive('doesIdExist')->withAnyArgs()->andReturn(false);
1663  $this->dbHelper->shouldReceive('doesIdExist')
1664  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(false);
1665 
1666  $this->expectException(HttpNotFoundException::class);
1667  $this->uploadController->getAllAgents(null, new ResponseHelper(),["id"=>$uploadId]);
1668 
1669  }
1677  {
1678  $uploadId = 3;
1679 
1680  $this->uploadDao->shouldReceive('isAccessible')
1681  ->withArgs([$uploadId, $this->groupId])->andReturn(false);
1682  $this->dbHelper->shouldReceive('doesIdExist')
1683  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1684 
1685  $this->expectException(HttpForbiddenException::class);
1686  $this->uploadController->getAllAgents(null, new ResponseHelper(),["id"=>$uploadId]);
1687 
1688  }
1689 
1696  public function testGetEditedLicenses()
1697  {
1698  $groupId = 2;
1699  $uploadId = 3;
1700  $uploadName = "Testing name";
1701  $this->uploadDao->shouldReceive('getParentItemBounds')
1702  ->withAnyArgs()->andReturn($this->getUploadBounds($uploadId));
1703  $this->uploadDao->shouldReceive("isAccessible")->withAnyArgs()->andReturn(true);
1704  $this->dbHelper->shouldReceive('doesIdExist')->withAnyArgs()->andReturn(true);
1705  $this->restHelper->shouldReceive('getUploadDao')->andReturn($this->uploadDao);
1706  $this->uploadDao->shouldReceive("getUploadtreeTableName")->withArgs([$uploadId])->andReturn($uploadName);
1707  $this->clearingDao->shouldReceive("getClearedLicenseIdAndMultiplicities")->withAnyArgs()->andReturn([]);
1708 
1709  $actualResponse = $this->uploadController->getEditedLicenses(null,new ResponseHelper(),["id"=>$uploadId]);
1710  $this->assertEquals(200,$actualResponse->getStatusCode());
1711  }
1712 
1720  {
1721  $groupId = 2;
1722  $uploadId = 3;
1723  $this->uploadDao->shouldReceive('getParentItemBounds')
1724  ->withAnyArgs()->andReturn($this->getUploadBounds($uploadId));
1725  $this->uploadDao->shouldReceive("isAccessible")->withAnyArgs()->andReturn(true);
1726  $this->dbHelper->shouldReceive('doesIdExist')->withAnyArgs()->andReturn(false);
1727 
1728  $this->expectException(HttpNotFoundException::class);
1729  $this->uploadController->getEditedLicenses(null,new ResponseHelper(),["id"=>$groupId]);
1730  }
1731 
1739  {
1740  $groupId = 2;
1741  $uploadId = 3;
1742  $this->uploadDao->shouldReceive('getParentItemBounds')
1743  ->withAnyArgs()->andReturn($this->getUploadBounds($uploadId));
1744  $this->uploadDao->shouldReceive("isAccessible")->withAnyArgs()->andReturn(false);
1745  $this->dbHelper->shouldReceive('doesIdExist')->withAnyArgs()->andReturn(true);
1746 
1747  $this->expectException(HttpForbiddenException::class);
1748  $this->uploadController->getEditedLicenses(null,new ResponseHelper(),["id"=>$groupId]);
1749  }
1750 
1758  public function testGetScannedLicenses()
1759  {
1760  $uploadId = 3;
1761  $agentsRun = [];
1762 
1763  $this->uploadDao->shouldReceive('isAccessible')
1764  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
1765  $this->dbHelper->shouldReceive('doesIdExist')
1766  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1767  $this->restHelper->shouldReceive('getUploadDao')->andReturn($this->uploadDao);
1768  $this->uploadDao->shouldReceive("getUploadtreeTableName")
1769  ->withArgs([$uploadId])->andReturn("uploadtree");
1770  $this->uploadDao->shouldReceive('getParentItemBounds')
1771  ->withAnyArgs()->andReturn($this->getUploadBounds($uploadId));
1772 
1773  $scanJobProxy = M::mock('overload:Fossology\Lib\Proxy\ScanJobProxy');
1774  $scanJobProxy->shouldReceive('createAgentStatus')->withAnyArgs()->andReturn($agentsRun);
1775  $scanJobProxy->shouldReceive('getLatestSuccessfulAgentIds')->andReturn([2]);
1776 
1777  $histogram = [
1778  'GPL-2.0-only' => [
1779  'rf_pk' => 2,
1780  'count' => 10,
1781  'unique' => 5,
1782  'spdx_id' => 'GPL-2.0-only',
1783  ],
1784  ];
1785  $this->licenseDao->shouldReceive('getLicenseHistogram')
1786  ->withAnyArgs()->andReturn($histogram);
1787 
1788  $body = $this->streamFactory->createStream();
1789  $request = new Request("GET", new Uri("HTTP", "localhost"),
1790  new Headers(), [], [], $body);
1791 
1792  $actualResponse = $this->uploadController->getScannedLicenses(
1793  $request, new ResponseHelper(), ["id" => $uploadId]);
1794 
1795  $this->assertEquals(200, $actualResponse->getStatusCode());
1796  $responseBody = $this->getResponseJson($actualResponse);
1797  $this->assertCount(1, $responseBody);
1798  $this->assertEquals(2, $responseBody[0]['id']);
1799  $this->assertEquals('GPL-2.0-only', $responseBody[0]['shortname']);
1800  $this->assertEquals(10, $responseBody[0]['occurence']);
1801  $this->assertEquals(5, $responseBody[0]['unique']);
1802  }
1803 
1813  {
1814  $uploadId = 3;
1815  $agentsRun = [];
1816 
1817  $this->uploadDao->shouldReceive('isAccessible')
1818  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
1819  $this->dbHelper->shouldReceive('doesIdExist')
1820  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1821  $this->restHelper->shouldReceive('getUploadDao')->andReturn($this->uploadDao);
1822  $this->uploadDao->shouldReceive("getUploadtreeTableName")
1823  ->withArgs([$uploadId])->andReturn("uploadtree");
1824  $this->uploadDao->shouldReceive('getParentItemBounds')
1825  ->withAnyArgs()->andReturn($this->getUploadBounds($uploadId));
1826 
1827  $scanJobProxy = M::mock('overload:Fossology\Lib\Proxy\ScanJobProxy');
1828  $scanJobProxy->shouldReceive('createAgentStatus')->withAnyArgs()->andReturn($agentsRun);
1829  $scanJobProxy->shouldReceive('getLatestSuccessfulAgentIds')->andReturn([2]);
1830 
1831  $histogram = [
1832  'MIT' => [
1833  'rf_pk' => 5,
1834  'count' => 3,
1835  'unique' => 2,
1836  'spdx_id' => 'MIT',
1837  ],
1838  LicenseDao::NO_LICENSE_FOUND => [
1839  'rf_pk' => 0,
1840  'count' => 7,
1841  'unique' => 4,
1842  'spdx_id' => LicenseDao::NO_LICENSE_FOUND,
1843  ],
1844  ];
1845  $this->licenseDao->shouldReceive('getLicenseHistogram')
1846  ->withAnyArgs()->andReturn($histogram);
1847 
1848  $body = $this->streamFactory->createStream();
1849  $request = new Request("GET", new Uri("HTTP", "localhost"),
1850  new Headers(), [], [], $body);
1851 
1852  $actualResponse = $this->uploadController->getScannedLicenses(
1853  $request, new ResponseHelper(), ["id" => $uploadId]);
1854 
1855  $this->assertEquals(200, $actualResponse->getStatusCode());
1856  $responseBody = $this->getResponseJson($actualResponse);
1857  $this->assertCount(2, $responseBody);
1858 
1859  $noLicenseEntry = array_values(array_filter($responseBody, function ($e) {
1860  return $e['shortname'] === LicenseDao::NO_LICENSE_FOUND;
1861  }))[0];
1862  $this->assertEquals(0, $noLicenseEntry['id']);
1863  $this->assertEquals(7, $noLicenseEntry['occurence']);
1864  }
1865 
1873  {
1874  $uploadId = 3;
1875  $this->uploadDao->shouldReceive('isAccessible')
1876  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
1877  $this->dbHelper->shouldReceive('doesIdExist')
1878  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(false);
1879 
1880  $body = $this->streamFactory->createStream();
1881  $requestHeaders = new Headers();
1882  $request = new Request("GET", new Uri("HTTP", "localhost"),
1883  $requestHeaders, [], [], $body);
1884 
1885  $this->expectException(HttpNotFoundException::class);
1886  $this->uploadController->getScannedLicenses($request,new ResponseHelper(),["id"=>$uploadId]);
1887  }
1888 
1896  public function testAgentsRevision()
1897  {
1898  $uploadId = 3;
1899  $agentsRun = [
1900  ["uploadId" => $uploadId, 'agentName' => 'nomos', 'successfulAgents'=> [], 'currentAgentId' => 2, 'isAgentRunning' => false],
1901  ["uploadId" => $uploadId,'agentName' => 'monk', "successfulAgents" => [], 'currentAgentId' => 3, 'isAgentRunning' => false]
1902  ];
1903  $agent = new Agent([],$uploadId,"MOMO agent",45,"4.4.0.37.072417",false,"");
1904 
1905  $this->uploadDao->shouldReceive('isAccessible')
1906  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
1907  $this->dbHelper->shouldReceive('doesIdExist')
1908  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1909  $scanJobProxy = M::mock('overload:Fossology\Lib\Proxy\ScanJobProxy');
1910 
1911  $scanJobProxy->shouldReceive('createAgentStatus')
1912  ->withAnyArgs()
1913  ->andReturn($agentsRun);
1914  $scanJobProxy->shouldReceive("getSuccessfulAgents")->andReturn($agent);
1915  $this->agentDao->shouldReceive("arsTableExists")->withAnyArgs()->andReturn(true);
1916  $this->agentDao->shouldReceive("getSuccessfulAgentEntries")->withAnyArgs()->andReturn([]);
1917  $this->agentDao->shouldReceive("getRunningAgentIds")->withAnyArgs()->andReturn([$agent]);
1918 
1919  $actualResponse = $this->uploadController->getAgentsRevision(null,new ResponseHelper(),["id"=>$uploadId]);
1920  $this->assertEquals(200,$actualResponse->getStatusCode());
1921  }
1922 
1929  public function testAgentsRevisionNotFound()
1930  {
1931  $uploadId = 3;
1932 
1933  $this->dbHelper->shouldReceive('doesIdExist')
1934  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(false);
1935 
1936  $this->expectException(HttpNotFoundException::class);
1937  $this->uploadController->getAgentsRevision(null,new ResponseHelper(),["id"=>$uploadId]);
1938  }
1939 
1947  {
1948  $uploadId = 3;
1949 
1950  $this->uploadDao->shouldReceive('isAccessible')
1951  ->withArgs([$uploadId, $this->groupId])->andReturn(false);
1952  $this->dbHelper->shouldReceive('doesIdExist')
1953  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1954 
1955  $this->expectException(HttpForbiddenException::class);
1956  $this->uploadController->getAgentsRevision(null,new ResponseHelper(),["id"=>$uploadId]);
1957  }
1958 
1965  public function testGetTopItem()
1966  {
1967  $uploadId = 2;
1968 
1969  $this->dbHelper->shouldReceive('doesIdExist')
1970  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1971  $this->uploadDao->shouldReceive('getParentItemBounds')
1972  ->withAnyArgs()->andReturn($this->getUploadBounds($uploadId));
1973  $this->uploadDao->shouldReceive("getUploadtreeTableName")->withArgs([$uploadId])->andReturn("uploadtree");
1974 
1975  $actualResponse = $this->uploadController->getTopItem(null,new ResponseHelper(),["id"=>$uploadId]);
1976  $itemTreeBounds = $this->getUploadBounds($uploadId);
1977  $info = new Info(200, $itemTreeBounds->getItemId(), InfoType::INFO);
1978  $expectedResponse = (new ResponseHelper())->withJson($info->getArray(), $info->getCode());
1979 
1980  $this->assertEquals($expectedResponse->getStatusCode(),$actualResponse->getStatusCode());
1981 
1982  }
1983 
1991  {
1992  $uploadId = 2;
1993 
1994  $this->dbHelper->shouldReceive('doesIdExist')
1995  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(false);
1996 
1997  $actualResponse = $this->uploadController->getTopItem(null,new ResponseHelper(),["id"=>$uploadId]);
1998  $info = new Info(404, "Upload does not exist", InfoType::ERROR);
1999  $expectedResponse = (new ResponseHelper())->withJson($info->getArray(), $info->getCode());
2000  $this->assertEquals($expectedResponse->getStatusCode(), $actualResponse->getStatusCode());
2001 
2002  }
2003 
2004 
2013  {
2014  $uploadId = 12;
2015 
2016  $this->dbHelper->shouldReceive('doesIdExist')
2017  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
2018  $this->uploadDao->shouldReceive('getParentItemBounds')
2019  ->withAnyArgs()->andReturn($this->getUploadBounds($uploadId));
2020  $this->uploadDao->shouldReceive("getUploadtreeTableName")->withArgs([$uploadId])->andReturn("uploadtree");
2021 
2022  $actualResponse = $this->uploadController->getTopItem(null,new ResponseHelper(),["id"=>$uploadId]);
2023 
2024 
2025  $this->assertEquals(500,$actualResponse->getStatusCode());
2026 
2027  }
2028 }
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
Hash model holding information about file like checksums and size.
Definition: Hash.php:18
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 class to hold Upload info.
Definition: Upload.php:17
fo_dbManager * dbManager
fo_dbManager object
Definition: process.c:16