123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- # run with:
- # cd pysrc; python3 test_pip_resolve.py; cd ..
- from pip_resolve import satisfies_python_requirement, \
- matches_python_version, \
- matches_environment, \
- canonicalize_package_name
- from collections import namedtuple
- import unittest
- try:
- from mock import patch
- except:
- from unittest.mock import patch
- class TestStringMethods(unittest.TestCase):
- def test_canonicalize_package_name(self):
- # https://packaging.python.org/guides/distributing-packages-using-setuptools/#name
- self.assertEqual(canonicalize_package_name("Cool-Stuff"), "cool.stuff")
- self.assertEqual(canonicalize_package_name("Cool--.--Stuff"), "cool.stuff")
- self.assertEqual(canonicalize_package_name("Cool--__.__--Stuff"), "cool.stuff")
- self.assertEqual(canonicalize_package_name("cool.stuff"), "cool.stuff")
- self.assertEqual(canonicalize_package_name("COOL_STUFF"), "cool.stuff")
- self.assertEqual(canonicalize_package_name("CoOl__-.-__sTuFF"), "cool.stuff")
- def test_satisfies_python_requirement(self):
- with patch('pip_resolve.sys') as mock_sys:
- mock_sys.version_info = (2, 5)
- self.assertTrue(satisfies_python_requirement('>', '2.4'))
- mock_sys.version_info = (2, 3)
- self.assertTrue(satisfies_python_requirement('==', '2.3'))
- self.assertTrue(satisfies_python_requirement('<=', '2.3'))
- self.assertFalse(satisfies_python_requirement('<', '2.3'))
- mock_sys.version_info = (3, 5)
- self.assertTrue(satisfies_python_requirement('>', '3.1'))
- mock_sys.version_info = (2, 8)
- self.assertFalse(satisfies_python_requirement('>', '3.1'))
- mock_sys.version_info = (2, 6)
- self.assertTrue(satisfies_python_requirement('==', '2.*'))
- mock_sys.version_info = (3, 6)
- self.assertTrue(satisfies_python_requirement('==', '3.*'))
- def test_matches_python_version(self):
- req = namedtuple('requirement', ['line'])
- with patch('pip_resolve.sys') as mock_sys:
- mock_sys.version_info = (2, 5)
- req.line = "futures==3.2.0; python_version == '2.6'"
- self.assertFalse(matches_python_version(req))
- mock_sys.version_info = (2, 6)
- req.line = "futures==3.2.0; python_version == '2.6'"
- self.assertTrue(matches_python_version(req))
- mock_sys.version_info = (2, 5)
- req.line = "futures==3.2.0; python_version <= '2.6'"
- self.assertTrue(matches_python_version(req))
- mock_sys.version_info = (2, 5)
- req.line = 'futures==3.2.0; python_version <= "2.6"'
- self.assertTrue(matches_python_version(req))
- # BUG: python_version is always expected on the left side
- # mock_sys.version_info = (2, 5)
- # req.line = 'futures==3.2.0; "2.6" >= python_version'
- # self.assertTrue(matches_python_version(req))
- # BUG: Double quotes are supported but allow illegal statements
- mock_sys.version_info = (2, 5)
- req.line = '''futures==3.2.0; python_version <= '2.6"'''
- self.assertTrue(matches_python_version(req))
- mock_sys.version_info = (2, 6)
- req.line = "futures==3.2.0; python_version == '2.6' or python_version == '2.7'"
- self.assertTrue(matches_python_version(req))
- mock_sys.version_info = (2, 7)
- req.line = "futures==3.2.0 ; python_version == '2.6' or python_version == '2.7'"
- self.assertTrue(matches_python_version(req))
- mock_sys.version_info = (2, 7)
- req.line = "futures==3.2.0 ; python_version == '2.5' or python_version == '2.6'" \
- " or python_version == '2.7'"
- self.assertTrue(matches_python_version(req))
- # BUG: Comments are not supported
- #mock_sys.version_info = (2, 7)
- #req.line = "futures==3.2.0 ; python_version == '2.6' # or python_version == '2.7'"
- #self.assertFalse(matches_python_version(req))
- # BUG: The 'and' case doesn't really make sesne but should be handled correctly
- mock_sys.version_info = (2, 7)
- req.line = "futures==3.2.0 ; python_version == '2.6' and python_version == '2.7'"
- self.assertTrue(matches_python_version(req))
- mock_sys.version_info = (2, 6)
- req.line = "futures==3.2.0; python_version == '2.6' and sys_platform == 'linux2'"
- self.assertTrue(matches_python_version(req))
- mock_sys.version_info = (2, 7)
- req.line = "futures==3.2.0; python_version == '2.6' and sys_platform == 'linux2'"
- self.assertFalse(matches_python_version(req))
- def test_matches_environment(self):
- req = namedtuple('requirement', ['line'])
- with patch('pip_resolve.sys') as mock_sys:
- mock_sys.platform = "LInux2"
- req.line = "futures==3.2.0; sys_platform == 'linux2'"
- self.assertTrue(matches_environment(req))
- # BUG: sys_platform is always expected on the left side
- # mock_sys.platform = "win2000"
- # req.line = "futures==3.2.0; 'linux2' == sys_platform"
- # self.assertFalse(matches_environment(req))
- mock_sys.platform = "linux2"
- req.line = 'futures==3.2.0; sys_platform == "linux2"'
- self.assertTrue(matches_environment(req))
- mock_sys.platform = "win2000"
- req.line = "futures==3.2.0; sys_platform == 'linux2'"
- self.assertFalse (matches_environment(req))
- # BUG: Only == operator is supported in the moment
- # mock_sys.platform = "linux2"
- # req.line = "futures==3.2.0; sys_platform != 'linux2'"
- # self.assertTrue(matches_environment(req))
- # BUG: Expressions containing logical operators are not supported
- # mock_sys.platform = "win2000"
- # req.line = "futures==3.2.0; python_version == '2.6' and sys_platform == 'linux2'"
- # self.assertTrue(matches_environment(req))
- if __name__ == '__main__':
- unittest.main()
|