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