1import contextlib 2import os 3 4from pipenv.utils import temp_environ 5from pipenv.vendor import delegator 6 7import pytest 8 9from flaky import flaky 10 11 12@pytest.mark.install 13@pytest.mark.setup 14@pytest.mark.skip(reason="this doesn't work on travis") 15def test_basic_setup(PipenvInstance, pypi): 16 with PipenvInstance(pypi=pypi) as p: 17 with PipenvInstance(pipfile=False) as p: 18 c = p.pipenv('install requests') 19 assert c.return_code == 0 20 21 assert 'requests' in p.pipfile['packages'] 22 assert 'requests' in p.lockfile['default'] 23 assert 'chardet' in p.lockfile['default'] 24 assert 'idna' in p.lockfile['default'] 25 assert 'urllib3' in p.lockfile['default'] 26 assert 'certifi' in p.lockfile['default'] 27 28 29@pytest.mark.install 30@flaky 31def test_basic_install(PipenvInstance, pypi): 32 with PipenvInstance(pypi=pypi) as p: 33 c = p.pipenv('install requests') 34 assert c.return_code == 0 35 assert 'requests' in p.pipfile['packages'] 36 assert 'requests' in p.lockfile['default'] 37 assert 'chardet' in p.lockfile['default'] 38 assert 'idna' in p.lockfile['default'] 39 assert 'urllib3' in p.lockfile['default'] 40 assert 'certifi' in p.lockfile['default'] 41 42 43@pytest.mark.complex 44@pytest.mark.lock 45@pytest.mark.skip(reason='Does not work unless you can explicitly install into py2') 46def test_complex_lock(PipenvInstance, pypi): 47 with PipenvInstance(pypi=pypi) as p: 48 c = p.pipenv('install apscheduler') 49 assert c.return_code == 0 50 assert 'apscheduler' in p.pipfile['packages'] 51 assert 'funcsigs' in p.lockfile[u'default'] 52 assert 'futures' in p.lockfile[u'default'] 53 54 55@pytest.mark.dev 56@pytest.mark.run 57@flaky 58def test_basic_dev_install(PipenvInstance, pypi): 59 with PipenvInstance(pypi=pypi) as p: 60 c = p.pipenv('install requests --dev') 61 assert c.return_code == 0 62 assert 'requests' in p.pipfile['dev-packages'] 63 assert 'requests' in p.lockfile['develop'] 64 assert 'chardet' in p.lockfile['develop'] 65 assert 'idna' in p.lockfile['develop'] 66 assert 'urllib3' in p.lockfile['develop'] 67 assert 'certifi' in p.lockfile['develop'] 68 69 c = p.pipenv('run python -m requests.help') 70 assert c.return_code == 0 71 72 73@pytest.mark.dev 74@pytest.mark.install 75@flaky 76def test_install_without_dev(PipenvInstance, pypi): 77 """Ensure that running `pipenv install` doesn't install dev packages""" 78 with PipenvInstance(pypi=pypi, chdir=True) as p: 79 with open(p.pipfile_path, 'w') as f: 80 contents = """ 81[packages] 82six = "*" 83 84[dev-packages] 85pytz = "*" 86 """.strip() 87 f.write(contents) 88 c = p.pipenv('install') 89 assert c.return_code == 0 90 assert 'six' in p.pipfile['packages'] 91 assert 'pytz' in p.pipfile['dev-packages'] 92 assert 'six' in p.lockfile['default'] 93 assert 'pytz' in p.lockfile['develop'] 94 c = p.pipenv('run python -c "import pytz"') 95 assert c.return_code != 0 96 c = p.pipenv('run python -c "import six"') 97 assert c.return_code == 0 98 99 100@pytest.mark.install 101@flaky 102def test_install_without_dev_section(PipenvInstance, pypi): 103 with PipenvInstance(pypi=pypi) as p: 104 with open(p.pipfile_path, 'w') as f: 105 contents = """ 106[packages] 107six = "*" 108 """.strip() 109 f.write(contents) 110 c = p.pipenv('install') 111 assert c.return_code == 0 112 assert 'six' in p.pipfile['packages'] 113 assert p.pipfile.get('dev-packages', {}) == {} 114 assert 'six' in p.lockfile['default'] 115 assert p.lockfile['develop'] == {} 116 c = p.pipenv('run python -c "import six"') 117 assert c.return_code == 0 118 119 120@pytest.mark.extras 121@pytest.mark.install 122@flaky 123def test_extras_install(PipenvInstance, pypi): 124 with PipenvInstance(pypi=pypi, chdir=True) as p: 125 c = p.pipenv('install requests[socks]') 126 assert c.return_code == 0 127 assert 'requests' in p.pipfile['packages'] 128 assert 'extras' in p.pipfile['packages']['requests'] 129 130 assert 'requests' in p.lockfile['default'] 131 assert 'chardet' in p.lockfile['default'] 132 assert 'idna' in p.lockfile['default'] 133 assert 'urllib3' in p.lockfile['default'] 134 assert 'pysocks' in p.lockfile['default'] 135 136 137@pytest.mark.install 138@pytest.mark.pin 139@flaky 140def test_windows_pinned_pipfile(PipenvInstance, pypi): 141 with PipenvInstance(pypi=pypi) as p: 142 with open(p.pipfile_path, 'w') as f: 143 contents = """ 144[packages] 145tablib = "<0.12" 146 """.strip() 147 f.write(contents) 148 c = p.pipenv('install') 149 assert c.return_code == 0 150 assert 'tablib' in p.pipfile['packages'] 151 assert 'tablib' in p.lockfile['default'] 152 153 154@pytest.mark.install 155@pytest.mark.resolver 156@pytest.mark.backup_resolver 157@flaky 158def test_backup_resolver(PipenvInstance, pypi): 159 with PipenvInstance(pypi=pypi) as p: 160 with open(p.pipfile_path, 'w') as f: 161 contents = """ 162[packages] 163"ibm-db-sa-py3" = "==0.3.1-1" 164 """.strip() 165 f.write(contents) 166 167 c = p.pipenv('install') 168 assert c.return_code == 0 169 assert 'ibm-db-sa-py3' in p.lockfile['default'] 170 171 172@pytest.mark.run 173@pytest.mark.alt 174@flaky 175def test_alternative_version_specifier(PipenvInstance, pypi): 176 with PipenvInstance(pypi=pypi) as p: 177 with open(p.pipfile_path, 'w') as f: 178 contents = """ 179[packages] 180requests = {version = "*"} 181 """.strip() 182 f.write(contents) 183 184 c = p.pipenv('install') 185 assert c.return_code == 0 186 187 assert 'requests' in p.lockfile['default'] 188 assert 'idna' in p.lockfile['default'] 189 assert 'urllib3' in p.lockfile['default'] 190 assert 'certifi' in p.lockfile['default'] 191 assert 'chardet' in p.lockfile['default'] 192 193 c = p.pipenv('run python -c "import requests; import idna; import certifi;"') 194 assert c.return_code == 0 195 196 197@pytest.mark.bad 198@pytest.mark.install 199def test_bad_packages(PipenvInstance, pypi): 200 with PipenvInstance(pypi=pypi) as p: 201 c = p.pipenv('install NotAPackage') 202 assert c.return_code > 0 203 204 205@pytest.mark.extras 206@pytest.mark.install 207@pytest.mark.requirements 208@pytest.mark.skip(reason="Not mocking this.") 209def test_requirements_to_pipfile(PipenvInstance, pypi): 210 211 with PipenvInstance(pipfile=False, chdir=True, pypi=pypi) as p: 212 213 # Write a requirements file 214 with open('requirements.txt', 'w') as f: 215 f.write('requests[socks]==2.18.1\n') 216 217 c = p.pipenv('install') 218 assert c.return_code == 0 219 print(c.out) 220 print(c.err) 221 print(delegator.run('ls -l').out) 222 223 # assert stuff in pipfile 224 assert 'requests' in p.pipfile['packages'] 225 assert 'extras' in p.pipfile['packages']['requests'] 226 227 # assert stuff in lockfile 228 assert 'requests' in p.lockfile['default'] 229 assert 'chardet' in p.lockfile['default'] 230 assert 'idna' in p.lockfile['default'] 231 assert 'urllib3' in p.lockfile['default'] 232 assert 'pysocks' in p.lockfile['default'] 233 234 235@pytest.mark.cli 236@pytest.mark.clean 237def test_clean_on_empty_venv(PipenvInstance, pypi): 238 with PipenvInstance(pypi=pypi) as p: 239 c = p.pipenv('clean') 240 assert c.return_code == 0 241 242 243@pytest.mark.install 244def test_install_does_not_extrapolate_environ(PipenvInstance, pypi): 245 with temp_environ(), PipenvInstance(pypi=pypi, chdir=True) as p: 246 os.environ['PYPI_URL'] = pypi.url 247 248 with open(p.pipfile_path, 'w') as f: 249 f.write(""" 250[[source]] 251url = '${PYPI_URL}/simple' 252verify_ssl = true 253name = 'mockpi' 254 """) 255 256 # Ensure simple install does not extrapolate. 257 c = p.pipenv('install') 258 assert c.return_code == 0 259 assert p.pipfile['source'][0]['url'] == '${PYPI_URL}/simple' 260 assert p.lockfile['_meta']['sources'][0]['url'] == '${PYPI_URL}/simple' 261 262 # Ensure package install does not extrapolate. 263 c = p.pipenv('install six') 264 assert c.return_code == 0 265 assert p.pipfile['source'][0]['url'] == '${PYPI_URL}/simple' 266 assert p.lockfile['_meta']['sources'][0]['url'] == '${PYPI_URL}/simple' 267