Completed
Push — master ( 56245b...a9d00e )
by
unknown
38s
created

test_unzip_should_abort_if_no_redownload()   B

Complexity

Conditions 3

Size

Total Lines 27

Duplication

Lines 27
Ratio 100 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
c 1
b 0
f 0
dl 27
loc 27
rs 8.8571
1
# -*- coding: utf-8 -*-
2
import tempfile
3
4
import pytest
5
6
from cookiecutter import zipfile
7
from cookiecutter.exceptions import InvalidZipRepository
8
9
10
def mock_download():
11
    with open('tests/files/fake-repo-tmpl.zip', 'rb') as zf:
12
        chunk = zf.read(1024)
13
        while chunk:
14
            yield chunk
15
            chunk = zf.read(1024)
16
17
18
def test_unzip_local_file(mocker, tmpdir):
19
    """In `unzip()`, a local file reference can be unzipped.
20
    """
21
    mock_prompt_and_delete = mocker.patch(
22
        'cookiecutter.zipfile.prompt_and_delete',
23
        return_value=True,
24
        autospec=True
25
    )
26
27
    clone_to_dir = tmpdir.mkdir('clone')
28
29
    output_dir = zipfile.unzip(
30
        'tests/files/fake-repo-tmpl.zip',
31
        is_url=False,
32
        clone_to_dir=str(clone_to_dir)
33
    )
34
35
    assert output_dir.startswith(tempfile.gettempdir())
36
    assert not mock_prompt_and_delete.called
37
38
39
def test_unzip_protected_local_file_environment_password(mocker, tmpdir):
40
    """In `unzip()`, the environment can be used to provide a repo password
41
    """
42
    mock_prompt_and_delete = mocker.patch(
43
        'cookiecutter.zipfile.prompt_and_delete',
44
        return_value=True,
45
        autospec=True
46
    )
47
48
    clone_to_dir = tmpdir.mkdir('clone')
49
50
    output_dir = zipfile.unzip(
51
        'tests/files/protected-fake-repo-tmpl.zip',
52
        is_url=False,
53
        clone_to_dir=str(clone_to_dir),
54
        password='sekrit'
55
    )
56
57
    assert output_dir.startswith(tempfile.gettempdir())
58
    assert not mock_prompt_and_delete.called
59
60
61
def test_unzip_protected_local_file_bad_environment_password(mocker, tmpdir):
62
    """In `unzip()`, an error occurs if the environment has a bad password.
63
    """
64
    mocker.patch(
65
        'cookiecutter.zipfile.prompt_and_delete',
66
        return_value=True,
67
        autospec=True
68
    )
69
70
    clone_to_dir = tmpdir.mkdir('clone')
71
72
    with pytest.raises(InvalidZipRepository):
73
        zipfile.unzip(
74
            'tests/files/protected-fake-repo-tmpl.zip',
75
            is_url=False,
76
            clone_to_dir=str(clone_to_dir),
77
            password='not-the-right-password'
78
        )
79
80
81
def test_unzip_protected_local_file_user_password_with_noinput(mocker, tmpdir):
82
    """In `unzip()`, you can't unpack a password-protected repo in no_input mode
83
    """
84
    mocker.patch(
85
        'cookiecutter.zipfile.prompt_and_delete',
86
        return_value=True,
87
        autospec=True
88
    )
89
90
    clone_to_dir = tmpdir.mkdir('clone')
91
92
    with pytest.raises(InvalidZipRepository):
93
        zipfile.unzip(
94
            'tests/files/protected-fake-repo-tmpl.zip',
95
            is_url=False,
96
            clone_to_dir=str(clone_to_dir),
97
            no_input=True
98
        )
99
100
101
def test_unzip_protected_local_file_user_password(mocker, tmpdir):
102
    """In `unzip()`, a password-protected local file reference can be unzipped.
103
    """
104
    mock_prompt_and_delete = mocker.patch(
105
        'cookiecutter.zipfile.prompt_and_delete',
106
        return_value=True,
107
        autospec=True
108
    )
109
    mocker.patch(
110
        'cookiecutter.zipfile.read_repo_password',
111
        return_value='sekrit'
112
    )
113
114
    clone_to_dir = tmpdir.mkdir('clone')
115
116
    output_dir = zipfile.unzip(
117
        'tests/files/protected-fake-repo-tmpl.zip',
118
        is_url=False,
119
        clone_to_dir=str(clone_to_dir)
120
    )
121
122
    assert output_dir.startswith(tempfile.gettempdir())
123
    assert not mock_prompt_and_delete.called
124
125
126
def test_unzip_protected_local_file_user_bad_password(mocker, tmpdir):
127
    """In `unzip()`, If you can't provide a valid password, you get an error
128
    """
129
    mocker.patch(
130
        'cookiecutter.zipfile.prompt_and_delete',
131
        return_value=True,
132
        autospec=True
133
    )
134
    mocker.patch(
135
        'cookiecutter.zipfile.read_repo_password',
136
        return_value='not-the-right-password'
137
    )
138
139
    clone_to_dir = tmpdir.mkdir('clone')
140
141
    with pytest.raises(InvalidZipRepository):
142
        zipfile.unzip(
143
            'tests/files/protected-fake-repo-tmpl.zip',
144
            is_url=False,
145
            clone_to_dir=str(clone_to_dir)
146
        )
147
148
149
def test_empty_zip_file(mocker, tmpdir):
150
    """In `unzip()`, an empty file raises an error.
151
    """
152
    mocker.patch(
153
        'cookiecutter.zipfile.prompt_and_delete',
154
        return_value=True,
155
        autospec=True
156
    )
157
158
    clone_to_dir = tmpdir.mkdir('clone')
159
160
    with pytest.raises(InvalidZipRepository):
161
        zipfile.unzip(
162
            'tests/files/empty.zip',
163
            is_url=False,
164
            clone_to_dir=str(clone_to_dir)
165
        )
166
167
168
def test_non_repo_zip_file(mocker, tmpdir):
169
    """In `unzip()`, a repository must have a top level directory
170
    """
171
    mocker.patch(
172
        'cookiecutter.zipfile.prompt_and_delete',
173
        return_value=True,
174
        autospec=True
175
    )
176
177
    clone_to_dir = tmpdir.mkdir('clone')
178
179
    with pytest.raises(InvalidZipRepository):
180
        zipfile.unzip(
181
            'tests/files/not-a-repo.zip',
182
            is_url=False,
183
            clone_to_dir=str(clone_to_dir)
184
        )
185
186
187
def test_bad_zip_file(mocker, tmpdir):
188
    """In `unzip()`, a corrupted zip file raises an error.
189
    """
190
    mocker.patch(
191
        'cookiecutter.zipfile.prompt_and_delete',
192
        return_value=True,
193
        autospec=True
194
    )
195
196
    clone_to_dir = tmpdir.mkdir('clone')
197
198
    with pytest.raises(InvalidZipRepository):
199
        zipfile.unzip(
200
            'tests/files/bad-zip-file.zip',
201
            is_url=False,
202
            clone_to_dir=str(clone_to_dir)
203
        )
204
205
206 View Code Duplication
def test_unzip_url(mocker, tmpdir):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
207
    """In `unzip()`, a url will be downloaded and unzipped
208
    """
209
    mock_prompt_and_delete = mocker.patch(
210
        'cookiecutter.zipfile.prompt_and_delete',
211
        return_value=True,
212
        autospec=True
213
    )
214
215
    request = mocker.MagicMock()
216
    request.iter_content.return_value = mock_download()
217
218
    mocker.patch(
219
        'cookiecutter.zipfile.requests.get',
220
        return_value=request,
221
        autospec=True,
222
    )
223
224
    clone_to_dir = tmpdir.mkdir('clone')
225
226
    output_dir = zipfile.unzip(
227
        'https://example.com/path/to/fake-repo-tmpl.zip',
228
        is_url=True,
229
        clone_to_dir=str(clone_to_dir)
230
    )
231
232
    assert output_dir.startswith(tempfile.gettempdir())
233
    assert not mock_prompt_and_delete.called
234
235
236 View Code Duplication
def test_unzip_url_existing_cache(mocker, tmpdir):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
237
    """In `unzip()`, a url will be downloaded and unzipped; an existing zip file
238
    will be removed.
239
    """
240
    mock_prompt_and_delete = mocker.patch(
241
        'cookiecutter.zipfile.prompt_and_delete',
242
        return_value=True,
243
        autospec=True
244
    )
245
246
    request = mocker.MagicMock()
247
    request.iter_content.return_value = mock_download()
248
249
    mocker.patch(
250
        'cookiecutter.zipfile.requests.get',
251
        return_value=request,
252
        autospec=True,
253
    )
254
255
    clone_to_dir = tmpdir.mkdir('clone')
256
257
    # Create an existing cache of the zipfile
258
    existing_zip = clone_to_dir.join('fake-repo-tmpl.zip')
259
    existing_zip.write('This is an existing zipfile')
260
261
    output_dir = zipfile.unzip(
262
        'https://example.com/path/to/fake-repo-tmpl.zip',
263
        is_url=True,
264
        clone_to_dir=str(clone_to_dir)
265
    )
266
267
    assert output_dir.startswith(tempfile.gettempdir())
268
    assert mock_prompt_and_delete.call_count == 1
269
270
271
def test_unzip_url_existing_cache_no_input(mocker, tmpdir):
272
    """In `unzip()`, if no_input is provided, the existing file will be removed.
273
    """
274
    request = mocker.MagicMock()
275
    request.iter_content.return_value = mock_download()
276
277
    mocker.patch(
278
        'cookiecutter.zipfile.requests.get',
279
        return_value=request,
280
        autospec=True,
281
    )
282
283
    clone_to_dir = tmpdir.mkdir('clone')
284
285
    # Create an existing cache of the zipfile
286
    existing_zip = clone_to_dir.join('fake-repo-tmpl.zip')
287
    existing_zip.write('This is an existing zipfile')
288
289
    output_dir = zipfile.unzip(
290
        'https://example.com/path/to/fake-repo-tmpl.zip',
291
        is_url=True,
292
        clone_to_dir=str(clone_to_dir),
293
        no_input=True
294
    )
295
296
    assert output_dir.startswith(tempfile.gettempdir())
297
298
299 View Code Duplication
def test_unzip_should_abort_if_no_redownload(mocker, tmpdir):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
300
    """In `unzip()`, if user doesn't want to download, Cookiecutter should exit
301
    without cloning anything.
302
    """
303
    mocker.patch(
304
        'cookiecutter.zipfile.prompt_and_delete',
305
        side_effect=SystemExit,
306
        autospec=True
307
    )
308
309
    mock_requests_get = mocker.patch(
310
        'cookiecutter.zipfile.requests.get',
311
        autospec=True,
312
    )
313
314
    clone_to_dir = tmpdir.mkdir('clone')
315
316
    # Create an existing cache of the zipfile
317
    existing_zip = clone_to_dir.join('fake-repo-tmpl.zip')
318
    existing_zip.write('This is an existing zipfile')
319
320
    zipfile_url = 'https://example.com/path/to/fake-repo-tmpl.zip'
321
322
    with pytest.raises(SystemExit):
323
        zipfile.unzip(zipfile_url, is_url=True, clone_to_dir=str(clone_to_dir))
324
325
    assert not mock_requests_get.called
326