FOSSology  4.6.0
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  }
821 
830  {
831  $this->testPostUploadFolderNotAccessible(ApiVersion::V1);
832  }
833 
842  {
843  $this->testPostUploadFolderNotAccessible(ApiVersion::V2);
844  }
845 
850  private function testPostUploadFolderNotAccessible(int $version)
851  {
852  $folderId = 2;
853  $uploadDescription = "Test Upload";
854 
855  $requestHeaders = new Headers();
856  $requestHeaders->setHeader('Content-type', 'application/json');
857  if ($version == ApiVersion::V2) {
858  $body = $this->streamFactory->createStream(json_encode([
859  "location" => "data",
860  "folderId" => $folderId,
861  "uploadDescription" => $uploadDescription,
862  "ignoreScm" => "true",
863  "scanOptions" => "scanOptions",
864  "uploadType" => "vcs"
865  ]));
866  } else {
867  $body = $this->streamFactory->createStream(json_encode([
868  "location" => "data",
869  "scanOptions" => "scanOptions"
870  ]));
871  $requestHeaders->setHeader('folderId', $folderId);
872  $requestHeaders->setHeader('uploadDescription', $uploadDescription);
873  $requestHeaders->setHeader('ignoreScm', 'true');
874  $requestHeaders->setHeader('Content-Type', 'application/json');
875  $requestHeaders->setHeader('uploadType', 'vcs');
876  }
877  $request = new Request("POST", new Uri("HTTP", "localhost"),
878  $requestHeaders, [], [], $body);
879  if ($version == ApiVersion::V2) {
880  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME,
881  ApiVersion::V2);
882  }
883 
884  $uploadHelper = M::mock('overload:Fossology\UI\Api\Helper\UploadHelper');
885 
886  $this->folderDao->shouldReceive('getAllFolderIds')->andReturn([2,3,4]);
887  $this->folderDao->shouldReceive('isFolderAccessible')
888  ->withArgs([$folderId])->andReturn(false);
889  $this->expectException(HttpForbiddenException::class);
890 
891  $this->uploadController->postUpload($request, new ResponseHelper(),
892  []);
893  }
894 
903  {
904  $this->testPostUploadFolderNotFound(ApiVersion::V1);
905  }
906 
915  {
916  $this->testPostUploadFolderNotFound(ApiVersion::V2);
917  }
918 
923  private function testPostUploadFolderNotFound(int $version)
924  {
925  $folderId = 8;
926  $uploadDescription = "Test Upload";
927 
928  $requestHeaders = new Headers();
929  $requestHeaders->setHeader('Content-type', 'application/json');
930  if ($version == ApiVersion::V2) {
931  $body = $this->streamFactory->createStream(json_encode([
932  "location" => "vcsData",
933  "folderId" => $folderId,
934  "uploadDescription" => $uploadDescription,
935  "ignoreScm" => "true",
936  "scanOptions" => "scanOptions",
937  "uploadType" => "vcs"
938  ]));
939  } else {
940  $body = $this->streamFactory->createStream(json_encode([
941  "location" => "vcsData",
942  "scanOptions" => "scanOptions"
943  ]));
944  $requestHeaders->setHeader('folderId', $folderId);
945  $requestHeaders->setHeader('uploadDescription', $uploadDescription);
946  $requestHeaders->setHeader('ignoreScm', 'true');
947  $requestHeaders->setHeader('Content-Type', 'application/json');
948  $requestHeaders->setHeader('uploadType', 'vcs');
949  }
950  $request = new Request("POST", new Uri("HTTP", "localhost"),
951  $requestHeaders, [], [], $body);
952  if ($version == ApiVersion::V2) {
953  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME,
954  ApiVersion::V2);
955  }
956 
957  $uploadHelper = M::mock('overload:Fossology\UI\Api\Helper\UploadHelper');
958 
959  $this->folderDao->shouldReceive('getAllFolderIds')->andReturn([2,3,4]);
960  $this->expectException(HttpNotFoundException::class);
961 
962  $this->uploadController->postUpload($request, new ResponseHelper(),
963  []);
964  }
965 
974  {
975  $this->testPostUploadInternalError(ApiVersion::V1);
976  }
977 
986  {
987  $this->testPostUploadInternalError(ApiVersion::V2);
988  }
989 
994  private function testPostUploadInternalError(int $version)
995  {
996  $folderId = 3;
997  $uploadDescription = "Test Upload";
998  $errorMessage = "Failed to insert upload record";
999  $errorDesc = "";
1000 
1001  $requestHeaders = new Headers();
1002  $requestHeaders->setHeader('Content-type', 'application/json');
1003  if ($version == ApiVersion::V2) {
1004  $body = $this->streamFactory->createStream(json_encode([
1005  "location" => "vcsData",
1006  "folderId" => $folderId,
1007  "uploadDescription" => $uploadDescription,
1008  "ignoreScm" => "true",
1009  "scanOptions" => "scanOptions",
1010  "uploadType" => "vcs",
1011  "excludeFolder" => "false"
1012  ]));
1013  } else {
1014  $body = $this->streamFactory->createStream(json_encode([
1015  "location" => "vcsData",
1016  "scanOptions" => "scanOptions"
1017  ]));
1018  $requestHeaders->setHeader('folderId', $folderId);
1019  $requestHeaders->setHeader('uploadDescription', $uploadDescription);
1020  $requestHeaders->setHeader('ignoreScm', 'true');
1021  $requestHeaders->setHeader('Content-Type', 'application/json');
1022  $requestHeaders->setHeader('uploadType', 'vcs');
1023  }
1024 
1025  $request = new Request("POST", new Uri("HTTP", "localhost"),
1026  $requestHeaders, [], [], $body);
1027  if ($version == ApiVersion::V2) {
1028  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME,
1029  ApiVersion::V2);
1030  }
1031 
1032  $uploadHelper = M::mock('overload:Fossology\UI\Api\Helper\UploadHelper');
1033  if ($version == ApiVersion::V2) {
1034  $uploadHelper->shouldReceive('createNewUpload')
1035  ->withArgs(['vcsData', $folderId, $uploadDescription, 'protected', 'true',
1036  'vcs', false, false])
1037  ->andReturn([false, $errorMessage, $errorDesc, [-1]]);
1038  } else {
1039  $uploadHelper->shouldReceive('createNewUpload')
1040  ->withArgs(['vcsData', $folderId, $uploadDescription, 'protected', 'true',
1041  'vcs', false])
1042  ->andReturn([false, $errorMessage, $errorDesc, [-1]]);
1043  }
1044 
1045  $this->folderDao->shouldReceive('getAllFolderIds')->andReturn([2,3,4]);
1046  $this->folderDao->shouldReceive('isFolderAccessible')
1047  ->withArgs([$folderId])->andReturn(true);
1048  $this->expectException(HttpInternalServerErrorException::class);
1049 
1050  $this->uploadController->postUpload($request, new ResponseHelper(), []);
1051  }
1052 
1060  public function testGetUploadLicensesV1()
1061  {
1062  $this->testGetUploadLicenses(ApiVersion::V1);
1063  }
1071  public function testGetUploadLicensesV2()
1072  {
1073  $this->testGetUploadLicenses(ApiVersion::V2);
1074  }
1075  private function testGetUploadLicenses($version)
1076  {
1077  $uploadId = 3;
1078  $agentsRun = [
1079  ['agentName' => 'nomos', 'currentAgentId' => 2, 'isAgentRunning' => false],
1080  ['agentName' => 'monk', 'currentAgentId' => 3, 'isAgentRunning' => false]
1081  ];
1082  $licenseResponse = [
1083  ['filePath' => 'filea', 'agentFindings' => 'MIT', 'conclusions' => 'MIT'],
1084  ['filePath' => 'fileb', 'agentFindings' => 'MIT',
1085  'conclusions' => 'No_license_found']
1086  ];
1087 
1088  $requestHeaders = new Headers();
1089  $body = $this->streamFactory->createStream();
1090  $request = new Request("POST", new Uri("HTTP", "localhost", 80,
1091  "/uploads/$uploadId/licenses", UploadController::AGENT_PARAM .
1092  "=nomos,monk&containers=false"),
1093  $requestHeaders, [], [], $body);
1094  if ($version == ApiVersion::V2) {
1095  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME,
1096  ApiVersion::V2);
1097  }
1098  $this->dbHelper->shouldReceive('doesIdExist')
1099  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1100  $this->uploadDao->shouldReceive('isAccessible')
1101  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
1102  $this->uploadDao->shouldReceive('getParentItemBounds')
1103  ->withArgs([$uploadId])->andReturn($this->getUploadBounds($uploadId));
1104  $this->agentDao->shouldReceive('arsTableExists')
1105  ->withArgs([M::anyOf('nomos', 'monk')])->andReturn(true);
1106 
1107  $scanJobProxy = M::mock('overload:Fossology\Lib\Proxy\ScanJobProxy');
1108  $scanJobProxy->shouldReceive('createAgentStatus')
1109  ->withArgs([['nomos', 'monk']])
1110  ->andReturn($agentsRun);
1111 
1112  $uploadHelper = M::mock('overload:Fossology\UI\Api\Helper\UploadHelper');
1113  $uploadHelper->shouldReceive('getUploadLicenseList')
1114  ->withArgs([$uploadId, ['nomos', 'monk'], false, true, false, 0, 50, $version])
1115  ->andReturn(([[$licenseResponse], 1]));
1116 
1117  $expectedResponse = (new ResponseHelper())->withJson($licenseResponse, 200);
1118 
1119  $actualResponse = $this->uploadController->getUploadLicenses($request,
1120  new ResponseHelper(), ['id' => $uploadId]);
1121  $this->assertEquals($expectedResponse->getStatusCode(),
1122  $actualResponse->getStatusCode());
1123  $this->assertEquals($this->getResponseJson($expectedResponse),
1124  $this->getResponseJson($actualResponse)[0]);
1125  $this->assertEquals('1',
1126  $actualResponse->getHeaderLine('X-Total-Pages'));
1127  }
1128 
1138  {
1139  $this->testGetUploadLicensesPendingScan(ApiVersion::V1);
1140  }
1150  {
1152  }
1157  private function testGetUploadLicensesPendingScan($version = ApiVersion::V2)
1158  {
1159  $uploadId = 3;
1160  $agentsRun = [
1161  ['agentName' => 'nomos', 'currentAgentId' => 2, 'isAgentRunning' => true],
1162  ['agentName' => 'monk', 'currentAgentId' => 3, 'isAgentRunning' => false]
1163  ];
1164 
1165  $requestHeaders = new Headers();
1166  $body = $this->streamFactory->createStream();
1167  $request = new Request("POST", new Uri("HTTP", "localhost", 80,
1168  "/uploads/$uploadId/licenses", UploadController::AGENT_PARAM .
1169  "=nomos,monk&containers=false"),
1170  $requestHeaders, [], [], $body);
1171  if ($version == ApiVersion::V2) {
1172  $request = $request->withQueryParams(['page' => 1, 'limit' => 2, "agent" =>"nomos,monk" ]);
1173  } else {
1174  $request = $request->withHeader("limit",2)
1175  ->withHeader("page",1);
1176  }
1177  $request = $request->withAttribute(ApiVersion::ATTRIBUTE_NAME,$version);
1178 
1179  $this->agentDao->shouldReceive("arsTableExists")->withAnyArgs()->andReturn(true);
1180  $this->agentDao->shouldReceive("getRunningAgentIds")->withAnyArgs()->andReturn([$agentsRun]);
1181  $this->agentDao->shouldReceive("getSuccessfulAgentEntries")->withAnyArgs()->andReturn([]);
1182  $scanJobProxy = M::mock('overload:Fossology\Lib\Proxy\ScanJobProxy');
1183  $this->dbHelper->shouldReceive('doesIdExist')
1184  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1185  $this->uploadDao->shouldReceive('isAccessible')
1186  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
1187  $this->uploadDao->shouldReceive('getParentItemBounds')
1188  ->withArgs([$uploadId])->andReturn($this->getUploadBounds($uploadId));
1189  $this->agentDao->shouldReceive('arsTableExists')
1190  ->withArgs([M::anyOf('nomos', 'monk')])->andReturn(true);
1191 
1192  $scanJobProxy->shouldReceive('createAgentStatus')
1193  ->withArgs([['nomos', 'monk']])
1194  ->andReturn($agentsRun);
1195  $this->expectException(HttpServiceUnavailableException::class);
1196 
1197  $this->uploadController->getUploadLicenses($request, new ResponseHelper(),
1198  ['id' => $uploadId]);
1199  }
1200 
1206  public function testUpdateUpload()
1207  {
1208  $upload = 2;
1209  $assignee = 4;
1210  $status = UploadStatus::REJECTED;
1211  $comment = "Not helpful";
1212 
1213  $resource = fopen('data://text/plain;base64,' .
1214  base64_encode($comment), 'r+');
1215  $body = $this->streamFactory->createStreamFromResource($resource);
1216  $request = new Request("POST", new Uri("HTTP", "localhost", 80,
1217  "/uploads/$upload", UploadController::FILTER_STATUS . "=Rejected&" .
1218  UploadController::FILTER_ASSIGNEE . "=$assignee"),
1219  new Headers(), [], [], $body);
1220 
1221  $this->userDao->shouldReceive('isAdvisorOrAdmin')
1222  ->withArgs([$this->userId, $this->groupId])
1223  ->andReturn(true);
1224  $this->userDao->shouldReceive('getUserChoices')
1225  ->withArgs([$this->groupId])
1226  ->andReturn([$this->userId => "fossy", $assignee => "friendly-fossy"]);
1227  $this->dbManager->shouldReceive('getSingleRow')
1228  ->withArgs([M::any(), [$assignee, $this->groupId, $upload], M::any()]);
1229  $this->dbManager->shouldReceive('getSingleRow')
1230  ->withArgs([M::any(), [$status, $comment, $this->groupId, $upload],
1231  M::any()]);
1232  $this->dbManager->shouldReceive('getSingleRow')
1233  ->withArgs([M::any(), [$upload], M::any()])
1234  ->andReturn(["exists" => ""]);
1235 
1236  $info = new Info(202, "Upload updated successfully.", InfoType::INFO);
1237  $expectedResponse = (new ResponseHelper())->withJson($info->getArray(),
1238  $info->getCode());
1239  $actualResponse = $this->uploadController->updateUpload($request,
1240  new ResponseHelper(), ['id' => $upload]);
1241  $this->assertEquals($expectedResponse->getStatusCode(),
1242  $actualResponse->getStatusCode());
1243  $this->assertEquals($this->getResponseJson($expectedResponse),
1244  $this->getResponseJson($actualResponse));
1245  }
1246 
1252  public function testUpdateUploadNoPerm()
1253  {
1254  $upload = 2;
1255  $assignee = 4;
1256  $comment = "Not helpful";
1257 
1258  $resource = fopen('data://text/plain;base64,' .
1259  base64_encode($comment), 'r+');
1260  $body = $this->streamFactory->createStreamFromResource($resource);
1261  $request = new Request("POST", new Uri("HTTP", "localhost", 80,
1262  "/uploads/$upload", UploadController::FILTER_STATUS . "=Rejected&" .
1263  UploadController::FILTER_ASSIGNEE . "=$assignee"),
1264  new Headers(), [], [], $body);
1265 
1266  $this->userDao->shouldReceive('isAdvisorOrAdmin')
1267  ->withArgs([$this->userId, $this->groupId])
1268  ->andReturn(false);
1269  $this->expectException(HttpForbiddenException::class);
1270 
1271  $this->uploadController->updateUpload($request, new ResponseHelper(),
1272  ['id' => $upload]);
1273  }
1274 
1280  public function testGetMainLicenses()
1281  {
1282  $uploadId = 1;
1283  $licenseIds = array();
1284  $licenseId = 123;
1285  $licenseIds[$licenseId] = $licenseId;
1286  $license = new License($licenseId, "MIT", "MIT License", "risk", "texts", [],
1287  'type', false);
1288 
1289  $this->uploadDao->shouldReceive('isAccessible')
1290  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
1291  $this->dbHelper->shouldReceive('doesIdExist')
1292  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1293  $this->clearingDao->shouldReceive('getMainLicenseIds')->withArgs([$uploadId, $this->groupId])->andReturn($licenseIds);
1294  $this->licenseDao->shouldReceive('getLicenseObligations')->withArgs([[$licenseId], false])->andReturn([]);
1295  $this->licenseDao->shouldReceive('getLicenseObligations')->withArgs([[$licenseId], true])->andReturn([]);
1296  $this->licenseDao->shouldReceive('getLicenseById')->withArgs([$licenseId])->andReturn($license);
1297 
1298  $licenses[] = $license->getArray();
1299  $expectedResponse = (new ResponseHelper())->withJson($licenses, 200);
1300  $actualResponse = $this->uploadController->getMainLicenses(null, new ResponseHelper(), ['id' => $uploadId]);
1301  $this->assertEquals($expectedResponse->getStatusCode(), $actualResponse->getStatusCode());
1302  $this->assertEquals($this->getResponseJson($expectedResponse), $this->getResponseJson($actualResponse));
1303  }
1304 
1305 
1311  public function testSetMainLicense()
1312  {
1313  $uploadId = 2;
1314  $shortName = "MIT";
1315  $licenseId = 1;
1316  $rq = [
1317  "shortName" => $shortName,
1318  ];
1319  $license = new License(2, $shortName, "MIT License", "risk", "texts", [],
1320  'type', 1);
1321  $licenseIds[$licenseId] = $licenseId;
1322  $this->uploadDao->shouldReceive('isAccessible')
1323  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
1324  $this->dbHelper->shouldReceive('doesIdExist')
1325  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1326  $this->licenseDao->shouldReceive('getLicenseByShortName')
1327  ->withArgs([$shortName, $this->groupId])->andReturn($license);
1328  $this->clearingDao->shouldReceive('getMainLicenseIds')->withArgs([$uploadId, $this->groupId])->andReturn($licenseIds);
1329  $this->clearingDao->shouldReceive('makeMainLicense')
1330  ->withArgs([$uploadId, $this->groupId, $license->getId()])->andReturn(null);
1331 
1332  $info = new Info(200, "Successfully added new main license", InfoType::INFO);
1333 
1334  $expectedResponse = (new ResponseHelper())->withJson($info->getArray(), $info->getCode());
1335  $reqBody = $this->streamFactory->createStream(json_encode(
1336  $rq
1337  ));
1338  $requestHeaders = new Headers();
1339  $requestHeaders->setHeader('Content-Type', 'application/json');
1340  $request = new Request("POST", new Uri("HTTP", "localhost"),
1341  $requestHeaders, [], [], $reqBody);
1342 
1343  $actualResponse = $this->uploadController->setMainLicense($request, new ResponseHelper(), ['id' => $uploadId]);
1344 
1345  $this->assertEquals($expectedResponse->getStatusCode(),
1346  $actualResponse->getStatusCode());
1347  $this->assertEquals($this->getResponseJson($expectedResponse),
1348  $this->getResponseJson($actualResponse));
1349  }
1350 
1356  public function testSetMainLicense_exists()
1357  {
1358  $uploadId = 2;
1359  $shortName = "MIT";
1360  $licenseId = 1;
1361  $rq = [
1362  "shortName" => $shortName,
1363  ];
1364  $license = new License($licenseId, $shortName, "MIT License", "risk", "texts", [],
1365  'type', 1);
1366  $licenseIds[$licenseId] = $licenseId;
1367  $this->uploadDao->shouldReceive('isAccessible')
1368  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
1369  $this->dbHelper->shouldReceive('doesIdExist')
1370  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1371  $this->licenseDao->shouldReceive('getLicenseByShortName')
1372  ->withArgs([$shortName, $this->groupId])->andReturn($license);
1373  $this->clearingDao->shouldReceive('getMainLicenseIds')->withArgs([$uploadId, $this->groupId])->andReturn($licenseIds);
1374  $this->clearingDao->shouldReceive('makeMainLicense')
1375  ->withArgs([$uploadId, $this->groupId, $license->getId()])->andReturn(null);
1376 
1377  $reqBody = $this->streamFactory->createStream(json_encode(
1378  $rq
1379  ));
1380  $requestHeaders = new Headers();
1381  $requestHeaders->setHeader('Content-Type', 'application/json');
1382  $request = new Request("POST", new Uri("HTTP", "localhost"),
1383  $requestHeaders, [], [], $reqBody);
1384  $this->expectException(HttpBadRequestException::class);
1385 
1386  $this->uploadController->setMainLicense($request, new ResponseHelper(), ['id' => $uploadId]);
1387  }
1388 
1389 
1395  public function testRemoveMainLicense()
1396  {
1397  $uploadId = 3;
1398  $licenseId = 1;
1399  $shortName = "MIT";
1400  $license = new License($licenseId, $shortName, "MIT License", "risk", "texts", [],
1401  'type', 1);
1402  $licenseIds[$licenseId] = $licenseId;
1403 
1404  $this->uploadDao->shouldReceive('isAccessible')
1405  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
1406  $this->dbHelper->shouldReceive('doesIdExist')
1407  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1408  $this->dbHelper->shouldReceive('doesIdExist')
1409  ->withArgs(["license_ref", "rf_pk", $licenseId])->andReturn(true);
1410  $this->clearingDao->shouldReceive('getMainLicenseIds')->withArgs([$uploadId, $this->groupId])->andReturn($licenseIds);
1411 
1412  $this->clearingDao->shouldReceive('removeMainLicense')->withArgs([$uploadId, $this->groupId, $licenseId])->andReturn(null);
1413  $this->licenseDao->shouldReceive('getLicenseByShortName')
1414  ->withArgs([$shortName, $this->groupId])->andReturn($license);
1415 
1416  $info = new Info(200, "Main license removed successfully.", InfoType::INFO);
1417  $expectedResponse = (new ResponseHelper())->withJson($info->getArray(),
1418  $info->getCode());
1419  $actualResponse = $this->uploadController->removeMainLicense(null,
1420  new ResponseHelper(), ['id' => $uploadId, 'shortName' => $shortName]);
1421  $this->assertEquals($expectedResponse->getStatusCode(),
1422  $actualResponse->getStatusCode());
1423  $this->assertEquals($this->getResponseJson($expectedResponse),
1424  $this->getResponseJson($actualResponse));
1425  }
1426 
1433  {
1434  $uploadId = 3;
1435  $this->uploadDao->shouldReceive('isAccessible')
1436  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
1437  $this->dbHelper->shouldReceive('doesIdExist')
1438  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1439  $this->uploadDao->shouldReceive("getUploadtreeTableName")->withArgs([$uploadId])->andReturn("uploadtree");
1440  $this->uploadDao->shouldReceive("getGlobalDecisionSettingsFromInfo")->andReturn(false);
1441  $this->agentDao->shouldReceive("arsTableExists")->andReturn(true);
1442  $this->agentDao->shouldReceive("getSuccessfulAgentEntries")->andReturn([['agent_id' => 1, 'agent_rev' => 1]]);
1443  $this->agentDao->shouldReceive("getCurrentAgentRef")->andReturn(new AgentRef(1, "agent", 1));
1444  $this->dbManager->shouldReceive("getSingleRow")
1445  ->withArgs([M::any(), [], 'no_license_uploadtree' . $uploadId])
1446  ->andReturn(['count' => 1]);
1447  $this->dbManager->shouldReceive("getSingleRow")
1448  ->withArgs([M::any(), [], 'already_cleared_uploadtree' . $uploadId])
1449  ->andReturn(['count' => 0]);
1450  $this->licenseDao->shouldReceive('getLicenseByShortName')
1451  ->withArgs(['No_license_found'])->andReturn(null);
1452  $this->licenseDao->shouldReceive('getLicenseByShortName')
1453  ->withArgs(['Void'])->andReturn(null);
1454  $res = [
1455  "totalFilesOfInterest" => 1,
1456  "totalFilesCleared" => 1,
1457  ];
1458  $expectedResponse = (new ResponseHelper())->withJson($res, 200);
1459  $actualResponse = $this->uploadController->getClearingProgressInfo(null,
1460  new ResponseHelper(), ['id' => $uploadId]);
1461  $this->assertEquals($expectedResponse->getStatusCode(),
1462  $actualResponse->getStatusCode());
1463  $this->assertEquals($this->getResponseJson($expectedResponse),
1464  $this->getResponseJson($actualResponse));
1465  }
1471  public function testGetReuseReportSummary()
1472  {
1473  $uploadId = 2;
1474  $reuseReportSummary = [
1475  'declearedLicense' => "",
1476  'clearedLicense' => "MIT, BSD-3-Clause",
1477  'usedLicense' => "",
1478  'unusedLicense' => "",
1479  'missingLicense' => "MIT, BSD-3-Clause",
1480  ];
1481  $this->uploadDao->shouldReceive('isAccessible')
1482  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
1483  $this->dbHelper->shouldReceive('doesIdExist')
1484  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1485  $this->reuseReportProcess->shouldReceive('getReuseSummary')
1486  ->withArgs([$uploadId])->andReturn($reuseReportSummary);
1487 
1488  $expectedResponse = (new ResponseHelper())->withJson($reuseReportSummary,
1489  200);
1490  $actualResponse = $this->uploadController->getReuseReportSummary(
1491  null, new ResponseHelper(), ['id' => $uploadId]);
1492  $this->assertEquals($expectedResponse->getStatusCode(),
1493  $actualResponse->getStatusCode());
1494  $this->assertEquals($this->getResponseJson($expectedResponse),
1495  $this->getResponseJson($actualResponse));
1496  }
1497 
1498 
1507  {
1508  $publicPerm = 0;
1509  $uploadId = 2;
1510 
1511  $this->uploadDao->shouldReceive('isAccessible')
1512  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
1513  $this->dbHelper->shouldReceive('doesIdExist')
1514  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1515 
1516  $this->restHelper->shouldReceive('getUploadPermissionDao')->andReturn($this->uploadPermissionDao);
1517  $this->uploadPermissionDao->shouldReceive("getPublicPermission")->withAnyArgs()->andReturn($publicPerm);
1518  $this->uploadPermissionDao->shouldReceive("getPermissionGroups")->withAnyArgs()->andReturn([]);
1519  $this->restHelper->shouldReceive("getGroupId")->andReturn($this->groupId);
1520  $this->restHelper->shouldReceive("getUserId")->andReturn($this->userId);
1521  $this->restHelper->shouldReceive("getUploadDao")->andReturn($this->uploadDao);
1522 
1523  $body = $this->streamFactory->createStream();
1524  $requestHeaders = new Headers();
1525  $request = new Request("PATCH", new Uri("HTTP", "localhost"),
1526  $requestHeaders, [], [], $body);
1527  $response = new ResponseHelper();
1528  $actualResponse = $this->uploadController->getGroupsWithPermissions($request,$response,["id"=>$this->groupId]);
1529  $this->assertEquals(200,$actualResponse->getStatusCode());
1530 
1531  }
1532 
1540  {
1541  $uploadId = 2;
1542  $this->dbHelper->shouldReceive('doesIdExist')->withAnyArgs()->andReturn(false);
1543 
1544  $this->dbHelper->shouldReceive('doesIdExist')
1545  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(false);
1546  $body = $this->streamFactory->createStream();
1547  $requestHeaders = new Headers();
1548  $request = new Request("PATCH", new Uri("HTTP", "localhost"),
1549  $requestHeaders, [], [], $body);
1550  $response = new ResponseHelper();
1551  $this->expectException(HttpNotFoundException::class);
1552  $this->uploadController->getGroupsWithPermissions($request,$response,["id"=>$this->groupId]);
1553 
1554  }
1555 
1563  {
1564  $this->dbHelper->shouldReceive('doesIdExist')->withAnyArgs()->andReturn(true);
1565  $this->uploadDao->shouldReceive('isAccessible')->withAnyArgs()->andReturn(false);
1566 
1567  $body = $this->streamFactory->createStream();
1568  $requestHeaders = new Headers();
1569  $request = new Request("PATCH", new Uri("HTTP", "localhost"),
1570  $requestHeaders, [], [], $body);
1571  $response = new ResponseHelper();
1572  $this->expectException(HttpForbiddenException::class);
1573  $this->uploadController->getGroupsWithPermissions($request,$response,["id"=>$this->groupId]);
1574 
1575  }
1576 
1581  public function testGetAllAgents()
1582  {
1583  $groupId = 2;
1584  $uploadId = 3;
1585  $agentsRun = [
1586  ["uploadId" => $uploadId, 'agentName' => 'nomos', 'successfulAgents'=> [], 'currentAgentId' => 2, 'isAgentRunning' => false],
1587  ["uploadId" => $uploadId,'agentName' => 'monk', "successfulAgents" => [], 'currentAgentId' => 3, 'isAgentRunning' => false]
1588  ];
1589 
1590  $this->restHelper->shouldReceive("getGroupId")->andReturn($groupId);
1591  $this->agentDao->shouldReceive("getCurrentAgentRef")->withAnyArgs()->andReturn(new AgentRef($uploadId,"momoa",45));
1592 
1593  $this->uploadDao->shouldReceive("isAccessible")->withAnyArgs()->andReturn(true);
1594  $this->dbHelper->shouldReceive('doesIdExist')->withAnyArgs()->andReturn(true);
1595  $scanJobProxy = M::mock('overload:Fossology\Lib\Proxy\ScanJobProxy');
1596  $scanJobProxy->shouldReceive('createAgentStatus')
1597  ->withAnyArgs()
1598  ->andReturn($agentsRun);
1599  $this->agentDao->shouldReceive("arsTableExists")->withAnyArgs()->andReturn(true);
1600  $this->agentDao->shouldReceive("getRunningAgentIds")->withAnyArgs()->andReturn([$agentsRun]);
1601  $this->agentDao->shouldReceive("getSuccessfulAgentEntries")->withAnyArgs()->andReturn([]);
1602 
1603  $body = $this->streamFactory->createStream();
1604  $requestHeaders = new Headers();
1605  $request = new Request("POST", new Uri("HTTP", "localhost"),
1606  $requestHeaders, [], [], $body);
1607 
1608  $actualResponse = $this->uploadController->getAllAgents($request, new ResponseHelper(),["id"=>$uploadId]);
1609  $this->assertEquals(200,$actualResponse->getStatusCode());
1610 
1611  }
1619  {
1620  $uploadId = 3;
1621  $this->dbHelper->shouldReceive('doesIdExist')->withAnyArgs()->andReturn(false);
1622  $this->dbHelper->shouldReceive('doesIdExist')
1623  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(false);
1624 
1625  $this->expectException(HttpNotFoundException::class);
1626  $this->uploadController->getAllAgents(null, new ResponseHelper(),["id"=>$uploadId]);
1627 
1628  }
1636  {
1637  $uploadId = 3;
1638 
1639  $this->uploadDao->shouldReceive('isAccessible')
1640  ->withArgs([$uploadId, $this->groupId])->andReturn(false);
1641  $this->dbHelper->shouldReceive('doesIdExist')
1642  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1643 
1644  $this->expectException(HttpForbiddenException::class);
1645  $this->uploadController->getAllAgents(null, new ResponseHelper(),["id"=>$uploadId]);
1646 
1647  }
1648 
1655  public function testGetEditedLicenses()
1656  {
1657  $groupId = 2;
1658  $uploadId = 3;
1659  $uploadName = "Testing name";
1660  $this->uploadDao->shouldReceive('getParentItemBounds')
1661  ->withAnyArgs()->andReturn($this->getUploadBounds($uploadId));
1662  $this->uploadDao->shouldReceive("isAccessible")->withAnyArgs()->andReturn(true);
1663  $this->dbHelper->shouldReceive('doesIdExist')->withAnyArgs()->andReturn(true);
1664  $this->restHelper->shouldReceive('getUploadDao')->andReturn($this->uploadDao);
1665  $this->uploadDao->shouldReceive("getUploadtreeTableName")->withArgs([$uploadId])->andReturn($uploadName);
1666  $this->clearingDao->shouldReceive("getClearedLicenseIdAndMultiplicities")->withAnyArgs()->andReturn([]);
1667 
1668  $actualResponse = $this->uploadController->getEditedLicenses(null,new ResponseHelper(),["id"=>$uploadId]);
1669  $this->assertEquals(200,$actualResponse->getStatusCode());
1670  }
1671 
1679  {
1680  $groupId = 2;
1681  $uploadId = 3;
1682  $this->uploadDao->shouldReceive('getParentItemBounds')
1683  ->withAnyArgs()->andReturn($this->getUploadBounds($uploadId));
1684  $this->uploadDao->shouldReceive("isAccessible")->withAnyArgs()->andReturn(true);
1685  $this->dbHelper->shouldReceive('doesIdExist')->withAnyArgs()->andReturn(false);
1686 
1687  $this->expectException(HttpNotFoundException::class);
1688  $this->uploadController->getEditedLicenses(null,new ResponseHelper(),["id"=>$groupId]);
1689  }
1690 
1698  {
1699  $groupId = 2;
1700  $uploadId = 3;
1701  $this->uploadDao->shouldReceive('getParentItemBounds')
1702  ->withAnyArgs()->andReturn($this->getUploadBounds($uploadId));
1703  $this->uploadDao->shouldReceive("isAccessible")->withAnyArgs()->andReturn(false);
1704  $this->dbHelper->shouldReceive('doesIdExist')->withAnyArgs()->andReturn(true);
1705 
1706  $this->expectException(HttpForbiddenException::class);
1707  $this->uploadController->getEditedLicenses(null,new ResponseHelper(),["id"=>$groupId]);
1708  }
1709 
1717  public function testGetScannedLicenses()
1718  {
1719  $uploadId = 3;
1720  $agentsRun = [];
1721 
1722  $this->uploadDao->shouldReceive('isAccessible')
1723  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
1724  $this->dbHelper->shouldReceive('doesIdExist')
1725  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1726  $this->restHelper->shouldReceive('getUploadDao')->andReturn($this->uploadDao);
1727  $this->uploadDao->shouldReceive("getUploadtreeTableName")
1728  ->withArgs([$uploadId])->andReturn("uploadtree");
1729  $this->uploadDao->shouldReceive('getParentItemBounds')
1730  ->withAnyArgs()->andReturn($this->getUploadBounds($uploadId));
1731 
1732  $scanJobProxy = M::mock('overload:Fossology\Lib\Proxy\ScanJobProxy');
1733  $scanJobProxy->shouldReceive('createAgentStatus')->withAnyArgs()->andReturn($agentsRun);
1734  $scanJobProxy->shouldReceive('getLatestSuccessfulAgentIds')->andReturn([2]);
1735 
1736  $histogram = [
1737  'GPL-2.0-only' => [
1738  'rf_pk' => 2,
1739  'count' => 10,
1740  'unique' => 5,
1741  'spdx_id' => 'GPL-2.0-only',
1742  ],
1743  ];
1744  $this->licenseDao->shouldReceive('getLicenseHistogram')
1745  ->withAnyArgs()->andReturn($histogram);
1746 
1747  $body = $this->streamFactory->createStream();
1748  $request = new Request("GET", new Uri("HTTP", "localhost"),
1749  new Headers(), [], [], $body);
1750 
1751  $actualResponse = $this->uploadController->getScannedLicenses(
1752  $request, new ResponseHelper(), ["id" => $uploadId]);
1753 
1754  $this->assertEquals(200, $actualResponse->getStatusCode());
1755  $responseBody = $this->getResponseJson($actualResponse);
1756  $this->assertCount(1, $responseBody);
1757  $this->assertEquals(2, $responseBody[0]['id']);
1758  $this->assertEquals('GPL-2.0-only', $responseBody[0]['shortname']);
1759  $this->assertEquals(10, $responseBody[0]['occurence']);
1760  $this->assertEquals(5, $responseBody[0]['unique']);
1761  }
1762 
1772  {
1773  $uploadId = 3;
1774  $agentsRun = [];
1775 
1776  $this->uploadDao->shouldReceive('isAccessible')
1777  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
1778  $this->dbHelper->shouldReceive('doesIdExist')
1779  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1780  $this->restHelper->shouldReceive('getUploadDao')->andReturn($this->uploadDao);
1781  $this->uploadDao->shouldReceive("getUploadtreeTableName")
1782  ->withArgs([$uploadId])->andReturn("uploadtree");
1783  $this->uploadDao->shouldReceive('getParentItemBounds')
1784  ->withAnyArgs()->andReturn($this->getUploadBounds($uploadId));
1785 
1786  $scanJobProxy = M::mock('overload:Fossology\Lib\Proxy\ScanJobProxy');
1787  $scanJobProxy->shouldReceive('createAgentStatus')->withAnyArgs()->andReturn($agentsRun);
1788  $scanJobProxy->shouldReceive('getLatestSuccessfulAgentIds')->andReturn([2]);
1789 
1790  $histogram = [
1791  'MIT' => [
1792  'rf_pk' => 5,
1793  'count' => 3,
1794  'unique' => 2,
1795  'spdx_id' => 'MIT',
1796  ],
1797  LicenseDao::NO_LICENSE_FOUND => [
1798  'rf_pk' => 0,
1799  'count' => 7,
1800  'unique' => 4,
1801  'spdx_id' => LicenseDao::NO_LICENSE_FOUND,
1802  ],
1803  ];
1804  $this->licenseDao->shouldReceive('getLicenseHistogram')
1805  ->withAnyArgs()->andReturn($histogram);
1806 
1807  $body = $this->streamFactory->createStream();
1808  $request = new Request("GET", new Uri("HTTP", "localhost"),
1809  new Headers(), [], [], $body);
1810 
1811  $actualResponse = $this->uploadController->getScannedLicenses(
1812  $request, new ResponseHelper(), ["id" => $uploadId]);
1813 
1814  $this->assertEquals(200, $actualResponse->getStatusCode());
1815  $responseBody = $this->getResponseJson($actualResponse);
1816  $this->assertCount(2, $responseBody);
1817 
1818  $noLicenseEntry = array_values(array_filter($responseBody, function ($e) {
1819  return $e['shortname'] === LicenseDao::NO_LICENSE_FOUND;
1820  }))[0];
1821  $this->assertEquals(0, $noLicenseEntry['id']);
1822  $this->assertEquals(7, $noLicenseEntry['occurence']);
1823  }
1824 
1832  {
1833  $uploadId = 3;
1834  $this->uploadDao->shouldReceive('isAccessible')
1835  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
1836  $this->dbHelper->shouldReceive('doesIdExist')
1837  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(false);
1838 
1839  $body = $this->streamFactory->createStream();
1840  $requestHeaders = new Headers();
1841  $request = new Request("GET", new Uri("HTTP", "localhost"),
1842  $requestHeaders, [], [], $body);
1843 
1844  $this->expectException(HttpNotFoundException::class);
1845  $this->uploadController->getScannedLicenses($request,new ResponseHelper(),["id"=>$uploadId]);
1846  }
1847 
1855  public function testAgentsRevision()
1856  {
1857  $uploadId = 3;
1858  $agentsRun = [
1859  ["uploadId" => $uploadId, 'agentName' => 'nomos', 'successfulAgents'=> [], 'currentAgentId' => 2, 'isAgentRunning' => false],
1860  ["uploadId" => $uploadId,'agentName' => 'monk', "successfulAgents" => [], 'currentAgentId' => 3, 'isAgentRunning' => false]
1861  ];
1862  $agent = new Agent([],$uploadId,"MOMO agent",45,"4.4.0.37.072417",false,"");
1863 
1864  $this->uploadDao->shouldReceive('isAccessible')
1865  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
1866  $this->dbHelper->shouldReceive('doesIdExist')
1867  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1868  $scanJobProxy = M::mock('overload:Fossology\Lib\Proxy\ScanJobProxy');
1869 
1870  $scanJobProxy->shouldReceive('createAgentStatus')
1871  ->withAnyArgs()
1872  ->andReturn($agentsRun);
1873  $scanJobProxy->shouldReceive("getSuccessfulAgents")->andReturn($agent);
1874  $this->agentDao->shouldReceive("arsTableExists")->withAnyArgs()->andReturn(true);
1875  $this->agentDao->shouldReceive("getSuccessfulAgentEntries")->withAnyArgs()->andReturn([]);
1876  $this->agentDao->shouldReceive("getRunningAgentIds")->withAnyArgs()->andReturn([$agent]);
1877 
1878  $actualResponse = $this->uploadController->getAgentsRevision(null,new ResponseHelper(),["id"=>$uploadId]);
1879  $this->assertEquals(200,$actualResponse->getStatusCode());
1880  }
1881 
1888  public function testAgentsRevisionNotFound()
1889  {
1890  $uploadId = 3;
1891 
1892  $this->dbHelper->shouldReceive('doesIdExist')
1893  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(false);
1894 
1895  $this->expectException(HttpNotFoundException::class);
1896  $this->uploadController->getAgentsRevision(null,new ResponseHelper(),["id"=>$uploadId]);
1897  }
1898 
1906  {
1907  $uploadId = 3;
1908 
1909  $this->uploadDao->shouldReceive('isAccessible')
1910  ->withArgs([$uploadId, $this->groupId])->andReturn(false);
1911  $this->dbHelper->shouldReceive('doesIdExist')
1912  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1913 
1914  $this->expectException(HttpForbiddenException::class);
1915  $this->uploadController->getAgentsRevision(null,new ResponseHelper(),["id"=>$uploadId]);
1916  }
1917 
1924  public function testGetTopItem()
1925  {
1926  $uploadId = 2;
1927 
1928  $this->dbHelper->shouldReceive('doesIdExist')
1929  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1930  $this->uploadDao->shouldReceive('getParentItemBounds')
1931  ->withAnyArgs()->andReturn($this->getUploadBounds($uploadId));
1932  $this->uploadDao->shouldReceive("getUploadtreeTableName")->withArgs([$uploadId])->andReturn("uploadtree");
1933 
1934  $actualResponse = $this->uploadController->getTopItem(null,new ResponseHelper(),["id"=>$uploadId]);
1935  $itemTreeBounds = $this->getUploadBounds($uploadId);
1936  $info = new Info(200, $itemTreeBounds->getItemId(), InfoType::INFO);
1937  $expectedResponse = (new ResponseHelper())->withJson($info->getArray(), $info->getCode());
1938 
1939  $this->assertEquals($expectedResponse->getStatusCode(),$actualResponse->getStatusCode());
1940 
1941  }
1942 
1950  {
1951  $uploadId = 2;
1952 
1953  $this->dbHelper->shouldReceive('doesIdExist')
1954  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(false);
1955 
1956  $actualResponse = $this->uploadController->getTopItem(null,new ResponseHelper(),["id"=>$uploadId]);
1957  $info = new Info(404, "Upload does not exist", InfoType::ERROR);
1958  $expectedResponse = (new ResponseHelper())->withJson($info->getArray(), $info->getCode());
1959  $this->assertEquals($expectedResponse->getStatusCode(), $actualResponse->getStatusCode());
1960 
1961  }
1962 
1963 
1972  {
1973  $uploadId = 12;
1974 
1975  $this->dbHelper->shouldReceive('doesIdExist')
1976  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1977  $this->uploadDao->shouldReceive('getParentItemBounds')
1978  ->withAnyArgs()->andReturn($this->getUploadBounds($uploadId));
1979  $this->uploadDao->shouldReceive("getUploadtreeTableName")->withArgs([$uploadId])->andReturn("uploadtree");
1980 
1981  $actualResponse = $this->uploadController->getTopItem(null,new ResponseHelper(),["id"=>$uploadId]);
1982 
1983 
1984  $this->assertEquals(500,$actualResponse->getStatusCode());
1985 
1986  }
1987 }
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