test_pip_resolve.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. # run with:
  2. # cd pysrc; python3 test_pip_resolve.py; cd ..
  3. from pip_resolve import satisfies_python_requirement, \
  4. matches_python_version, \
  5. matches_environment, \
  6. canonicalize_package_name
  7. from collections import namedtuple
  8. import unittest
  9. try:
  10. from mock import patch
  11. except:
  12. from unittest.mock import patch
  13. class TestStringMethods(unittest.TestCase):
  14. def test_canonicalize_package_name(self):
  15. # https://packaging.python.org/guides/distributing-packages-using-setuptools/#name
  16. self.assertEqual(canonicalize_package_name("Cool-Stuff"), "cool.stuff")
  17. self.assertEqual(canonicalize_package_name("Cool--.--Stuff"), "cool.stuff")
  18. self.assertEqual(canonicalize_package_name("Cool--__.__--Stuff"), "cool.stuff")
  19. self.assertEqual(canonicalize_package_name("cool.stuff"), "cool.stuff")
  20. self.assertEqual(canonicalize_package_name("COOL_STUFF"), "cool.stuff")
  21. self.assertEqual(canonicalize_package_name("CoOl__-.-__sTuFF"), "cool.stuff")
  22. def test_satisfies_python_requirement(self):
  23. with patch('pip_resolve.sys') as mock_sys:
  24. mock_sys.version_info = (2, 5)
  25. self.assertTrue(satisfies_python_requirement('>', '2.4'))
  26. mock_sys.version_info = (2, 3)
  27. self.assertTrue(satisfies_python_requirement('==', '2.3'))
  28. self.assertTrue(satisfies_python_requirement('<=', '2.3'))
  29. self.assertFalse(satisfies_python_requirement('<', '2.3'))
  30. mock_sys.version_info = (3, 5)
  31. self.assertTrue(satisfies_python_requirement('>', '3.1'))
  32. mock_sys.version_info = (2, 8)
  33. self.assertFalse(satisfies_python_requirement('>', '3.1'))
  34. mock_sys.version_info = (2, 6)
  35. self.assertTrue(satisfies_python_requirement('==', '2.*'))
  36. mock_sys.version_info = (3, 6)
  37. self.assertTrue(satisfies_python_requirement('==', '3.*'))
  38. def test_matches_python_version(self):
  39. req = namedtuple('requirement', ['line'])
  40. with patch('pip_resolve.sys') as mock_sys:
  41. mock_sys.version_info = (2, 5)
  42. req.line = "futures==3.2.0; python_version == '2.6'"
  43. self.assertFalse(matches_python_version(req))
  44. mock_sys.version_info = (2, 6)
  45. req.line = "futures==3.2.0; python_version == '2.6'"
  46. self.assertTrue(matches_python_version(req))
  47. mock_sys.version_info = (2, 5)
  48. req.line = "futures==3.2.0; python_version <= '2.6'"
  49. self.assertTrue(matches_python_version(req))
  50. mock_sys.version_info = (2, 5)
  51. req.line = 'futures==3.2.0; python_version <= "2.6"'
  52. self.assertTrue(matches_python_version(req))
  53. # BUG: python_version is always expected on the left side
  54. # mock_sys.version_info = (2, 5)
  55. # req.line = 'futures==3.2.0; "2.6" >= python_version'
  56. # self.assertTrue(matches_python_version(req))
  57. # BUG: Double quotes are supported but allow illegal statements
  58. mock_sys.version_info = (2, 5)
  59. req.line = '''futures==3.2.0; python_version <= '2.6"'''
  60. self.assertTrue(matches_python_version(req))
  61. mock_sys.version_info = (2, 6)
  62. req.line = "futures==3.2.0; python_version == '2.6' or python_version == '2.7'"
  63. self.assertTrue(matches_python_version(req))
  64. mock_sys.version_info = (2, 7)
  65. req.line = "futures==3.2.0 ; python_version == '2.6' or python_version == '2.7'"
  66. self.assertTrue(matches_python_version(req))
  67. mock_sys.version_info = (2, 7)
  68. req.line = "futures==3.2.0 ; python_version == '2.5' or python_version == '2.6'" \
  69. " or python_version == '2.7'"
  70. self.assertTrue(matches_python_version(req))
  71. # BUG: Comments are not supported
  72. #mock_sys.version_info = (2, 7)
  73. #req.line = "futures==3.2.0 ; python_version == '2.6' # or python_version == '2.7'"
  74. #self.assertFalse(matches_python_version(req))
  75. # BUG: The 'and' case doesn't really make sesne but should be handled correctly
  76. mock_sys.version_info = (2, 7)
  77. req.line = "futures==3.2.0 ; python_version == '2.6' and python_version == '2.7'"
  78. self.assertTrue(matches_python_version(req))
  79. mock_sys.version_info = (2, 6)
  80. req.line = "futures==3.2.0; python_version == '2.6' and sys_platform == 'linux2'"
  81. self.assertTrue(matches_python_version(req))
  82. mock_sys.version_info = (2, 7)
  83. req.line = "futures==3.2.0; python_version == '2.6' and sys_platform == 'linux2'"
  84. self.assertFalse(matches_python_version(req))
  85. def test_matches_environment(self):
  86. req = namedtuple('requirement', ['line'])
  87. with patch('pip_resolve.sys') as mock_sys:
  88. mock_sys.platform = "LInux2"
  89. req.line = "futures==3.2.0; sys_platform == 'linux2'"
  90. self.assertTrue(matches_environment(req))
  91. # BUG: sys_platform is always expected on the left side
  92. # mock_sys.platform = "win2000"
  93. # req.line = "futures==3.2.0; 'linux2' == sys_platform"
  94. # self.assertFalse(matches_environment(req))
  95. mock_sys.platform = "linux2"
  96. req.line = 'futures==3.2.0; sys_platform == "linux2"'
  97. self.assertTrue(matches_environment(req))
  98. mock_sys.platform = "win2000"
  99. req.line = "futures==3.2.0; sys_platform == 'linux2'"
  100. self.assertFalse (matches_environment(req))
  101. # BUG: Only == operator is supported in the moment
  102. # mock_sys.platform = "linux2"
  103. # req.line = "futures==3.2.0; sys_platform != 'linux2'"
  104. # self.assertTrue(matches_environment(req))
  105. # BUG: Expressions containing logical operators are not supported
  106. # mock_sys.platform = "win2000"
  107. # req.line = "futures==3.2.0; python_version == '2.6' and sys_platform == 'linux2'"
  108. # self.assertTrue(matches_environment(req))
  109. if __name__ == '__main__':
  110. unittest.main()