@@ -25,6 +25,11 @@ def packages():
2525 "version" : "1" ,
2626 "licenses" : ["authorized 1" , "unauthorized 1" ],
2727 },
28+ {
29+ "name" : "auth_one_or_unauth_one" ,
30+ "version" : "2" ,
31+ "licenses" : ["authorized 1 OR unauthorized 1" ],
32+ },
2833 {
2934 "name" : "unauth_one" ,
3035 "version" : "2" ,
@@ -52,6 +57,12 @@ def packages():
5257 },
5358 ]
5459
60+ def strategy_with_one_auth (license ):
61+ return Strategy (
62+ authorized_licenses = [license .lower ()],
63+ unauthorized_licenses = [],
64+ authorized_packages = {},
65+ )
5566
5667@pytest .mark .parametrize (
5768 ("strategy_params" , "as_regex" ),
@@ -77,13 +88,43 @@ def packages():
7788@pytest .mark .parametrize (
7889 ("level" , "reasons" ),
7990 [
80- (Level .STANDARD , [OK , OK , OK , UNAUTH , OK , UNAUTH , OK , UNKNOWN ]),
81- (Level .CAUTIOUS , [OK , OK , UNAUTH , UNAUTH , OK , UNAUTH , OK , UNKNOWN ]),
82- (Level .PARANOID , [OK , OK , UNAUTH , UNAUTH , OK , UNAUTH , UNKNOWN , UNKNOWN ]),
91+ (Level .STANDARD , [OK , OK , OK , OK , UNAUTH , OK , UNAUTH , OK , UNKNOWN ]),
92+ (Level .CAUTIOUS , [OK , OK , UNAUTH , UNAUTH , UNAUTH , OK , UNAUTH , OK , UNKNOWN ]),
93+ (Level .PARANOID , [OK , OK , UNAUTH , UNAUTH , UNAUTH , OK , UNAUTH , UNKNOWN , UNKNOWN ]),
8394 ],
8495 ids = [level .name for level in Level ],
8596)
8697def test_check_package (strategy_params , packages , level , reasons , as_regex ):
8798 strategy = Strategy (** strategy_params )
8899 for package , reason in zip (packages , reasons ):
89100 assert check_package (strategy , package , level , as_regex ) is reason
101+
102+ @pytest .mark .parametrize (
103+ "license" , [
104+ "GNU Library or Lesser General Public License (LGPL)" ,
105+ "GNU Lesser General Public License v2 or later (LGPLv2+)"
106+ ]
107+ )
108+ def test_check_package_respects_licences_with_a_lowercase_or (license ):
109+ strategy = strategy_with_one_auth (license )
110+ package = {
111+ "name" : "lgpl_example" ,
112+ "version" : "2" ,
113+ "licenses" : [license ],
114+ }
115+ assert check_package (strategy , package , Level .STANDARD , False ) is OK
116+
117+ def test_check_package_splits_licenses_with_SPDX_OR ():
118+ # The SPDX standard allows packages to specific dual licenses with an OR operator.
119+ # See https://spdx.org/spdx-specification-21-web-version#h.jxpfx0ykyb60
120+ mit_strategy = strategy_with_one_auth ("MIT" )
121+ apache_strategy = strategy_with_one_auth ("Apache-2.0" )
122+ gpl_strategy = strategy_with_one_auth ("GPL-2.0-or-later" )
123+ package = {
124+ "name" : "mit_example" ,
125+ "version" : "2" ,
126+ "licenses" : ["MIT OR Apache-2.0" ],
127+ }
128+ assert check_package (mit_strategy , package , Level .STANDARD , False ) is OK
129+ assert check_package (apache_strategy , package , Level .STANDARD , False ) is OK
130+ assert check_package (gpl_strategy , package , Level .STANDARD , False ) is UNKNOWN
0 commit comments