From 440433fbe4482ce1b67a5534fc9a5ab61375acbb Mon Sep 17 00:00:00 2001 From: Hritik Vijay Date: Fri, 14 Jan 2022 02:23:59 +0530 Subject: [PATCH 1/4] Add tests to check from_string & from_spec equality This will avoid errors like https://github.com/nexB/univers/pull/27 popping up in future Signed-off-by: Hritik Vijay --- tests/test_version_range.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tests/test_version_range.py b/tests/test_version_range.py index b1a54a81..b904de50 100644 --- a/tests/test_version_range.py +++ b/tests/test_version_range.py @@ -5,11 +5,13 @@ # Visit https://aboutcode.org and https://github.com/nexB/univers for support and download. from unittest import TestCase +import pytest from univers.version_constraint import VersionConstraint from univers.version_range import GemVersionRange from univers.version_range import PypiVersionRange from univers.version_range import VersionRange +from univers.version_range import RANGE_CLASS_BY_SCHEMES from univers.versions import PypiVersion from univers.versions import RubygemsVersion @@ -189,3 +191,18 @@ def test_VersionRange_contains_works_for_star_range(self): from univers.versions import SemverVersion SemverVersion("1.0.0") in VersionRange.from_string("vers:nginx/*") + +@pytest.mark.parametrize("scheme, range_class", RANGE_CLASS_BY_SCHEMES.items()) +class TestVersionRangeImplementations: + VERSION_RANGES_BY_SCHEMES = { + "nginx": ["0.8.40+", "0.7.52-0.8.39", "0.9.10", "1.5.0+, 1.4.1+"], + } + + def test_from_native_and_from_string_equality(self, scheme, range_class): + if scheme not in self.VERSION_RANGES_BY_SCHEMES: + pytest.skip(f"No {scheme} in VERSION_RANGES_BY_SCHEMES") + + for rng in self.VERSION_RANGES_BY_SCHEMES.get(scheme, []): + rng_from_native = range_class.from_native(rng) + rng_from_string = range_class.from_string(rng_from_native.to_string()) + assert rng_from_native == rng_from_string From 571c2852bac8a72aa853d5b110a9e6484b28d1b8 Mon Sep 17 00:00:00 2001 From: Philippe Ombredanne Date: Fri, 14 Jan 2022 11:24:56 +0100 Subject: [PATCH 2/4] Test all schemes and that all tests have a scheme This changes the logic: 1. we iterate explicitly on the tests. If a test is for a scheme that does not exist, it will fail 2. we also check that all schemes have a test and fail if not Signed-off-by: Philippe Ombredanne --- tests/test_version_range.py | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/tests/test_version_range.py b/tests/test_version_range.py index b904de50..25e89558 100644 --- a/tests/test_version_range.py +++ b/tests/test_version_range.py @@ -192,17 +192,26 @@ def test_VersionRange_contains_works_for_star_range(self): SemverVersion("1.0.0") in VersionRange.from_string("vers:nginx/*") -@pytest.mark.parametrize("scheme, range_class", RANGE_CLASS_BY_SCHEMES.items()) -class TestVersionRangeImplementations: - VERSION_RANGES_BY_SCHEMES = { - "nginx": ["0.8.40+", "0.7.52-0.8.39", "0.9.10", "1.5.0+, 1.4.1+"], - } - - def test_from_native_and_from_string_equality(self, scheme, range_class): - if scheme not in self.VERSION_RANGES_BY_SCHEMES: - pytest.skip(f"No {scheme} in VERSION_RANGES_BY_SCHEMES") - - for rng in self.VERSION_RANGES_BY_SCHEMES.get(scheme, []): - rng_from_native = range_class.from_native(rng) - rng_from_string = range_class.from_string(rng_from_native.to_string()) - assert rng_from_native == rng_from_string +VERSION_RANGE_TESTS_BY_SCHEME = { + "nginx": ["0.8.40+", "0.7.52-0.8.39", "0.9.10", "1.5.0+, 1.4.1+"], +} + + +@pytest.mark.xfail("Not all schemes are implemented yet") +def test_all_schemes_are_tested_for_round_tripping(self): + + for scheme in RANGE_CLASS_BY_SCHEMES: + VERSION_RANGE_TESTS_BY_SCHEME[scheme] + + +@pytest.mark.parametrize( + "scheme, native_ranges", + VERSION_RANGE_TESTS_BY_SCHEME.items(), +) +def test_from_native_and_from_string_round_trip(self, scheme, native_ranges): + + range_class = RANGE_CLASS_BY_SCHEMES[scheme] + for rng in native_ranges: + from_native = range_class.from_native(rng) + from_string = range_class.from_string(from_native.to_string()) + assert from_native == from_string From 2fd2873e0b289c90496431362fa8627a03f744df Mon Sep 17 00:00:00 2001 From: Hritik Vijay Date: Fri, 14 Jan 2022 15:58:31 +0530 Subject: [PATCH 3/4] black -l 100 Signed-off-by: Hritik Vijay --- tests/test_version_range.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_version_range.py b/tests/test_version_range.py index 25e89558..444f2456 100644 --- a/tests/test_version_range.py +++ b/tests/test_version_range.py @@ -205,7 +205,7 @@ def test_all_schemes_are_tested_for_round_tripping(self): @pytest.mark.parametrize( - "scheme, native_ranges", + "scheme, native_ranges", VERSION_RANGE_TESTS_BY_SCHEME.items(), ) def test_from_native_and_from_string_round_trip(self, scheme, native_ranges): From 3b9988def7eccbe43fa5642fa8e8776cbd91340f Mon Sep 17 00:00:00 2001 From: Hritik Vijay Date: Fri, 14 Jan 2022 18:06:50 +0530 Subject: [PATCH 4/4] Fix semantic errors in last commit Signed-off-by: Hritik Vijay --- tests/test_version_range.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/tests/test_version_range.py b/tests/test_version_range.py index 444f2456..e0fb5201 100644 --- a/tests/test_version_range.py +++ b/tests/test_version_range.py @@ -192,23 +192,26 @@ def test_VersionRange_contains_works_for_star_range(self): SemverVersion("1.0.0") in VersionRange.from_string("vers:nginx/*") + VERSION_RANGE_TESTS_BY_SCHEME = { "nginx": ["0.8.40+", "0.7.52-0.8.39", "0.9.10", "1.5.0+, 1.4.1+"], } -@pytest.mark.xfail("Not all schemes are implemented yet") -def test_all_schemes_are_tested_for_round_tripping(self): - +@pytest.mark.xfail(reason="Not all schemes are implemented yet") +def test_all_schemes_are_tested_for_round_tripping(): + untested_schemes = [] for scheme in RANGE_CLASS_BY_SCHEMES: - VERSION_RANGE_TESTS_BY_SCHEME[scheme] + if scheme not in VERSION_RANGE_TESTS_BY_SCHEME: + untested_schemes.append(scheme) + assert not untested_schemes @pytest.mark.parametrize( "scheme, native_ranges", VERSION_RANGE_TESTS_BY_SCHEME.items(), ) -def test_from_native_and_from_string_round_trip(self, scheme, native_ranges): +def test_from_native_and_from_string_round_trip(scheme, native_ranges): range_class = RANGE_CLASS_BY_SCHEMES[scheme] for rng in native_ranges: