def test_config_file_override_stack( script: PipTestEnvironment, virtualenv: VirtualEnvironment, mock_server: MockServer, shared_data: TestData, ) -> None: """ Test config files (global, overriding a global config with a local, overriding all with a command line flag). """ mock_server.set_responses([ package_page({}), package_page({}), package_page({"INITools-0.2.tar.gz": "/files/INITools-0.2.tar.gz"}), file_response(shared_data.packages.joinpath("INITools-0.2.tar.gz")), ]) mock_server.start() base_address = f"http://{mock_server.host}:{mock_server.port}" config_file = script.scratch_path / "test-pip.cfg" # set this to make pip load it script.environ["PIP_CONFIG_FILE"] = str(config_file) config_file.write_text( textwrap.dedent("""\ [global] index-url = {}/simple1 """.format(base_address))) script.pip("install", "-vvv", "INITools", expect_error=True) virtualenv.clear() config_file.write_text( textwrap.dedent("""\ [global] index-url = {address}/simple1 [install] index-url = {address}/simple2 """.format(address=base_address))) script.pip("install", "-vvv", "INITools", expect_error=True) script.pip( "install", "-vvv", "--index-url", f"{base_address}/simple3", "INITools", ) mock_server.stop() requests = mock_server.get_requests() assert len(requests) == 4 assert requests[0]["PATH_INFO"] == "/simple1/initools/" assert requests[1]["PATH_INFO"] == "/simple2/initools/" assert requests[2]["PATH_INFO"] == "/simple3/initools/" assert requests[3]["PATH_INFO"] == "/files/INITools-0.2.tar.gz"
def test_do_not_prompt_for_authentication(script, data, cert_factory): """Test behaviour if --no-input option is given while installing from a index url requiring authentication """ cert_path = cert_factory() ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23) ctx.load_cert_chain(cert_path, cert_path) ctx.load_verify_locations(cafile=cert_path) ctx.verify_mode = ssl.CERT_REQUIRED server = make_mock_server(ssl_context=ctx) server.mock.side_effect = [ package_page({ "simple-3.0.tar.gz": "/files/simple-3.0.tar.gz", }), authorization_response(str(data.packages / "simple-3.0.tar.gz")), ] url = f"https://{server.host}:{server.port}/simple" with server_running(server): result = script.pip('install', "--index-url", url, "--cert", cert_path, "--client-cert", cert_path, '--no-input', 'simple', expect_error=True) assert "ERROR: HTTP error 401" in result.stderr
def test_prompt_for_authentication(script, data, cert_factory): """Test behaviour while installing from a index url requiring authentication """ cert_path = cert_factory() ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23) ctx.load_cert_chain(cert_path, cert_path) ctx.load_verify_locations(cafile=cert_path) ctx.verify_mode = ssl.CERT_REQUIRED server = make_mock_server(ssl_context=ctx) server.mock.side_effect = [ package_page({ "simple-3.0.tar.gz": "/files/simple-3.0.tar.gz", }), authorization_response(str(data.packages / "simple-3.0.tar.gz")), ] url = "https://{}:{}/simple".format(server.host, server.port) with server_running(server): result = script.pip('install', "--index-url", url, "--cert", cert_path, "--client-cert", cert_path, 'simple', expect_error=True) assert 'User for {}:{}'.format(server.host, server.port) in \ result.stdout, str(result)
def test_prompt_for_keyring_if_needed( script: PipTestEnvironment, data: TestData, cert_factory: CertFactory, auth_needed: bool, ) -> None: """Test behaviour while installing from a index url requiring authentication and keyring is possible. """ cert_path = cert_factory() ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23) ctx.load_cert_chain(cert_path, cert_path) ctx.load_verify_locations(cafile=cert_path) ctx.verify_mode = ssl.CERT_REQUIRED response = authorization_response if auth_needed else file_response server = make_mock_server(ssl_context=ctx) server.mock.side_effect = [ package_page({ "simple-3.0.tar.gz": "/files/simple-3.0.tar.gz", }), response(str(data.packages / "simple-3.0.tar.gz")), response(str(data.packages / "simple-3.0.tar.gz")), ] url = f"https://{server.host}:{server.port}/simple" keyring_content = textwrap.dedent("""\ import os import sys from collections import namedtuple Cred = namedtuple("Cred", ["username", "password"]) def get_credential(url, username): sys.stderr.write("get_credential was called" + os.linesep) return Cred("USERNAME", "PASSWORD") """) keyring_path = script.site_packages_path / "keyring.py" keyring_path.write_text(keyring_content) with server_running(server): result = script.pip( "install", "--index-url", url, "--cert", cert_path, "--client-cert", cert_path, "simple", ) if auth_needed: assert "get_credential was called" in result.stderr else: assert "get_credential was called" not in result.stderr
def test_prompt_for_authentication( script: PipTestEnvironment, data: TestData, cert_factory: CertFactory ) -> None: """Test behaviour while installing from a index url requiring authentication """ cert_path = cert_factory() ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23) ctx.load_cert_chain(cert_path, cert_path) ctx.load_verify_locations(cafile=cert_path) ctx.verify_mode = ssl.CERT_REQUIRED server = make_mock_server(ssl_context=ctx) server.mock.side_effect = [ package_page( { "simple-3.0.tar.gz": "/files/simple-3.0.tar.gz", } ), authorization_response(data.packages / "simple-3.0.tar.gz"), ] url = f"https://{server.host}:{server.port}/simple" with server_running(server): result = script.pip( "install", "--index-url", url, "--cert", cert_path, "--client-cert", cert_path, "simple", expect_error=True, ) assert f"User for {server.host}:{server.port}" in result.stdout, str(result)
def test_prioritize_url_credentials_over_netrc( script: PipTestEnvironment, data: TestData, cert_factory: CertFactory, ) -> None: cert_path = cert_factory() ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23) ctx.load_cert_chain(cert_path, cert_path) ctx.load_verify_locations(cafile=cert_path) ctx.verify_mode = ssl.CERT_REQUIRED server = make_mock_server(ssl_context=ctx) server.mock.side_effect = [ package_page({ "simple-3.0.tar.gz": "/files/simple-3.0.tar.gz", }), authorization_response(str(data.packages / "simple-3.0.tar.gz")), ] url = f"https://*****:*****@{server.host}:{server.port}/simple" netrc = script.scratch_path / ".netrc" netrc.write_text( f"machine {server.host} login wrongusername password wrongpassword") with server_running(server): script.environ["NETRC"] = netrc script.pip( "install", "--no-cache-dir", "--index-url", url, "--cert", cert_path, "--client-cert", cert_path, "simple", ) script.assert_installed(simple="3.0")