mirror of
https://github.com/kennethreitz/pipenv.git
synced 2026-06-05 22:50:18 +00:00
2f5150ab29
pytz exists in the build environment, which will typically be added to the PYTHONPATH when running the tests in rpmbuild. The alternative is to create a virtualenv containing only the pipenv dependencies, which is cumbersome to do when devendoring. As the pytz library here is not critical to the logic of the test method, replace it with tablib to reduce unintentionally errors when packaging. Continuation of https://github.com/pypa/pipenv/issues/3644
478 lines
15 KiB
Python
478 lines
15 KiB
Python
# -*- coding: utf-8 -*-
|
|
from __future__ import absolute_import, print_function
|
|
import os
|
|
|
|
import pytest
|
|
|
|
from flaky import flaky
|
|
|
|
from pipenv._compat import Path, TemporaryDirectory
|
|
from pipenv.project import Project
|
|
from pipenv.utils import temp_environ
|
|
from pipenv.vendor import delegator
|
|
|
|
|
|
@pytest.mark.install
|
|
@pytest.mark.setup
|
|
def test_basic_setup(PipenvInstance):
|
|
with PipenvInstance() as p:
|
|
with PipenvInstance(pipfile=False) as p:
|
|
c = p.pipenv("install requests")
|
|
assert c.return_code == 0
|
|
|
|
assert "requests" in p.pipfile["packages"]
|
|
assert "requests" in p.lockfile["default"]
|
|
assert "chardet" in p.lockfile["default"]
|
|
assert "idna" in p.lockfile["default"]
|
|
assert "urllib3" in p.lockfile["default"]
|
|
assert "certifi" in p.lockfile["default"]
|
|
|
|
|
|
@flaky
|
|
@pytest.mark.install
|
|
@pytest.mark.skip_osx
|
|
def test_basic_install(PipenvInstance):
|
|
with PipenvInstance() as p:
|
|
c = p.pipenv("install requests")
|
|
assert c.return_code == 0
|
|
assert "requests" in p.pipfile["packages"]
|
|
assert "requests" in p.lockfile["default"]
|
|
assert "chardet" in p.lockfile["default"]
|
|
assert "idna" in p.lockfile["default"]
|
|
assert "urllib3" in p.lockfile["default"]
|
|
assert "certifi" in p.lockfile["default"]
|
|
|
|
|
|
@flaky
|
|
@pytest.mark.install
|
|
def test_mirror_install(PipenvInstance):
|
|
with temp_environ(), PipenvInstance(chdir=True) as p:
|
|
mirror_url = os.environ.pop(
|
|
"PIPENV_TEST_INDEX", "https://pypi.python.org/simple"
|
|
)
|
|
assert "pypi.org" not in mirror_url
|
|
# This should sufficiently demonstrate the mirror functionality
|
|
# since pypi.org is the default when PIPENV_TEST_INDEX is unset.
|
|
c = p.pipenv("install requests --pypi-mirror {0}".format(mirror_url))
|
|
assert c.return_code == 0
|
|
# Ensure the --pypi-mirror parameter hasn't altered the Pipfile or Pipfile.lock sources
|
|
assert len(p.pipfile["source"]) == 1
|
|
assert len(p.lockfile["_meta"]["sources"]) == 1
|
|
assert "https://pypi.org/simple" == p.pipfile["source"][0]["url"]
|
|
assert "https://pypi.org/simple" == p.lockfile["_meta"]["sources"][0]["url"]
|
|
|
|
assert "requests" in p.pipfile["packages"]
|
|
assert "requests" in p.lockfile["default"]
|
|
assert "chardet" in p.lockfile["default"]
|
|
assert "idna" in p.lockfile["default"]
|
|
assert "urllib3" in p.lockfile["default"]
|
|
assert "certifi" in p.lockfile["default"]
|
|
|
|
|
|
@flaky
|
|
@pytest.mark.install
|
|
@pytest.mark.needs_internet
|
|
def test_bad_mirror_install(PipenvInstance):
|
|
with temp_environ(), PipenvInstance(chdir=True) as p:
|
|
# This demonstrates that the mirror parameter is being used
|
|
os.environ.pop("PIPENV_TEST_INDEX", None)
|
|
c = p.pipenv("install requests --pypi-mirror https://pypi.example.org")
|
|
assert c.return_code != 0
|
|
|
|
|
|
@pytest.mark.lock
|
|
@pytest.mark.complex
|
|
@pytest.mark.skip(reason="Does not work unless you can explicitly install into py2")
|
|
def test_complex_lock(PipenvInstance):
|
|
with PipenvInstance() as p:
|
|
c = p.pipenv("install apscheduler")
|
|
assert c.return_code == 0
|
|
assert "apscheduler" in p.pipfile["packages"]
|
|
assert "funcsigs" in p.lockfile[u"default"]
|
|
assert "futures" in p.lockfile[u"default"]
|
|
|
|
|
|
@flaky
|
|
@pytest.mark.dev
|
|
@pytest.mark.run
|
|
def test_basic_dev_install(PipenvInstance):
|
|
with PipenvInstance() as p:
|
|
c = p.pipenv("install requests --dev")
|
|
assert c.return_code == 0
|
|
assert "requests" in p.pipfile["dev-packages"]
|
|
assert "requests" in p.lockfile["develop"]
|
|
assert "chardet" in p.lockfile["develop"]
|
|
assert "idna" in p.lockfile["develop"]
|
|
assert "urllib3" in p.lockfile["develop"]
|
|
assert "certifi" in p.lockfile["develop"]
|
|
|
|
c = p.pipenv("run python -m requests.help")
|
|
assert c.return_code == 0
|
|
|
|
|
|
@flaky
|
|
@pytest.mark.dev
|
|
@pytest.mark.install
|
|
def test_install_without_dev(PipenvInstance):
|
|
"""Ensure that running `pipenv install` doesn't install dev packages"""
|
|
with PipenvInstance(chdir=True) as p:
|
|
with open(p.pipfile_path, "w") as f:
|
|
contents = """
|
|
[packages]
|
|
six = "*"
|
|
|
|
[dev-packages]
|
|
tablib = "*"
|
|
""".strip()
|
|
f.write(contents)
|
|
c = p.pipenv("install")
|
|
assert c.return_code == 0
|
|
assert "six" in p.pipfile["packages"]
|
|
assert "tablib" in p.pipfile["dev-packages"]
|
|
assert "six" in p.lockfile["default"]
|
|
assert "tablib" in p.lockfile["develop"]
|
|
c = p.pipenv('run python -c "import tablib"')
|
|
assert c.return_code != 0
|
|
c = p.pipenv('run python -c "import six"')
|
|
assert c.return_code == 0
|
|
|
|
|
|
@flaky
|
|
@pytest.mark.install
|
|
def test_install_without_dev_section(PipenvInstance):
|
|
with PipenvInstance() as p:
|
|
with open(p.pipfile_path, "w") as f:
|
|
contents = """
|
|
[packages]
|
|
six = "*"
|
|
""".strip()
|
|
f.write(contents)
|
|
c = p.pipenv("install")
|
|
assert c.return_code == 0
|
|
assert "six" in p.pipfile["packages"]
|
|
assert p.pipfile.get("dev-packages", {}) == {}
|
|
assert "six" in p.lockfile["default"]
|
|
assert p.lockfile["develop"] == {}
|
|
c = p.pipenv('run python -c "import six"')
|
|
assert c.return_code == 0
|
|
|
|
|
|
@flaky
|
|
@pytest.mark.extras
|
|
@pytest.mark.install
|
|
def test_extras_install(PipenvInstance):
|
|
with PipenvInstance(chdir=True) as p:
|
|
c = p.pipenv("install requests[socks]")
|
|
assert c.return_code == 0
|
|
assert "requests" in p.pipfile["packages"]
|
|
assert "extras" in p.pipfile["packages"]["requests"]
|
|
|
|
assert "requests" in p.lockfile["default"]
|
|
assert "chardet" in p.lockfile["default"]
|
|
assert "idna" in p.lockfile["default"]
|
|
assert "urllib3" in p.lockfile["default"]
|
|
assert "pysocks" in p.lockfile["default"]
|
|
|
|
|
|
@flaky
|
|
@pytest.mark.pin
|
|
@pytest.mark.install
|
|
def test_windows_pinned_pipfile(PipenvInstance):
|
|
with PipenvInstance() as p:
|
|
with open(p.pipfile_path, "w") as f:
|
|
contents = """
|
|
[packages]
|
|
requests = "==2.19.1"
|
|
""".strip()
|
|
f.write(contents)
|
|
c = p.pipenv("install")
|
|
assert c.return_code == 0
|
|
assert "requests" in p.pipfile["packages"]
|
|
assert "requests" in p.lockfile["default"]
|
|
|
|
|
|
@flaky
|
|
@pytest.mark.install
|
|
@pytest.mark.resolver
|
|
@pytest.mark.backup_resolver
|
|
def test_backup_resolver(PipenvInstance):
|
|
with PipenvInstance() as p:
|
|
with open(p.pipfile_path, "w") as f:
|
|
contents = """
|
|
[packages]
|
|
"ibm-db-sa-py3" = "==0.3.1-1"
|
|
""".strip()
|
|
f.write(contents)
|
|
|
|
c = p.pipenv("install")
|
|
assert c.return_code == 0
|
|
assert "ibm-db-sa-py3" in p.lockfile["default"]
|
|
|
|
|
|
@flaky
|
|
@pytest.mark.run
|
|
@pytest.mark.alt
|
|
def test_alternative_version_specifier(PipenvInstance):
|
|
with PipenvInstance() as p:
|
|
with open(p.pipfile_path, "w") as f:
|
|
contents = """
|
|
[packages]
|
|
requests = {version = "*"}
|
|
""".strip()
|
|
f.write(contents)
|
|
|
|
c = p.pipenv("install")
|
|
assert c.return_code == 0
|
|
|
|
assert "requests" in p.lockfile["default"]
|
|
assert "idna" in p.lockfile["default"]
|
|
assert "urllib3" in p.lockfile["default"]
|
|
assert "certifi" in p.lockfile["default"]
|
|
assert "chardet" in p.lockfile["default"]
|
|
|
|
c = p.pipenv('run python -c "import requests; import idna; import certifi;"')
|
|
assert c.return_code == 0
|
|
|
|
|
|
@flaky
|
|
@pytest.mark.run
|
|
@pytest.mark.alt
|
|
def test_outline_table_specifier(PipenvInstance):
|
|
with PipenvInstance() as p:
|
|
with open(p.pipfile_path, "w") as f:
|
|
contents = """
|
|
[packages.requests]
|
|
version = "*"
|
|
""".strip()
|
|
f.write(contents)
|
|
|
|
c = p.pipenv("install")
|
|
assert c.return_code == 0
|
|
|
|
assert "requests" in p.lockfile["default"]
|
|
assert "idna" in p.lockfile["default"]
|
|
assert "urllib3" in p.lockfile["default"]
|
|
assert "certifi" in p.lockfile["default"]
|
|
assert "chardet" in p.lockfile["default"]
|
|
|
|
c = p.pipenv('run python -c "import requests; import idna; import certifi;"')
|
|
assert c.return_code == 0
|
|
|
|
|
|
@pytest.mark.bad
|
|
@pytest.mark.install
|
|
def test_bad_packages(PipenvInstance):
|
|
with PipenvInstance() as p:
|
|
c = p.pipenv("install NotAPackage")
|
|
assert c.return_code > 0
|
|
|
|
|
|
@pytest.mark.extras
|
|
@pytest.mark.install
|
|
@pytest.mark.requirements
|
|
@pytest.mark.skip(reason="Not mocking this.")
|
|
def test_requirements_to_pipfile(PipenvInstance):
|
|
|
|
with PipenvInstance(pipfile=False, chdir=True) as p:
|
|
|
|
# Write a requirements file
|
|
with open("requirements.txt", "w") as f:
|
|
f.write("requests[socks]==2.18.1\n")
|
|
|
|
c = p.pipenv("install")
|
|
assert c.return_code == 0
|
|
print(c.out)
|
|
print(c.err)
|
|
print(delegator.run("ls -l").out)
|
|
|
|
# assert stuff in pipfile
|
|
assert "requests" in p.pipfile["packages"]
|
|
assert "extras" in p.pipfile["packages"]["requests"]
|
|
|
|
# assert stuff in lockfile
|
|
assert "requests" in p.lockfile["default"]
|
|
assert "chardet" in p.lockfile["default"]
|
|
assert "idna" in p.lockfile["default"]
|
|
assert "urllib3" in p.lockfile["default"]
|
|
assert "pysocks" in p.lockfile["default"]
|
|
|
|
|
|
@pytest.mark.install
|
|
@pytest.mark.skip_osx
|
|
@pytest.mark.requirements
|
|
def test_skip_requirements_when_pipfile(PipenvInstance):
|
|
"""Ensure requirements.txt is NOT imported when
|
|
|
|
1. We do `pipenv install [package]`
|
|
2. A Pipfile already exists when we run `pipenv install`.
|
|
"""
|
|
with PipenvInstance(chdir=True) as p:
|
|
with open("requirements.txt", "w") as f:
|
|
f.write("requests==2.18.1\n")
|
|
c = p.pipenv("install six")
|
|
assert c.return_code == 0
|
|
with open(p.pipfile_path, "w") as f:
|
|
contents = """
|
|
[packages]
|
|
six = "*"
|
|
fake_package = "<0.12"
|
|
""".strip()
|
|
f.write(contents)
|
|
c = p.pipenv("install")
|
|
assert c.ok
|
|
assert "fake_package" in p.pipfile["packages"]
|
|
assert "fake-package" in p.lockfile["default"]
|
|
assert "six" in p.pipfile["packages"]
|
|
assert "six" in p.lockfile["default"]
|
|
assert "requests" not in p.pipfile["packages"]
|
|
assert "requests" not in p.lockfile["default"]
|
|
|
|
|
|
@pytest.mark.cli
|
|
@pytest.mark.clean
|
|
def test_clean_on_empty_venv(PipenvInstance):
|
|
with PipenvInstance() as p:
|
|
c = p.pipenv("clean")
|
|
assert c.return_code == 0
|
|
|
|
|
|
@pytest.mark.install
|
|
def test_install_does_not_extrapolate_environ(PipenvInstance):
|
|
"""Ensure environment variables are not expanded in lock file.
|
|
"""
|
|
with temp_environ(), PipenvInstance(chdir=True) as p:
|
|
# os.environ["PYPI_URL"] = pypi.url
|
|
os.environ["PYPI_URL"] = p.pypi
|
|
|
|
with open(p.pipfile_path, "w") as f:
|
|
f.write(
|
|
"""
|
|
[[source]]
|
|
url = '${PYPI_URL}/simple'
|
|
verify_ssl = true
|
|
name = 'mockpi'
|
|
"""
|
|
)
|
|
|
|
# Ensure simple install does not extrapolate.
|
|
c = p.pipenv("install")
|
|
assert c.return_code == 0
|
|
assert p.pipfile["source"][0]["url"] == "${PYPI_URL}/simple"
|
|
assert p.lockfile["_meta"]["sources"][0]["url"] == "${PYPI_URL}/simple"
|
|
|
|
# Ensure package install does not extrapolate.
|
|
c = p.pipenv("install six")
|
|
assert c.return_code == 0
|
|
assert p.pipfile["source"][0]["url"] == "${PYPI_URL}/simple"
|
|
assert p.lockfile["_meta"]["sources"][0]["url"] == "${PYPI_URL}/simple"
|
|
|
|
|
|
@pytest.mark.editable
|
|
@pytest.mark.badparameter
|
|
@pytest.mark.install
|
|
def test_editable_no_args(PipenvInstance):
|
|
with PipenvInstance() as p:
|
|
c = p.pipenv("install -e")
|
|
assert c.return_code != 0
|
|
assert "Error: -e option requires an argument" in c.err
|
|
|
|
|
|
@pytest.mark.install
|
|
@pytest.mark.virtualenv
|
|
def test_install_venv_project_directory(PipenvInstance):
|
|
"""Test the project functionality during virtualenv creation.
|
|
"""
|
|
with PipenvInstance(chdir=True) as p:
|
|
with temp_environ(), TemporaryDirectory(
|
|
prefix="pipenv-", suffix="temp_workon_home"
|
|
) as workon_home:
|
|
os.environ["WORKON_HOME"] = workon_home.name
|
|
if "PIPENV_VENV_IN_PROJECT" in os.environ:
|
|
del os.environ["PIPENV_VENV_IN_PROJECT"]
|
|
|
|
c = p.pipenv("install six")
|
|
assert c.return_code == 0
|
|
|
|
venv_loc = None
|
|
for line in c.err.splitlines():
|
|
if line.startswith("Virtualenv location:"):
|
|
venv_loc = Path(line.split(":", 1)[-1].strip())
|
|
assert venv_loc is not None
|
|
assert venv_loc.joinpath(".project").exists()
|
|
|
|
|
|
@pytest.mark.deploy
|
|
@pytest.mark.system
|
|
def test_system_and_deploy_work(PipenvInstance):
|
|
with PipenvInstance(chdir=True) as p:
|
|
c = p.pipenv("install six requests")
|
|
assert c.return_code == 0
|
|
c = p.pipenv("--rm")
|
|
assert c.return_code == 0
|
|
c = delegator.run("virtualenv .venv")
|
|
assert c.return_code == 0
|
|
c = p.pipenv("install --system --deploy")
|
|
assert c.return_code == 0
|
|
c = p.pipenv("--rm")
|
|
assert c.return_code == 0
|
|
Path(p.pipfile_path).write_text(
|
|
u"""
|
|
[packages]
|
|
requests
|
|
""".strip()
|
|
)
|
|
c = p.pipenv("install --system")
|
|
assert c.return_code == 0
|
|
|
|
|
|
@pytest.mark.install
|
|
def test_install_creates_pipfile(PipenvInstance):
|
|
with PipenvInstance(chdir=True) as p:
|
|
if os.path.isfile(p.pipfile_path):
|
|
os.unlink(p.pipfile_path)
|
|
if "PIPENV_PIPFILE" in os.environ:
|
|
del os.environ["PIPENV_PIPFILE"]
|
|
assert not os.path.isfile(p.pipfile_path)
|
|
c = p.pipenv("install")
|
|
assert c.return_code == 0
|
|
assert os.path.isfile(p.pipfile_path)
|
|
|
|
|
|
@pytest.mark.install
|
|
def test_install_non_exist_dep(PipenvInstance):
|
|
with PipenvInstance(chdir=True) as p:
|
|
c = p.pipenv("install dateutil")
|
|
assert not c.ok
|
|
assert "dateutil" not in p.pipfile["packages"]
|
|
|
|
|
|
@pytest.mark.install
|
|
def test_install_package_with_dots(PipenvInstance):
|
|
with PipenvInstance(chdir=True) as p:
|
|
c = p.pipenv("install backports.html")
|
|
assert c.ok
|
|
assert "backports.html" in p.pipfile["packages"]
|
|
|
|
|
|
@pytest.mark.install
|
|
def test_rewrite_outline_table(PipenvInstance):
|
|
with PipenvInstance(chdir=True) as p:
|
|
with open(p.pipfile_path, 'w') as f:
|
|
contents = """
|
|
[packages]
|
|
six = {version = "*"}
|
|
|
|
[packages.requests]
|
|
version = "*"
|
|
extras = ["socks"]
|
|
""".strip()
|
|
f.write(contents)
|
|
c = p.pipenv("install plette")
|
|
assert c.return_code == 0
|
|
with open(p.pipfile_path) as f:
|
|
contents = f.read()
|
|
assert "[packages.requests]" not in contents
|
|
assert 'six = {version = "*"}' in contents
|
|
assert 'requests = {version = "*"' in contents
|
|
assert 'plette = "*"' in contents
|