|
31 | 31 | from unittest import mock |
32 | 32 |
|
33 | 33 | from django.conf import settings |
| 34 | +from django.core.files.uploadedfile import SimpleUploadedFile |
34 | 35 | from django.core.management import call_command |
35 | 36 | from django.test import TestCase |
36 | 37 |
|
@@ -417,7 +418,7 @@ def test_scanpipe_pipes_outputs_to_spdx(self): |
417 | 418 | call_command("loaddata", fixtures, **{"verbosity": 0}) |
418 | 419 | project = Project.objects.get(name="asgiref") |
419 | 420 |
|
420 | | - with self.assertNumQueries(8): |
| 421 | + with self.assertNumQueries(9): |
421 | 422 | output_file = output.to_spdx(project=project, include_files=True) |
422 | 423 | self.assertIn(output_file.name, project.output_root) |
423 | 424 |
|
@@ -520,6 +521,106 @@ def test_scanpipe_pipes_outputs_to_spdx_dependencies(self, mock_uuid4): |
520 | 521 | expected_file = self.data / "spdx" / "dependencies.spdx.json" |
521 | 522 | self.assertResultsEqual(expected_file, results) |
522 | 523 |
|
| 524 | + @mock.patch("uuid.uuid4") |
| 525 | + def test_scanpipe_pipes_outputs_to_spdx_get_inputs_as_spdx_packages( |
| 526 | + self, mock_uuid4 |
| 527 | + ): |
| 528 | + forced_uuid = "b74fe5df-e965-415e-ba65-f38421a0695d" |
| 529 | + mock_uuid4.return_value = forced_uuid |
| 530 | + |
| 531 | + # 1. Input manually copied to Project's inputs |
| 532 | + project = make_project(name="Copied") |
| 533 | + copied_input = project.input_path / "input_filename" |
| 534 | + copied_input.touch() |
| 535 | + inputs_as_spdx_packages = output.get_inputs_as_spdx_packages(project) |
| 536 | + expected = [ |
| 537 | + { |
| 538 | + "name": "input_filename", |
| 539 | + "SPDXID": f"SPDXRef-scancodeio-input-{forced_uuid}", |
| 540 | + "packageFileName": "input_filename", |
| 541 | + "licenseConcluded": "NOASSERTION", |
| 542 | + "copyrightText": "NOASSERTION", |
| 543 | + "downloadLocation": "NOASSERTION", |
| 544 | + "filesAnalyzed": True, |
| 545 | + "licenseDeclared": "NOASSERTION", |
| 546 | + } |
| 547 | + ] |
| 548 | + inputs_spdx_as_dict = [package.as_dict() for package in inputs_as_spdx_packages] |
| 549 | + self.assertEqual(expected, inputs_spdx_as_dict) |
| 550 | + |
| 551 | + # 2. Input uploaded to Project's inputs |
| 552 | + project = make_project(name="Uploaded") |
| 553 | + uploaded_file = SimpleUploadedFile("filename.ext", content=b"content") |
| 554 | + input_source = project.add_upload( |
| 555 | + uploaded_file=uploaded_file, |
| 556 | + ) |
| 557 | + inputs_as_spdx_packages = output.get_inputs_as_spdx_packages(project) |
| 558 | + expected = [ |
| 559 | + { |
| 560 | + "name": "filename.ext", |
| 561 | + "SPDXID": f"SPDXRef-scancodeio-input-{input_source.uuid}", |
| 562 | + "packageFileName": "filename.ext", |
| 563 | + "licenseConcluded": "NOASSERTION", |
| 564 | + "copyrightText": "NOASSERTION", |
| 565 | + "downloadLocation": "NOASSERTION", |
| 566 | + "filesAnalyzed": True, |
| 567 | + "licenseDeclared": "NOASSERTION", |
| 568 | + } |
| 569 | + ] |
| 570 | + inputs_spdx_as_dict = [package.as_dict() for package in inputs_as_spdx_packages] |
| 571 | + self.assertEqual(expected, inputs_spdx_as_dict) |
| 572 | + |
| 573 | + # 3. Fetched (download_url, purl, docker, git, ...) |
| 574 | + project = make_project(name="Fetched") |
| 575 | + input_from_download_url = project.add_input_source( |
| 576 | + download_url="https://download.url/archive.zip", |
| 577 | + filename="archive.zip", |
| 578 | + ) |
| 579 | + input_from_purl = project.add_input_source( |
| 580 | + download_url="pkg:npm/[email protected]", |
| 581 | + filename="dnd-core-7.0.2.tgz", |
| 582 | + ) |
| 583 | + input_from_docker = project.add_input_source( |
| 584 | + download_url="docker://registry.com/debian:10.9", |
| 585 | + filename="debian_10.9.tar", |
| 586 | + ) |
| 587 | + inputs_as_spdx_packages = output.get_inputs_as_spdx_packages(project) |
| 588 | + inputs_spdx_as_dict = [package.as_dict() for package in inputs_as_spdx_packages] |
| 589 | + self.maxDiff = None |
| 590 | + expected = [ |
| 591 | + { |
| 592 | + "name": "archive.zip", |
| 593 | + "SPDXID": f"SPDXRef-scancodeio-input-{input_from_download_url.uuid}", |
| 594 | + "downloadLocation": "https://download.url/archive.zip", |
| 595 | + "licenseConcluded": "NOASSERTION", |
| 596 | + "copyrightText": "NOASSERTION", |
| 597 | + "filesAnalyzed": True, |
| 598 | + "packageFileName": "archive.zip", |
| 599 | + "licenseDeclared": "NOASSERTION", |
| 600 | + }, |
| 601 | + { |
| 602 | + "name": "debian_10.9.tar", |
| 603 | + "SPDXID": f"SPDXRef-scancodeio-input-{input_from_docker.uuid}", |
| 604 | + "downloadLocation": "docker://registry.com/debian:10.9", |
| 605 | + "licenseConcluded": "NOASSERTION", |
| 606 | + "copyrightText": "NOASSERTION", |
| 607 | + "filesAnalyzed": True, |
| 608 | + "packageFileName": "debian_10.9.tar", |
| 609 | + "licenseDeclared": "NOASSERTION", |
| 610 | + }, |
| 611 | + { |
| 612 | + "name": "dnd-core-7.0.2.tgz", |
| 613 | + "SPDXID": f"SPDXRef-scancodeio-input-{input_from_purl.uuid}", |
| 614 | + "downloadLocation": "pkg:npm/[email protected]", |
| 615 | + "licenseConcluded": "NOASSERTION", |
| 616 | + "copyrightText": "NOASSERTION", |
| 617 | + "filesAnalyzed": True, |
| 618 | + "packageFileName": "dnd-core-7.0.2.tgz", |
| 619 | + "licenseDeclared": "NOASSERTION", |
| 620 | + }, |
| 621 | + ] |
| 622 | + self.assertEqual(expected, inputs_spdx_as_dict) |
| 623 | + |
523 | 624 | def test_scanpipe_pipes_outputs_make_unknown_license_object(self): |
524 | 625 | licensing = get_licensing() |
525 | 626 | parsed_expression = licensing.parse("some-unknown-license") |
|
0 commit comments