From 705e45b68669ec219243437be22f485539fde4e3 Mon Sep 17 00:00:00 2001 From: Ethan Jucovy Date: Mon, 2 Jul 2012 09:41:09 -0400 Subject: [PATCH] Adds tests for proper recursive upgrade behavior. refs #304 --- .../FSPkgUsesInitools/fspkg/__init__.py | 1 + tests/packages/FSPkgUsesInitools/setup.py | 25 ++++++ .../FSPkgUsesNewishInitools/fspkg/__init__.py | 1 + .../packages/FSPkgUsesNewishInitools/setup.py | 25 ++++++ tests/test_pip.py | 6 ++ tests/test_upgrade.py | 83 ++++++++++++++++++- 6 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 tests/packages/FSPkgUsesInitools/fspkg/__init__.py create mode 100644 tests/packages/FSPkgUsesInitools/setup.py create mode 100644 tests/packages/FSPkgUsesNewishInitools/fspkg/__init__.py create mode 100644 tests/packages/FSPkgUsesNewishInitools/setup.py diff --git a/tests/packages/FSPkgUsesInitools/fspkg/__init__.py b/tests/packages/FSPkgUsesInitools/fspkg/__init__.py new file mode 100644 index 00000000000..792d6005489 --- /dev/null +++ b/tests/packages/FSPkgUsesInitools/fspkg/__init__.py @@ -0,0 +1 @@ +# diff --git a/tests/packages/FSPkgUsesInitools/setup.py b/tests/packages/FSPkgUsesInitools/setup.py new file mode 100644 index 00000000000..59387ed007c --- /dev/null +++ b/tests/packages/FSPkgUsesInitools/setup.py @@ -0,0 +1,25 @@ +from setuptools import setup, find_packages + +version = '0.1' + +setup(name='FSPkgUsesInitools', + version=version, + description="File system test package", + long_description="""\ +File system test package""", + classifiers=[], # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers + keywords='pip tests', + author='pip', + author_email='pip@openplans.org', + url='http://pip.openplans.org', + license='', + packages=find_packages(exclude=['ez_setup', 'examples', 'tests']), + include_package_data=True, + zip_safe=False, + install_requires=[ + "INItools", + ], + entry_points=""" + # -*- Entry points: -*- + """, + ) diff --git a/tests/packages/FSPkgUsesNewishInitools/fspkg/__init__.py b/tests/packages/FSPkgUsesNewishInitools/fspkg/__init__.py new file mode 100644 index 00000000000..792d6005489 --- /dev/null +++ b/tests/packages/FSPkgUsesNewishInitools/fspkg/__init__.py @@ -0,0 +1 @@ +# diff --git a/tests/packages/FSPkgUsesNewishInitools/setup.py b/tests/packages/FSPkgUsesNewishInitools/setup.py new file mode 100644 index 00000000000..eea671ee792 --- /dev/null +++ b/tests/packages/FSPkgUsesNewishInitools/setup.py @@ -0,0 +1,25 @@ +from setuptools import setup, find_packages + +version = '0.1' + +setup(name='FSPkgUsesNewishInitools', + version=version, + description="File system test package", + long_description="""\ +File system test package""", + classifiers=[], # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers + keywords='pip tests', + author='pip', + author_email='pip@openplans.org', + url='http://pip.openplans.org', + license='', + packages=find_packages(exclude=['ez_setup', 'examples', 'tests']), + include_package_data=True, + zip_safe=False, + install_requires=[ + "INItools>=0.3", + ], + entry_points=""" + # -*- Entry points: -*- + """, + ) diff --git a/tests/test_pip.py b/tests/test_pip.py index 8612232cf80..45985af3a5d 100644 --- a/tests/test_pip.py +++ b/tests/test_pip.py @@ -389,6 +389,12 @@ def run(self, *args, **kw): assert not isinstance(cwd, Path) return TestPipResult(super(TestPipEnvironment, self).run(cwd=cwd, *args, **kw), verbose=self.verbose) + def get_pkg_version(self, pkg_name): + result = self.run('python', '-c', + "from pkg_resources import get_distribution; " + "print(get_distribution('%s').version)" % pkg_name) + return result.stdout.strip() + def __del__(self): rmtree(str(self.root_path), ignore_errors=True) diff --git a/tests/test_upgrade.py b/tests/test_upgrade.py index d67c02865fd..7fee19dcb31 100644 --- a/tests/test_upgrade.py +++ b/tests/test_upgrade.py @@ -1,5 +1,6 @@ import textwrap -from os.path import join +from os.path import abspath, join +from pkg_resources import parse_version from nose.tools import nottest from tests.test_pip import (here, reset_env, run_pip, assert_all_changes, write_file, pyversion, _create_test_package, @@ -57,6 +58,86 @@ def test_upgrade_with_newest_already_installed(): assert 'already up-to-date' in result.stdout, result.stdout +def test_upgrade_without_unneeded_recursive_upgrades(): + """ + When upgrading a single package, that package's own dependencies should not be + upgraded unnecessarily if the user doesn't explicitly ask for them to be upgraded. + """ + env = reset_env() + run_pip('install', 'INITools==0.2') + + to_install = abspath(join(here, 'packages', 'FSPkgUsesInitools')) + run_pip('install', to_install) + run_pip('install', '--upgrade', to_install) + assert env.get_pkg_version('initools') == '0.2',\ + ('pip install --upgrade upgraded recursive dependency INITools ' + 'when it should not have') + + +def test_upgrade_with_needed_recursive_upgrades(): + """ + When upgrading a single package A, that package's own dependencies should be + upgraded if the installed versions no longer satisfy A's requirements, even if + the user doesn't explicitly ask for them to be upgraded, + """ + env = reset_env() + to_install = abspath(join(here, 'packages', 'FSPkgUsesNewishInitools')) + run_pip('install', to_install) + run_pip('install', 'INITools==0.2') + run_pip('install', '--upgrade', to_install) + current_version = env.get_pkg_version('initools') + assert parse_version(current_version) >= parse_version('0.3'),\ + ('pip install --upgrade failed to upgrade recursive dependency ' + 'INITools when it should have') + + +def test_upgrade_with_unneeded_recursive_upgrades_explicitly_requested(): + """ + When upgrading a single package A with --upgrade-recursive, all of A's + dependencies should be upgraded as well, even if the installed versions + already satisfy A's requirements. + """ + env = reset_env() + run_pip('install', 'INITools==0.2') + + to_install = abspath(join(here, 'packages', 'FSPkgUsesInitools')) + run_pip('install', to_install) + run_pip('install', '--upgrade-recursive', to_install) + current_version = env.get_pkg_version('initools') + assert parse_version(current_version) > parse_version('0.2'),\ + ('pip install --upgrade failed to upgrade recursive dependency ' + 'INITools when it was asked to') + + +def test_upgrade_reqs_file_without_unneeded_recursive_upgrades(): + """ + When running non-recursive --upgrade against a requirements file, every package + explicitly listed in the requirements file should be upgraded; but any recursive + dependencies should not be upgraded. + """ + env = reset_env() + run_pip('install', 'INITools==0.2') + run_pip('install', 'PyLogo==0.1') + + to_install = abspath(join(here, 'packages', 'FSPkgUsesInitools')) + run_pip('install', to_install) + + write_file('test-req.txt', textwrap.dedent("""\ + %(FSPkgUsesInitools)s + PyLogo + """ % {'FSPkgUsesInitools': to_install})) + + run_pip('install', '--upgrade', '-r', env.scratch_path/ 'test-req.txt') + + pylogo_version = env.get_pkg_version('pylogo') + assert parse_version(pylogo_version) > parse_version('0.1'),\ + ('pip install --upgrade failed to upgrade explicit dependency ' + 'PyLogo when it should have') + assert env.get_pkg_version('initools') == '0.2',\ + ('pip install --upgrade upgraded recursive dependency INITools ' + 'when it should not have') + + def test_upgrade_force_reinstall_newest(): """ Force reinstallation of a package even if it is already at its newest