Skip to content

Commit dba9493

Browse files
committed
Add tests for compute package rank V2
Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
1 parent e8b4bf5 commit dba9493

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
#
2+
# Copyright (c) nexB Inc. and others. All rights reserved.
3+
# VulnerableCode is a trademark of nexB Inc.
4+
# SPDX-License-Identifier: Apache-2.0
5+
# See http://www.apache.org/licenses/LICENSE-2.0 for the license text.
6+
# See https://github.com/aboutcode-org/vulnerablecode for support or download.
7+
# See https://aboutcode.org for more information about nexB OSS projects.
8+
#
9+
10+
from unittest.mock import patch
11+
12+
import pytest
13+
from univers.versions import Version
14+
15+
from vulnerabilities.models import PackageV2
16+
from vulnerabilities.pipelines.v2_improvers.computer_package_version_rank import (
17+
ComputeVersionRankPipeline,
18+
)
19+
20+
21+
@pytest.mark.django_db
22+
class TestComputeVersionRankPipeline:
23+
@pytest.fixture
24+
def pipeline(self):
25+
return ComputeVersionRankPipeline()
26+
27+
@pytest.fixture
28+
def packages(self, db):
29+
package_type = "pypi"
30+
namespace = "test_namespace"
31+
name = "test_package"
32+
PackageV2.objects.create(type=package_type, namespace=namespace, name=name, version="1.0.0")
33+
PackageV2.objects.create(type=package_type, namespace=namespace, name=name, version="1.1.0")
34+
PackageV2.objects.create(type=package_type, namespace=namespace, name=name, version="0.9.0")
35+
return PackageV2.objects.filter(type=package_type, namespace=namespace, name=name)
36+
37+
def test_compute_and_store_version_rank(self, pipeline, packages):
38+
with patch.object(pipeline, "log") as mock_log:
39+
pipeline.compute_and_store_version_rank()
40+
assert mock_log.call_count > 0
41+
for package in packages:
42+
assert package.version_rank is not None
43+
44+
def test_update_version_rank_for_group(self, pipeline, packages):
45+
with patch.object(PackageV2.objects, "bulk_update") as mock_bulk_update:
46+
pipeline.update_version_rank_for_group(packages)
47+
mock_bulk_update.assert_called_once()
48+
updated_packages = mock_bulk_update.call_args[0][0]
49+
assert len(updated_packages) == len(packages)
50+
for idx, package in enumerate(sorted(packages, key=lambda p: Version(p.version))):
51+
assert updated_packages[idx].version_rank == idx
52+
53+
def test_sort_packages_by_version(self, pipeline, packages):
54+
sorted_packages = pipeline.sort_packages_by_version(packages)
55+
versions = [p.version for p in sorted_packages]
56+
assert versions == sorted(versions, key=Version)
57+
58+
def test_sort_packages_by_version_empty(self, pipeline):
59+
assert pipeline.sort_packages_by_version([]) == []
60+
61+
def test_sort_packages_by_version_invalid_scheme(self, pipeline, packages):
62+
for package in packages:
63+
package.type = "invalid"
64+
assert pipeline.sort_packages_by_version(packages) == []
65+
66+
def test_compute_and_store_version_rank_invalid_scheme(self, pipeline):
67+
PackageV2.objects.create(type="invalid", namespace="test", name="package", version="1.0.0")
68+
with patch.object(pipeline, "log") as mock_log:
69+
pipeline.compute_and_store_version_rank()
70+
mock_log.assert_any_call("Successfully populated `version_rank` for all packages.")

0 commit comments

Comments
 (0)