2018-04-01 00:17:47 +02:00
|
|
|
from tests.lib import create_test_package_with_setup
|
|
|
|
|
|
|
|
|
2019-01-11 11:12:44 +01:00
|
|
|
def matches_expected_lines(string, expected_lines, exact=True):
|
|
|
|
if exact:
|
|
|
|
return set(string.splitlines()) == set(expected_lines)
|
|
|
|
# If not exact, check that all expected lines are present
|
|
|
|
return set(expected_lines) <= set(string.splitlines())
|
2018-04-01 00:17:47 +02:00
|
|
|
|
|
|
|
|
2019-01-11 11:12:44 +01:00
|
|
|
def test_check_install_canonicalization(script, deprecated_python):
|
2018-04-01 00:17:47 +02:00
|
|
|
pkga_path = create_test_package_with_setup(
|
|
|
|
script,
|
2018-05-30 11:41:02 +02:00
|
|
|
name='pkgA',
|
2018-04-01 00:17:47 +02:00
|
|
|
version='1.0',
|
2018-05-30 11:41:02 +02:00
|
|
|
install_requires=['normal-missing', 'SPECIAL.missing'],
|
2018-04-01 00:17:47 +02:00
|
|
|
)
|
|
|
|
normal_path = create_test_package_with_setup(
|
|
|
|
script,
|
|
|
|
name='normal-missing', version='0.1',
|
|
|
|
)
|
2018-05-30 11:41:02 +02:00
|
|
|
special_path = create_test_package_with_setup(
|
|
|
|
script,
|
|
|
|
name='SPECIAL.missing', version='0.1',
|
|
|
|
)
|
|
|
|
|
|
|
|
# Let's install pkgA without its dependency
|
|
|
|
result = script.pip('install', '--no-index', pkga_path, '--no-deps')
|
|
|
|
assert "Successfully installed pkgA-1.0" in result.stdout, str(result)
|
|
|
|
|
|
|
|
# Install the first missing dependency. Only an error for the
|
|
|
|
# second dependency should remain.
|
2018-04-01 00:17:47 +02:00
|
|
|
result = script.pip(
|
2019-08-11 04:04:44 +02:00
|
|
|
'install',
|
|
|
|
'--no-index',
|
|
|
|
normal_path,
|
|
|
|
'--quiet',
|
|
|
|
allow_stderr_error=True,
|
2018-04-01 00:17:47 +02:00
|
|
|
)
|
2018-05-30 11:41:02 +02:00
|
|
|
expected_lines = [
|
2019-01-26 23:20:14 +01:00
|
|
|
"ERROR: pkga 1.0 requires SPECIAL.missing, which is not installed.",
|
2018-05-30 11:41:02 +02:00
|
|
|
]
|
2019-01-11 11:12:44 +01:00
|
|
|
# Deprecated python versions produce an extra warning on stderr
|
|
|
|
assert matches_expected_lines(
|
|
|
|
result.stderr, expected_lines, exact=not deprecated_python)
|
2018-04-01 00:17:47 +02:00
|
|
|
assert result.returncode == 0
|
|
|
|
|
|
|
|
# Install the second missing package and expect that there is no warning
|
|
|
|
# during the installation. This is special as the package name requires
|
|
|
|
# name normalization (as in https://github.com/pypa/pip/issues/5134)
|
|
|
|
result = script.pip(
|
2018-05-30 11:41:02 +02:00
|
|
|
'install', '--no-index', special_path, '--quiet',
|
2018-04-01 00:17:47 +02:00
|
|
|
)
|
2019-01-11 11:12:44 +01:00
|
|
|
assert matches_expected_lines(
|
|
|
|
result.stderr, [], exact=not deprecated_python)
|
2018-04-01 00:17:47 +02:00
|
|
|
assert result.returncode == 0
|
|
|
|
|
|
|
|
# Double check that all errors are resolved in the end
|
|
|
|
result = script.pip('check')
|
2018-05-30 11:41:02 +02:00
|
|
|
expected_lines = [
|
2018-04-01 00:17:47 +02:00
|
|
|
"No broken requirements found.",
|
2018-05-30 11:41:02 +02:00
|
|
|
]
|
2018-04-01 00:17:47 +02:00
|
|
|
assert matches_expected_lines(result.stdout, expected_lines)
|
|
|
|
assert result.returncode == 0
|
2018-05-30 11:41:02 +02:00
|
|
|
|
|
|
|
|
2019-01-11 11:12:44 +01:00
|
|
|
def test_check_install_does_not_warn_for_out_of_graph_issues(
|
|
|
|
script, deprecated_python):
|
2018-05-30 11:41:02 +02:00
|
|
|
pkg_broken_path = create_test_package_with_setup(
|
|
|
|
script,
|
|
|
|
name='broken',
|
|
|
|
version='1.0',
|
|
|
|
install_requires=['missing', 'conflict < 1.0'],
|
|
|
|
)
|
|
|
|
pkg_unrelated_path = create_test_package_with_setup(
|
|
|
|
script,
|
|
|
|
name='unrelated',
|
|
|
|
version='1.0',
|
|
|
|
)
|
|
|
|
pkg_conflict_path = create_test_package_with_setup(
|
|
|
|
script,
|
|
|
|
name='conflict',
|
|
|
|
version='1.0',
|
|
|
|
)
|
|
|
|
|
|
|
|
# Install a package without it's dependencies
|
|
|
|
result = script.pip('install', '--no-index', pkg_broken_path, '--no-deps')
|
2019-01-11 11:12:44 +01:00
|
|
|
# Deprecated python versions produce an extra warning on stderr
|
|
|
|
assert matches_expected_lines(
|
|
|
|
result.stderr, [], exact=not deprecated_python)
|
2018-05-30 11:41:02 +02:00
|
|
|
|
|
|
|
# Install conflict package
|
|
|
|
result = script.pip(
|
2019-08-11 04:04:44 +02:00
|
|
|
'install', '--no-index', pkg_conflict_path, allow_stderr_error=True,
|
2018-05-30 11:41:02 +02:00
|
|
|
)
|
|
|
|
assert matches_expected_lines(result.stderr, [
|
2019-01-26 23:20:14 +01:00
|
|
|
"ERROR: broken 1.0 requires missing, which is not installed.",
|
2018-05-30 11:41:02 +02:00
|
|
|
(
|
2019-01-26 23:20:14 +01:00
|
|
|
"ERROR: broken 1.0 has requirement conflict<1.0, but "
|
2018-05-30 11:41:02 +02:00
|
|
|
"you'll have conflict 1.0 which is incompatible."
|
|
|
|
),
|
2019-01-11 11:12:44 +01:00
|
|
|
], exact=not deprecated_python)
|
2018-05-30 11:41:02 +02:00
|
|
|
|
|
|
|
# Install unrelated package
|
|
|
|
result = script.pip(
|
|
|
|
'install', '--no-index', pkg_unrelated_path, '--quiet',
|
|
|
|
)
|
|
|
|
# should not warn about broken's deps when installing unrelated package
|
2019-01-11 11:12:44 +01:00
|
|
|
assert matches_expected_lines(
|
|
|
|
result.stderr, [], exact=not deprecated_python)
|
2018-05-30 11:41:02 +02:00
|
|
|
|
|
|
|
result = script.pip('check', expect_error=True)
|
|
|
|
expected_lines = [
|
|
|
|
"broken 1.0 requires missing, which is not installed.",
|
|
|
|
"broken 1.0 has requirement conflict<1.0, but you have conflict 1.0.",
|
|
|
|
]
|
|
|
|
assert matches_expected_lines(result.stdout, expected_lines)
|