from tests.lib import create_test_package_with_setup def assert_contains_expected_lines(string, expected_lines): for expected_line in expected_lines: assert (expected_line + '\n') in string def test_check_install_canonicalization(script): pkga_path = create_test_package_with_setup( script, name='pkgA', version='1.0', install_requires=['normal-missing', 'SPECIAL.missing'], ) normal_path = create_test_package_with_setup( script, name='normal-missing', version='0.1', ) 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. result = script.pip( 'install', '--no-index', normal_path, '--quiet', allow_stderr_error=True, ) expected_lines = [ "pkga 1.0 requires SPECIAL.missing, which is not installed.", ] # Deprecated python versions produce an extra warning on stderr assert_contains_expected_lines(result.stderr, expected_lines) 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( 'install', '--no-index', special_path, '--quiet', ) assert "requires" not in result.stderr assert result.returncode == 0 # Double check that all errors are resolved in the end result = script.pip('check') expected_lines = [ "No broken requirements found.", ] assert_contains_expected_lines(result.stdout, expected_lines) assert result.returncode == 0 def test_check_install_does_not_warn_for_out_of_graph_issues(script): 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') assert "requires" not in result.stderr # Install conflict package result = script.pip( 'install', '--no-index', pkg_conflict_path, allow_stderr_error=True, ) assert_contains_expected_lines(result.stderr, [ "broken 1.0 requires missing, which is not installed.", "broken 1.0 requires conflict<1.0, " "but you'll have conflict 1.0 which is incompatible." ]) # Install unrelated package result = script.pip( 'install', '--no-index', pkg_unrelated_path, '--quiet', ) # should not warn about broken's deps when installing unrelated package assert "requires" not in result.stderr 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_contains_expected_lines(result.stdout, expected_lines)