FOSSology  4.7.1
Open Source License Compliance by Open Source Software
UploadTreeControllerTest.php
Go to the documentation of this file.
1 <?php
2 /*
3  SPDX-FileCopyrightText: © 2023 Samuel Dushimimana <dushsam100@gmail.com>
4 
5  SPDX-License-Identifier: GPL-2.0-only
6 */
7 
13 namespace {
14  if (!function_exists('RepPathItem')) {
15  function RepPathItem($Item, $Repo = "files")
16  {
17  return dirname(__DIR__) . "/tests.xml";
18  }
19  }
20 }
21 
23 
24  use AjaxClearingView;
26  use ClearingView;
61  use Mockery as M;
62  use Psr\Http\Message\ServerRequestInterface;
63  use Slim\Psr7\Factory\StreamFactory;
64  use Slim\Psr7\Headers;
65  use Slim\Psr7\Request;
66  use Slim\Psr7\Response;
67  use Slim\Psr7\Uri;
68  use Symfony\Component\HttpFoundation\JsonResponse;
69 
74  class UploadTreeControllerTest extends \PHPUnit\Framework\TestCase
75  {
80  private $dbHelper;
81 
86  private $dbManager;
87 
92  private $restHelper;
93 
99 
104  private $uploadDao;
105 
110  private $licenseDao;
111 
117 
122  private $highlightDao;
123 
129 
134  private $streamFactory;
135 
141 
147 
153 
159 
164  private $decisionTypes;
165 
171 
176 
186  private $groupId;
187 
191  private $uploadId;
195  private $agentId;
196 
200  private $tagId;
201 
202  protected function setUp(): void
203  {
204  global $container;
205  $this->userId = 2;
206  $this->groupId = 2;
207  $this->uploadId = 3;
208  $this->agentId = 5;
209  $this->tagId = 7;
210  $container = M::mock('ContainerBuilder');
211  $this->dbHelper = M::mock(DbHelper::class);
212  $this->dbManager = M::mock(DbManager::class);
213  $this->restHelper = M::mock(RestHelper::class);
214  $this->uploadDao = M::mock(UploadDao::class);
215  $this->decisionTypes = M::mock(DecisionTypes::class);
216  $this->licenseDao = M::mock(LicenseDao::class);
217  $this->clearingDecisionEventProcessor = M::mock(ClearingDecisionProcessor::class);
218  $this->viewFilePlugin = M::mock('ui_view');
219  $this->viewLicensePlugin = M::mock(ClearingView::class);
220  $this->clearingDao = M::mock(ClearingDao::class);
221  $this->decisionScopes = M::mock(DecisionScopes::class);
222  $this->highlightDao = M::mock(HighlightDao::class);
223  $this->clearingEventTypes = M::mock(ClearingEventTypes::class);
224  $this->itemTreeBoundsMock = M::mock(ItemTreeBounds::class);
225  $this->concludeLicensePlugin = M::mock(AjaxClearingView::class);
226  $this->licenseDao = M::mock(LicenseDao::class);
227  $this->changeLicenseBulk = M::mock(ChangeLicenseBulk::class);
228  $this->licenseDao = M::mock(LicenseDao::class);
229 
230  $this->restHelper->shouldReceive('getPlugin')
231  ->withArgs(array('view'))->andReturn($this->viewFilePlugin);
232  $this->restHelper->shouldReceive('getPlugin')
233  ->withArgs(array('view-license'))->andReturn($this->viewLicensePlugin);
234  $this->restHelper->shouldReceive('getPlugin')
235  ->withArgs(array('conclude-license'))->andReturn($this->concludeLicensePlugin);
236  $this->restHelper->shouldReceive('getPlugin')
237  ->withArgs(array('change-license-bulk'))->andReturn($this->changeLicenseBulk);
238 
239  $this->dbManager->shouldReceive('getSingleRow')
240  ->withArgs([M::any(), [$this->groupId, UploadStatus::OPEN,
241  Auth::PERM_READ]]);
242  $this->dbHelper->shouldReceive('getDbManager')->andReturn($this->dbManager);
243  $this->restHelper->shouldReceive('getDbHelper')->andReturn($this->dbHelper);
244  $this->restHelper->shouldReceive('getGroupId')->andReturn($this->groupId);
245  $this->restHelper->shouldReceive('getUserId')->andReturn($this->userId);
246  $this->restHelper->shouldReceive('getUploadDao')
247  ->andReturn($this->uploadDao);
248  $container->shouldReceive('get')->withArgs(array(
249  'helper.restHelper'))->andReturn($this->restHelper);
250  $container->shouldReceive('get')->withArgs(['decision.types'])->andReturn($this->decisionTypes);
251  $container->shouldReceive('get')->withArgs(['dao.clearing'])->andReturn($this->clearingDao);
252  $container->shouldReceive('get')->withArgs(['dao.license'])->andReturn($this->licenseDao);
253 
254  $container->shouldReceive('get')->withArgs(['businessrules.clearing_decision_processor'])->andReturn($this->clearingDecisionEventProcessor);
255  $container->shouldReceive('get')->withArgs(['dao.highlight'])->andReturn($this->highlightDao);
256  $container->shouldReceive('get')->withArgs(['dao.license'])->andReturn($this->licenseDao);
257  $this->uploadTreeController = new UploadTreeController($container);
258  $this->assertCountBefore = \Hamcrest\MatcherAssert::getCount();
259  $this->streamFactory = new StreamFactory();
260  }
261 
268  private function getResponseJson($response)
269  {
270  $response->getBody()->seek(0);
271  return json_decode($response->getBody()->getContents(), true);
272  }
273 
280  public function testViewLicenseFile($version, $tableName)
281  {
282  $upload_pk = 1;
283  $item_pk = 200;
284  $expectedContent = file_get_contents(dirname(__DIR__) . "/tests.xml");
285 
286  $this->uploadDao->shouldReceive('isAccessible')
287  ->withArgs([$upload_pk, $this->groupId])->andReturn(true);
288  $this->dbHelper->shouldReceive('doesIdExist')
289  ->withArgs(["upload", "upload_pk", $upload_pk])->andReturn(true);
290  $this->uploadDao->shouldReceive("getUploadtreeTableName")
291  ->withArgs([$upload_pk])->andReturn($tableName);
292  $this->uploadDao->shouldReceive('getUploadEntry')
293  ->withArgs([$item_pk, $tableName])->once()
294  ->andReturn(['upload_fk' => (string) $upload_pk]);
295 
296  $this->viewFilePlugin->shouldReceive('getText')->withArgs([M::any(), 0, 0, -1, null, false, true])->andReturn($expectedContent);
297 
298  $expectedResponse = new ResponseHelper();
299  $expectedResponse->getBody()->write($expectedContent);
300  $request = (new Request('GET', new Uri('http', 'localhost'),
301  new Headers(), [], [], $this->streamFactory->createStream()))
302  ->withAttribute(ApiVersion::ATTRIBUTE_NAME, $version);
303  $actualResponse = $this->uploadTreeController->viewLicenseFile($request,
304  new ResponseHelper(), ['id' => $upload_pk, 'itemId' => $item_pk]);
305  $this->assertEquals($expectedResponse->getStatusCode(), $actualResponse->getStatusCode());
306  $this->assertEquals($expectedResponse->getBody()->getContents(), $actualResponse->getBody()->getContents());
307  }
308 
309  public function itemTableProvider(): array
310  {
311  $cases = [];
312  foreach ([ApiVersion::V1, ApiVersion::V2] as $version) {
313  foreach (['uploadtree', 'uploadtree_a', 'uploadtree_1'] as $tableName) {
314  $cases["v$version $tableName"] = [$version, $tableName];
315  }
316  }
317  return $cases;
318  }
319 
323  public function testViewLicenseFileRejectsInaccessibleUpload($version, $tableName)
324  {
325  $this->dbHelper->shouldReceive('doesIdExist')
326  ->with('upload', 'upload_pk', 1)->andReturn(true);
327  $this->uploadDao->shouldReceive('isAccessible')
328  ->with(1, $this->groupId)->andReturn(false);
329  $this->uploadDao->shouldReceive('getUploadtreeTableName')
330  ->with(1)->andReturn($tableName);
331  $this->uploadDao->shouldNotReceive('getUploadEntry');
332  $this->viewFilePlugin->shouldNotReceive('getText');
333 
334  $request = (new Request('GET', new Uri('http', 'localhost'),
335  new Headers(), [], [], $this->streamFactory->createStream()))
336  ->withAttribute(ApiVersion::ATTRIBUTE_NAME, $version);
337  $this->expectException(HttpForbiddenException::class);
338  $this->expectExceptionCode(403);
339  $this->uploadTreeController->viewLicenseFile($request, new ResponseHelper(),
340  ['id' => 1, 'itemId' => 200]);
341  }
342 
346  public function testViewLicenseFileRejectsInvalidItem($version, $tableName,
347  $itemExists, $otherUploadAccessible)
348  {
349  $uploadId = 1;
350  $itemId = 200;
351  $this->dbHelper->shouldReceive('doesIdExist')
352  ->with('upload', 'upload_pk', $uploadId)->andReturn(true);
353  $this->uploadDao->shouldReceive('isAccessible')
354  ->with($uploadId, $this->groupId)->andReturn(true);
355  $this->uploadDao->shouldReceive('isAccessible')
356  ->with(2, $this->groupId)->andReturn($otherUploadAccessible);
357  $this->uploadDao->shouldReceive('getUploadtreeTableName')
358  ->with($uploadId)->andReturn($tableName);
359  $this->uploadDao->shouldReceive('getUploadEntry')
360  ->with($itemId, $tableName)->once()
361  ->andReturn($itemExists ? ['upload_fk' => '2'] : false);
362  $this->viewFilePlugin->shouldNotReceive('getText');
363 
364  $request = (new Request('GET', new Uri('http', 'localhost'),
365  new Headers(), [], [], $this->streamFactory->createStream()))
366  ->withAttribute(ApiVersion::ATTRIBUTE_NAME, $version);
367  $this->expectException(HttpNotFoundException::class);
368  $this->expectExceptionCode(404);
369  $this->uploadTreeController->viewLicenseFile($request, new ResponseHelper(),
370  ['id' => $uploadId, 'itemId' => $itemId]);
371  }
372 
373  public function invalidItemProvider(): array
374  {
375  $cases = [];
376  foreach ([ApiVersion::V1, ApiVersion::V2] as $version) {
377  foreach (['uploadtree', 'uploadtree_a', 'uploadtree_1'] as $tableName) {
378  $cases["v$version $tableName inaccessible foreign item"] =
379  [$version, $tableName, true, false];
380  $cases["v$version $tableName accessible foreign item"] =
381  [$version, $tableName, true, true];
382  $cases["v$version $tableName missing item"] =
383  [$version, $tableName, false, false];
384  }
385  }
386  return $cases;
387  }
388 
395  {
396  $upload_pk = 1;
397  $item_pk = 200;
398  $rq = [
399  "decisionType" => 3,
400  "globalDecision" => false,
401  ];
402  $dummyDecisionTypes = array_map(function ($i) {
403  return $i;
404  }, range(1, 7));
405 
406  $this->decisionTypes->shouldReceive('getMap')
407  ->andReturn($dummyDecisionTypes);
408  $this->uploadDao->shouldReceive("getUploadtreeTableName")->withArgs([$upload_pk])->andReturn("uploadtree");
409  $this->uploadDao->shouldReceive('isAccessible')
410  ->withArgs([$upload_pk, $this->groupId])->andReturn(true);
411  $this->dbHelper->shouldReceive('doesIdExist')
412  ->withArgs(["upload", "upload_pk", $upload_pk])->andReturn(true);
413  $this->uploadDao->shouldReceive('getUploadEntry')
414  ->withArgs([$item_pk, "uploadtree"])
415  ->andReturn(['upload_fk' => (string) $upload_pk]);
416 
417 
418  $this->viewLicensePlugin->shouldReceive('updateLastItem')->withArgs([2, 2, $item_pk, $item_pk]);
419 
420  $info = new Info(200, "Successfully set decision", InfoType::INFO);
421 
422  $expectedResponse = (new ResponseHelper())->withJson($info->getArray(), $info->getCode());
423  $reqBody = $this->streamFactory->createStream(json_encode(
424  $rq
425  ));
426  $requestHeaders = new Headers();
427  $requestHeaders->setHeader('Content-Type', 'application/json');
428  $request = new Request("PUT", new Uri("HTTP", "localhost"),
429  $requestHeaders, [], [], $reqBody);
430  $actualResponse = $this->uploadTreeController->setClearingDecision($request, new ResponseHelper(), ['id' => $upload_pk, 'itemId' => $item_pk]);
431 
432  $this->assertEquals($expectedResponse->getStatusCode(),
433  $actualResponse->getStatusCode());
434  $this->assertEquals($this->getResponseJson($expectedResponse),
435  $this->getResponseJson($actualResponse));
436  }
437 
444  {
445  $upload_pk = 1;
446  $item_pk = 200;
447  $rq = [
448  "decisionType" => 40,
449  "globalDecision" => false,
450  ];
451  $dummyDecisionTypes = array_map(function ($i) {
452  return $i;
453  }, range(1, 7));
454 
455  $this->decisionTypes->shouldReceive('getMap')
456  ->andReturn($dummyDecisionTypes);
457  $this->uploadDao->shouldReceive("getUploadtreeTableName")->withArgs([$upload_pk])->andReturn("uploadtree");
458  $this->uploadDao->shouldReceive('isAccessible')
459  ->withArgs([$upload_pk, $this->groupId])->andReturn(true);
460  $this->dbHelper->shouldReceive('doesIdExist')
461  ->withArgs(["upload", "upload_pk", $upload_pk])->andReturn(true);
462  $this->uploadDao->shouldReceive('getUploadEntry')
463  ->withArgs([$item_pk, "uploadtree"])
464  ->andReturn(['upload_fk' => (string) $upload_pk]);
465 
466  $this->viewLicensePlugin->shouldReceive('updateLastItem')->withArgs([2, 2, $item_pk, $item_pk]);
467 
468  $reqBody = $this->streamFactory->createStream(json_encode(
469  $rq
470  ));
471  $requestHeaders = new Headers();
472  $requestHeaders->setHeader('Content-Type', 'application/json');
473  $request = new Request("PUT", new Uri("HTTP", "localhost"),
474  $requestHeaders, [], [], $reqBody);
475  $this->expectException(HttpBadRequestException::class);
476 
477  $this->uploadTreeController->setClearingDecision($request,
478  new ResponseHelper(), ['id' => $upload_pk, 'itemId' => $item_pk]);
479  }
485  public function testGetNextPreviousItem()
486  {
487  $itemId = 200;
488  $uploadId = 1;
489  $nextItemId = 915;
490  $prevItemId = 109;
491  $itemTreeBounds1 = new ItemTreeBounds($nextItemId, 'uploadtree_a', $uploadId, 1, 2);
492  $itemTreeBounds2 = new ItemTreeBounds($prevItemId, 'uploadtree_a', $uploadId, 1, 2);
493 
494  $item1 = new Item($itemTreeBounds1, 1, 1, 1, "fileName");
495  $item2 = new Item($itemTreeBounds2, 1, 1, 1, "fileName");
496 
497  $result = array(
498  "prevItemId" => $prevItemId,
499  "nextItemId" => $nextItemId
500  );
501  $options = array('skipThese' => "", 'groupId' => $this->groupId);
502 
503  $this->uploadDao->shouldReceive('isAccessible')
504  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
505  $this->dbHelper->shouldReceive('doesIdExist')
506  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
507  $this->uploadDao->shouldReceive('getUploadtreeTableName')->withArgs([$uploadId])->andReturn("uploadtree");
508  $this->uploadDao->shouldReceive('getUploadEntry')
509  ->withArgs([$itemId, "uploadtree"])
510  ->andReturn(['upload_fk' => (string) $uploadId]);
511 
512  $this->uploadDao->shouldReceive('getNextItem')->withArgs([$uploadId, $itemId, $options])->andReturn($item1);
513  $this->uploadDao->shouldReceive('getPreviousItem')->withArgs([$uploadId, $itemId, $options])->andReturn($item2);
514  $expectedResponse = (new ResponseHelper())->withJson($result, 200);
515  $queryParams = ['selection' => null];
516  $request = $this->getMockBuilder(ServerRequestInterface::class)
517  ->getMock();
518  $request->expects($this->any())
519  ->method('getQueryParams')
520  ->willReturn($queryParams);
521 
522  $actualResponse = $this->uploadTreeController->getNextPreviousItem($request, new ResponseHelper(), ['id' => $uploadId, 'itemId' => $itemId]);
523  $this->assertEquals($expectedResponse->getStatusCode(), $actualResponse->getStatusCode());
524  $this->assertEquals($this->getResponseJson($expectedResponse), $this->getResponseJson($actualResponse));
525  }
526 
533  {
534  $itemId = 200;
535  $uploadId = 1;
536  $nextItemId = 915;
537  $prevItemId = 109;
538  $itemTreeBounds1 = new ItemTreeBounds($nextItemId, 'uploadtree_a', $uploadId, 1, 2);
539  $itemTreeBounds2 = new ItemTreeBounds($prevItemId, 'uploadtree_a', $uploadId, 1, 2);
540 
541  $item1 = new Item($itemTreeBounds1, 1, 1, 1, "fileName");
542  $item2 = new Item($itemTreeBounds2, 1, 1, 1, "fileName");
543 
544  $options = array('skipThese' => "", 'groupId' => $this->groupId);
545 
546  $this->uploadDao->shouldReceive('isAccessible')
547  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
548  $this->dbHelper->shouldReceive('doesIdExist')
549  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
550  $this->uploadDao->shouldReceive('getUploadtreeTableName')->withArgs([$uploadId])->andReturn("uploadtree");
551  $this->uploadDao->shouldReceive('getUploadEntry')
552  ->withArgs([$itemId, "uploadtree"])
553  ->andReturn(['upload_fk' => (string) $uploadId]);
554 
555  $this->uploadDao->shouldReceive('getNextItem')->withArgs([$uploadId, $itemId, $options])->andReturn($item1);
556  $this->uploadDao->shouldReceive('getPreviousItem')->withArgs([$uploadId, $itemId, $options])->andReturn($item2);
557 
558  $queryParams = ['selection' => "invalidSelection"];
559  $request = $this->getMockBuilder(ServerRequestInterface::class)
560  ->getMock();
561  $request->expects($this->any())
562  ->method('getQueryParams')
563  ->willReturn($queryParams);
564  $this->expectException(HttpBadRequestException::class);
565 
566  $this->uploadTreeController->getNextPreviousItem($request,
567  new ResponseHelper(), ['id' => $uploadId, 'itemId' => $itemId]);
568  }
569 
575  public function testGetBulkHistory()
576  {
577  $itemId = 200;
578  $uploadId = 1;
579  $itemTreeBounds = new ItemTreeBounds($itemId, 'uploadtree', $uploadId, 1, 2);
580 
581  $res[] = array(
582  "bulkId" => 1,
583  "id" => 1,
584  "text" => "test",
585  "matched" => true,
586  "tried" => true,
587  "addedLicenses" => [],
588  "removedLicenses" => [],
589  );
590 
591  $obj = new BulkHistory(1, 1, "test", true, true, [], []);
592  $updatedRes[] = $obj->getArray();
593 
594  $this->uploadDao->shouldReceive('isAccessible')
595  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
596  $this->dbHelper->shouldReceive('doesIdExist')
597  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
598 
599  $this->uploadDao->shouldReceive('getUploadtreeTableName')->withArgs([$uploadId])->andReturn("uploadtree");
600  $this->uploadDao->shouldReceive('getUploadEntry')
601  ->withArgs([$itemId, "uploadtree"])
602  ->andReturn(['upload_fk' => (string) $uploadId]);
603 
604  $this->uploadDao->shouldReceive("getItemTreeBounds")
605  ->withArgs([$itemId, "uploadtree"])->andReturn($itemTreeBounds);
606 
607  $this->clearingDao->shouldReceive("getBulkHistory")
608  ->withArgs([$itemTreeBounds, $this->groupId])->andReturn($res);
609  $expectedResponse = (new ResponseHelper())->withJson($updatedRes, 200);
610  $actualResponse = $this->uploadTreeController->getBulkHistory(null, new ResponseHelper(), ['id' => $uploadId, 'itemId' => $itemId]);
611  $this->assertEquals($expectedResponse->getStatusCode(), $actualResponse->getStatusCode());
612  $this->assertEquals($this->getResponseJson($expectedResponse), $this->getResponseJson($actualResponse));
613  }
614 
620  public function testGetClearingHistory()
621  {
622  $itemId = 200;
623  $uploadId = 1;
624  $itemTreeBounds = new ItemTreeBounds($itemId, 'uploadtree_a', $uploadId, 1, 2);
625  $fileClearings[] = new ClearingDecision(1, 1, $itemId, 1, 1, 1, 3, 1, 1, [], 1, 1, 1);
626  $obj = new ClearingHistory(
627  date('Y-m-d', 1),
628  1,
629  "global",
630  "TO_BE_DISCUSSED",
631  [],
632  [],
633  );
634  $result[] = $obj->getArray();
635 
636  $this->uploadDao->shouldReceive('isAccessible')
637  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
638  $this->dbHelper->shouldReceive('doesIdExist')
639  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
640 
641  $this->uploadDao->shouldReceive('getUploadtreeTableName')->withArgs([$uploadId])->andReturn("uploadtree");
642  $this->uploadDao->shouldReceive('getUploadEntry')
643  ->withArgs([$itemId, "uploadtree"])
644  ->andReturn(['upload_fk' => (string) $uploadId]);
645 
646  $this->uploadDao->shouldReceive("getItemTreeBoundsFromUploadId")
647  ->withArgs([$itemId, $uploadId])->andReturn($itemTreeBounds);
648  $this->clearingDao->shouldReceive("getFileClearings")
649  ->withArgs([$itemTreeBounds, $this->groupId, false, true])->andReturn($fileClearings);
650  $this->decisionTypes->shouldReceive("getTypeName")
651  ->withArgs([$fileClearings[0]->getType()])->andReturn("test");
652  $this->decisionScopes->shouldReceive("getTypeName")->withArgs([$fileClearings[0]->getScope()])->andReturn("test");
653  $this->decisionTypes->shouldReceive("getConstantNameFromKey")
654  ->withArgs([$fileClearings[0]->getType()])->andReturn("TO_BE_DISCUSSED");
655  $expectedResponse = (new ResponseHelper())->withJson($result, 200);
656  $actualResponse = $this->uploadTreeController->getClearingHistory(null, new ResponseHelper(), ['id' => $uploadId, 'itemId' => $itemId]);
657  $this->assertEquals($expectedResponse->getStatusCode(), $actualResponse->getStatusCode());
658  $this->assertEquals($this->getResponseJson($expectedResponse), $this->getResponseJson($actualResponse));
659  }
660 
666  public function testGetHighlightEntries()
667  {
668  $uploadId = 1;
669  $itemId = 200;
670  $res [] = array(
671  "start" => 70,
672  "end" => 70,
673  "type" => "MD",
674  "licenseId" => null,
675  "refStart" => 0,
676  "refEnd" => 53,
677  "infoText" => "MIT: 'MIT License\n\nCopyright (c) <year> <copyright holders>'",
678  "htmlElement" => null
679  );
680 
681  $highlight = new Highlight($res[0]["start"], $res[0]["end"], $res[0]["type"], $res[0]["refStart"], $res[0]["refEnd"], $res[0]["infoText"]);
682  $itemTreeBounds = new ItemTreeBounds($itemId, 'uploadtree', $uploadId, 1, 2);
683 
684  $this->uploadDao->shouldReceive('isAccessible')
685  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
686  $this->dbHelper->shouldReceive('doesIdExist')
687  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
688  $this->uploadDao->shouldReceive("getUploadtreeTableName")->withArgs([$uploadId])->andReturn("uploadtree");
689  $this->uploadDao->shouldReceive('getUploadEntry')
690  ->withArgs([$itemId, "uploadtree"])
691  ->andReturn(['upload_fk' => (string) $uploadId]);
692  $this->uploadDao->shouldReceive("getItemTreeBounds")->withArgs([$itemId, "uploadtree"])->andReturn($itemTreeBounds);
693  $this->viewLicensePlugin->shouldReceive('getSelectedHighlighting')->withArgs([$itemTreeBounds, null, null, null, null, $uploadId])->andReturn([$highlight]);
694 
695  $expectedResponse = (new ResponseHelper())->withJson($res, 200);
696  $queryParams = ['clearingId' => null, 'agentId' => null, 'highlightId' => null, 'licenseId' => null];
697  $request = $this->getMockBuilder(ServerRequestInterface::class)
698  ->getMock();
699  $request->expects($this->any())
700  ->method('getQueryParams')
701  ->willReturn($queryParams);
702 
703  $actualResponse = $this->uploadTreeController->getHighlightEntries($request, new ResponseHelper(), ['id' => $uploadId, 'itemId' => $itemId]);
704  $this->assertEquals($expectedResponse->getStatusCode(), $actualResponse->getStatusCode());
705  $this->assertEquals($this->getResponseJson($expectedResponse), $this->getResponseJson($actualResponse));
706  }
707 
714  public function testGetTreeViewUploadNotFound(){
715  $sort = "sortDir";
716 
717  $this->dbHelper->shouldReceive('doesIdExist')
718  ->withArgs(["upload", "upload_pk", $this->uploadId])->andReturn(false);
719 
720 
721  $reqBody = $this->streamFactory->createStream();
722  $requestHeaders = new Headers();
723 
724  $queryParams = [
725  "agentId" => $this->agentId,
726  'sort' => $sort,
727  "showQuick" => false
728  ];
729  $uri = (new Uri('HTTP', 'localhost'))
730  ->withQuery(http_build_query($queryParams));
731 
732  $requestHeaders->setHeader('Content-Type', 'application/json');
733  $request = new Request("POST", $uri,
734  $requestHeaders, [], [], $reqBody);
735 
736  $this->expectException(HttpNotFoundException::class);
737  $this->uploadTreeController->getTreeView($request, new ResponseHelper(), ["id" => $this->uploadId, "itemId"=> 10]);
738 
739  }
740 
748  public function testGetTreeViewAgentNotFound(){
749  $sort = "sortDir";
750 
751  $this->dbHelper->shouldReceive('doesIdExist')
752  ->withArgs(["upload", "upload_pk", $this->uploadId])->andReturn(false);
753  $this->dbHelper->shouldReceive('doesIdExist')
754  ->withArgs(["agent", "agent_pk", $this->agentId])->andReturn(false);
755  $this->uploadDao->shouldReceive('isAccessible')
756  ->withArgs([$this->uploadId, $this->groupId])->andReturn(true);
757 
758  $reqBody = $this->streamFactory->createStream();
759  $requestHeaders = new Headers();
760 
761  $queryParams = [
762  "agentId" => $this->agentId,
763  'sort' => $sort,
764  "showQuick" => false
765  ];
766  $uri = (new Uri('HTTP', 'localhost'))
767  ->withQuery(http_build_query($queryParams));
768 
769  $requestHeaders->setHeader('Content-Type', 'application/json');
770  $request = new Request("POST", $uri,
771  $requestHeaders, [], [], $reqBody);
772 
773  $this->expectException(HttpNotFoundException::class);
774  $this->uploadTreeController->getTreeView($request, new ResponseHelper(), ["id" => $this->uploadId, "itemId"=> 10]);
775 
776  }
777 
785  public function testGetTreeViewTagNotFound(){
786  $sort = "sortDir";
787 
788  $this->dbHelper->shouldReceive('doesIdExist')
789  ->withArgs(["upload", "upload_pk", $this->uploadId])->andReturn(false);
790  $this->dbHelper->shouldReceive('doesIdExist')
791  ->withArgs(["tag", "tag_pk", $this->tagId])->andReturn(false);
792  $this->uploadDao->shouldReceive('isAccessible')
793  ->withArgs([$this->uploadId, $this->groupId])->andReturn(true);
794 
795  $reqBody = $this->streamFactory->createStream();
796  $requestHeaders = new Headers();
797 
798  $queryParams = [
799  "agentId" => $this->agentId,
800  'sort' => $sort,
801  "showQuick" => false
802  ];
803  $uri = (new Uri('HTTP', 'localhost'))
804  ->withQuery(http_build_query($queryParams));
805 
806  $requestHeaders->setHeader('Content-Type', 'application/json');
807  $request = new Request("POST", $uri,
808  $requestHeaders, [], [], $reqBody);
809 
810  $this->expectException(HttpNotFoundException::class);
811  $this->uploadTreeController->getTreeView($request, new ResponseHelper(), ["id" => $this->uploadId, "itemId"=> 10]);
812 
813  }
814 
823  $sort = "sortDir";
824 
825  $this->dbHelper->shouldReceive('doesIdExist')
826  ->withArgs(["upload", "upload_pk", $this->uploadId])->andReturn(true);
827  $this->uploadDao->shouldReceive('isAccessible')
828  ->withArgs([$this->uploadId, $this->groupId])->andReturn(false);
829 
830  $reqBody = $this->streamFactory->createStream();
831  $requestHeaders = new Headers();
832 
833  $queryParams = [
834  "agentId" => $this->agentId,
835  'sort' => $sort,
836  "showQuick" => false
837  ];
838  $uri = (new Uri('HTTP', 'localhost'))
839  ->withQuery(http_build_query($queryParams));
840  $requestHeaders->setHeader('Content-Type', 'application/json');
841  $request = new Request("POST", $uri,
842  $requestHeaders, [], [], $reqBody);
843  $this->expectException(HttpForbiddenException::class);
844  $this->uploadTreeController->getTreeView($request, new ResponseHelper(), ["id" => $this->uploadId, "itemId"=> 10]);
845  }
846 
847 
848 
855  public function testGetLicenseDecisions()
856  {
857  $itemId = 200;
858  $uploadId = 1;
859  $licenseId = 123;
860  $licenses = array();
861 
862  $itemTreeBounds = new ItemTreeBounds($itemId, 'uploadtree_a', $uploadId, 0, 1);
863  $addedClearingResults = [];
864 
865  $result = array(
866  'name' => 'Imported decision',
867  'clearingId' => null,
868  'agentId' => null,
869  'highlightId' => null,
870  'page' => 0,
871  'percentage' => null
872  );
873 
874  $license = new License($licenseId, "MIT", "MIT License", "text", "url", [],
875  null, false);
876  $licenseDecision = new LicenseDecision($licenseId, "MIT", "MIT License", 'text', "url", array($result),
877  '', '', false, [], null, false);
878 
879  $licenseRef = new LicenseRef($licenseId, "MIT", "MIT LICENSE", "spx");
880  $clearingEvent = new ClearingEvent(1, $itemId, 12, $this->userId, $this->groupId, 4, new ClearingLicense($licenseRef, false, "", "", "", ""));
881  $licenseDecisionResult = new ClearingResult($clearingEvent, []);
882  $addedClearingResults[$licenseId] = $licenseDecisionResult;
883 
884  $this->uploadDao->shouldReceive('isAccessible')
885  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
886  $this->dbHelper->shouldReceive('doesIdExist')
887  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
888 
889  $this->uploadDao->shouldReceive('getUploadtreeTableName')->withArgs([$uploadId])->andReturn("uploadtree");
890  $this->uploadDao->shouldReceive('getUploadEntry')
891  ->withArgs([$itemId, "uploadtree"])
892  ->andReturn(['upload_fk' => (string) $uploadId]);
893 
894  $this->uploadDao->shouldReceive("getItemTreeBoundsFromUploadId")->withArgs([$itemId, $uploadId])->andReturn($itemTreeBounds);
895  $this->itemTreeBoundsMock->shouldReceive("containsFiles")->andReturn(false);
896  $this->clearingDao->shouldReceive('getMainLicenseIds')->andReturn([]);
897  $this->clearingEventTypes->shouldReceive('getTypeName')->withArgs([$clearingEvent->getEventType()])->andReturn($result['name']);
898  $this->highlightDao->shouldReceive('getHighlightRegion')->withArgs([1])->andReturn([""]);
899  $this->clearingDecisionEventProcessor->shouldReceive("getCurrentClearings")->withArgs([$itemTreeBounds, $this->groupId, LicenseMap::CONCLUSION])->andReturn([$addedClearingResults, []]);
900  $this->licenseDao->shouldReceive('getLicenseObligations')->withArgs([[$licenseId], false])->andReturn([]);
901  $this->licenseDao->shouldReceive('getLicenseObligations')->withArgs([[$licenseId], true])->andReturn([]);
902  $this->licenseDao->shouldReceive('getLicenseById')->withArgs([$licenseId, $this->groupId])->andReturn($license);
903  $licenses[] = $licenseDecision->getArray();
904 
905  $expectedResponse = (new ResponseHelper())->withJson($licenses, 200);
906  $actualResponse = $this->uploadTreeController->getLicenseDecisions(null, new ResponseHelper(), ['id' => $uploadId, 'itemId' => $itemId]);
907  $this->assertEquals($expectedResponse->getStatusCode(), $actualResponse->getStatusCode());
908  $this->assertEquals($this->getResponseJson($expectedResponse), $this->getResponseJson($actualResponse));
909  }
910 
917  {
918  $uploadId = 1;
919  $itemId = 200;
920  $shortName = "MIT";
921  $licenseId = 23;
922  $license = new License($licenseId, "MIT", "MIT License", "risk", "texts", [],
923  'type', false);
924  $itemTreeBounds = new ItemTreeBounds($itemId, 'uploadtree_a', $uploadId, 1, 2);
925  $rq = [
926  array(
927  "shortName" => "MIT",
928  "add" => true
929  )
930  ];
931 
932  $existingLicenses = array(['DT_RowId' => "$itemId,400", 'DT_RowClass' => 'removed']);
933 
934  $this->uploadDao->shouldReceive('isAccessible')
935  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
936  $this->dbHelper->shouldReceive('doesIdExist')
937  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
938  $this->uploadDao->shouldReceive("getUploadtreeTableName")->withArgs([$uploadId])->andReturn("uploadtree");
939  $this->uploadDao->shouldReceive('getUploadEntry')
940  ->withArgs([$itemId, "uploadtree"])
941  ->andReturn(['upload_fk' => (string) $uploadId]);
942  $this->uploadDao->shouldReceive('getItemTreeBoundsFromUploadId')->withArgs([$itemId, $uploadId])->andReturn($itemTreeBounds);
943  $this->concludeLicensePlugin->shouldReceive('getCurrentSelectedLicensesTableData')->withArgs([$itemTreeBounds, $this->groupId, true])->andReturn($existingLicenses);
944  $this->licenseDao->shouldReceive('getLicenseByShortName')
945  ->withArgs([$shortName, $this->groupId])->andReturn($license);
946  $this->clearingDao->shouldReceive('insertClearingEvent')
947  ->withArgs([$itemId, $this->userId, $this->groupId, $licenseId, false])->andReturn(null);
948 
949  $info = new Info(200, 'Successfully added MIT as a new license decision.', InfoType::INFO);
950  $res = [
951  'success' => [$info->getArray()],
952  'errors' => []
953  ];
954  $expectedResponse = (new ResponseHelper())->withJson($res, 200);
955  $reqBody = $this->streamFactory->createStream(json_encode(
956  $rq
957  ));
958  $requestHeaders = new Headers();
959  $requestHeaders->setHeader('Content-Type', 'application/json');
960  $request = new Request("PUT", new Uri("HTTP", "localhost"),
961  $requestHeaders, [], [], $reqBody);
962  $actualResponse = $this->uploadTreeController->handleAddEditAndDeleteLicenseDecision($request, new ResponseHelper(), ['id' => $uploadId, 'itemId' => $itemId]);
963 
964  $this->assertEquals($expectedResponse->getStatusCode(),
965  $actualResponse->getStatusCode());
966  $this->assertEquals($this->getResponseJson($expectedResponse),
967  $this->getResponseJson($actualResponse));
968  }
969 
976  {
977  $uploadId = 1;
978  $itemId = 200;
979  $shortName = "MIT";
980  $licenseId = 23;
981  $license = new License($licenseId, "MIT", "MIT License", "risk", "texts", [],
982  'type', false);
983  $itemTreeBounds = new ItemTreeBounds($itemId, 'uploadtree_a', $uploadId, 1, 2);
984  $rq = [
985  array(
986  "shortName" => "MIT",
987  "add" => true,
988  "text" => "Updated license text",
989  )
990  ];
991 
992  $existingLicenses = array(['DT_RowId' => "$itemId,$licenseId", 'DT_RowClass' => 'removed']);
993 
994  $this->uploadDao->shouldReceive('isAccessible')
995  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
996  $this->dbHelper->shouldReceive('doesIdExist')
997  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
998  $this->uploadDao->shouldReceive("getUploadtreeTableName")->withArgs([$uploadId])->andReturn("uploadtree");
999  $this->uploadDao->shouldReceive('getUploadEntry')
1000  ->withArgs([$itemId, "uploadtree"])
1001  ->andReturn(['upload_fk' => (string) $uploadId]);
1002  $this->uploadDao->shouldReceive('getItemTreeBoundsFromUploadId')->withArgs([$itemId, $uploadId])->andReturn($itemTreeBounds);
1003  $this->concludeLicensePlugin->shouldReceive('getCurrentSelectedLicensesTableData')->withArgs([$itemTreeBounds, $this->groupId, true])->andReturn($existingLicenses);
1004  $this->licenseDao->shouldReceive('getLicenseByShortName')
1005  ->withArgs([$shortName, $this->groupId])->andReturn($license);
1006  $this->clearingDao->shouldReceive('updateClearingEvent')
1007  ->withArgs([$itemId, $this->userId, $this->groupId, $licenseId, 'reportinfo', "Updated license text"])->andReturn(null);
1008 
1009  $info = new Info(200, "Successfully updated MIT's license reportinfo", InfoType::INFO);
1010  $res = [
1011  'success' => [$info->getArray()],
1012  'errors' => []
1013  ];
1014  $expectedResponse = (new ResponseHelper())->withJson($res, 200);
1015  $reqBody = $this->streamFactory->createStream(json_encode(
1016  $rq
1017  ));
1018  $requestHeaders = new Headers();
1019  $requestHeaders->setHeader('Content-Type', 'application/json');
1020  $request = new Request("PUT", new Uri("HTTP", "localhost"),
1021  $requestHeaders, [], [], $reqBody);
1022  $actualResponse = $this->uploadTreeController->handleAddEditAndDeleteLicenseDecision($request, new ResponseHelper(), ['id' => $uploadId, 'itemId' => $itemId]);
1023 
1024  $this->assertEquals($expectedResponse->getStatusCode(),
1025  $actualResponse->getStatusCode());
1026  $this->assertEquals($this->getResponseJson($expectedResponse),
1027  $this->getResponseJson($actualResponse));
1028  }
1029 
1036  {
1037  $uploadId = 1;
1038  $itemId = 200;
1039  $shortName = "MIT";
1040  $licenseId = 23;
1041  $license = new License($licenseId, "MIT", "MIT License", "risk", "texts", [],
1042  'type', false);
1043  $itemTreeBounds = new ItemTreeBounds($itemId, 'uploadtree_a', $uploadId, 1, 2);
1044  $rq = [
1045  array(
1046  "shortName" => "MIT",
1047  "add" => false,
1048  "text" => "Updated license text",
1049  )
1050  ];
1051 
1052  $existingLicenses = array(['DT_RowId' => "$itemId,$licenseId", 'DT_RowClass' => 'removed']);
1053 
1054  $this->uploadDao->shouldReceive('isAccessible')
1055  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
1056  $this->dbHelper->shouldReceive('doesIdExist')
1057  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1058  $this->uploadDao->shouldReceive("getUploadtreeTableName")->withArgs([$uploadId])->andReturn("uploadtree");
1059  $this->uploadDao->shouldReceive('getUploadEntry')
1060  ->withArgs([$itemId, "uploadtree"])
1061  ->andReturn(['upload_fk' => (string) $uploadId]);
1062  $this->uploadDao->shouldReceive('getItemTreeBoundsFromUploadId')->withArgs([$itemId, $uploadId])->andReturn($itemTreeBounds);
1063  $this->concludeLicensePlugin->shouldReceive('getCurrentSelectedLicensesTableData')->withArgs([$itemTreeBounds, $this->groupId, true])->andReturn($existingLicenses);
1064  $this->licenseDao->shouldReceive('getLicenseByShortName')
1065  ->withArgs([$shortName, $this->groupId])->andReturn($license);
1066  $this->clearingDao->shouldReceive('insertClearingEvent')
1067  ->withArgs([$itemId, $this->userId, $this->groupId, $licenseId, true])->andReturn(null);
1068 
1069  $info = new Info(200, 'Successfully deleted MIT from license decision list.', InfoType::INFO);
1070  $res = [
1071  'success' => [$info->getArray()],
1072  'errors' => []
1073  ];
1074  $expectedResponse = (new ResponseHelper())->withJson($res, 200);
1075  $reqBody = $this->streamFactory->createStream(json_encode(
1076  $rq
1077  ));
1078  $requestHeaders = new Headers();
1079  $requestHeaders->setHeader('Content-Type', 'application/json');
1080  $request = new Request("PUT", new Uri("HTTP", "localhost"),
1081  $requestHeaders, [], [], $reqBody);
1082  $actualResponse = $this->uploadTreeController->handleAddEditAndDeleteLicenseDecision($request, new ResponseHelper(), ['id' => $uploadId, 'itemId' => $itemId]);
1083 
1084  $this->assertEquals($expectedResponse->getStatusCode(),
1085  $actualResponse->getStatusCode());
1086  $this->assertEquals($this->getResponseJson($expectedResponse),
1087  $this->getResponseJson($actualResponse));
1088  }
1089 
1095  public function testScheduleBulkScan()
1096  {
1097  $licenseId = 357;
1098  $licenseShortName = "MIT";
1099  $existingLicense = new License( $licenseId, $licenseShortName, "FULL NAME", "text", "url", [], "1");
1100  $body = [
1101  'bulkActions' => [
1102  [
1103  'licenseShortName' => $licenseShortName,
1104  'licenseText' => '',
1105  'acknowledgement' => '',
1106  'comment' => '',
1107  'licenseAction' => 'ADD'
1108  ]
1109  ],
1110  'refText' => 'Copyright (c) 2011-2023 The Bootstrap Authors',
1111  'bulkScope' => 'folder',
1112  'forceDecision' => 0,
1113  'ignoreIrre' => 0,
1114  'delimiters' => 'DEFAULT',
1115  'scanOnlyFindings' => 0
1116  ];
1117  $jobId = 122;
1118  $res = new JsonResponse(array("jqid" => $jobId));
1119 
1120  $itemId = 1;
1121  $uploadId = 1;
1122 
1123  $this->uploadDao->shouldReceive('isAccessible')
1124  ->withArgs([$uploadId, $this->groupId])->andReturn(true);
1125  $this->dbHelper->shouldReceive('doesIdExist')
1126  ->withArgs(["upload", "upload_pk", $uploadId])->andReturn(true);
1127  $this->uploadDao->shouldReceive('getUploadtreeTableName')->withArgs([$uploadId])->andReturn("uploadtree");
1128  $this->uploadDao->shouldReceive('getUploadEntry')
1129  ->withArgs([$itemId, "uploadtree"])
1130  ->andReturn(['upload_fk' => (string) $uploadId]);
1131  $this->dbHelper->shouldReceive('doesIdExist')
1132  ->withArgs(["license_ref", "rf_pk", $licenseId])->andReturn(true);
1133  $this->licenseDao->shouldReceive('getLicenseByShortName')
1134  ->withArgs([$licenseShortName, $this->groupId])
1135  ->andReturn($existingLicense);
1136  $this->changeLicenseBulk->shouldReceive('handle')
1137  ->withArgs([M::any()])
1138  ->andReturn($res);
1139 
1140  $info = new Info(201, json_decode($res->getContent(), true)["jqid"], InfoType::INFO);
1141 
1142  $reqBody = $this->streamFactory->createStream(json_encode(
1143  $body
1144  ));
1145 
1146  $requestHeaders = new Headers();
1147  $requestHeaders->setHeader('Content-Type', 'application/json');
1148  $request = new Request("POST", new Uri("HTTP", "localhost"),
1149  $requestHeaders, [], [], $reqBody);
1150 
1151  $expectedResponse = (new ResponseHelper())->withJson($info->getArray(), $info->getCode());
1152  $actualResponse = $this->uploadTreeController->scheduleBulkScan($request, new ResponseHelper(), ['id' => $uploadId, 'itemId' => $itemId]);
1153 
1154  $this->assertEquals($expectedResponse->getStatusCode(),
1155  $actualResponse->getStatusCode());
1156  $this->assertEquals($this->getResponseJson($expectedResponse),
1157  $this->getResponseJson($actualResponse));
1158  }
1159  }
1160 }
Contains the constants and helpers for authentication of user.
Definition: Auth.php:24
Utility functions to process ClearingDecision.
Wrapper class for license map.
Definition: LicenseMap.php:19
Provides helper methods to access database for REST api.
Definition: DbHelper.php:38
Override Slim response for withJson function.
Provides various DAO helper functions for REST api.
Definition: RestHelper.php:32
Different type of infos provided by REST.
Definition: InfoType.php:16
Info model to contain general error and return values.
Definition: Info.php:19
testViewLicenseFileRejectsInvalidItem($version, $tableName, $itemExists, $otherUploadAccessible)
RepPathItem($Item, $Repo="files")
Given an uploadtree_pk, retrieve the pfile path.
Definition: common-repo.php:91
fo_dbManager * dbManager
fo_dbManager object
Definition: process.c:16