Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def test_non_repo_zip_file(mocker, tmpdir):
"""In `unzip()`, a repository must have a top level directory."""
mocker.patch(
'cookiecutter.zipfile.prompt_and_delete',
return_value=True,
autospec=True
)
clone_to_dir = tmpdir.mkdir('clone')
with pytest.raises(InvalidZipRepository):
zipfile.unzip(
'tests/files/not-a-repo.zip',
is_url=False,
clone_to_dir=str(clone_to_dir)
)
def test_unzip_protected_local_file_user_password(mocker, tmpdir):
"""A password-protected local file reference can be unzipped."""
mock_prompt_and_delete = mocker.patch(
'cookiecutter.zipfile.prompt_and_delete',
return_value=True,
autospec=True
)
mocker.patch(
'cookiecutter.zipfile.read_repo_password',
return_value='sekrit'
)
clone_to_dir = tmpdir.mkdir('clone')
output_dir = zipfile.unzip(
'tests/files/protected-fake-repo-tmpl.zip',
is_url=False,
clone_to_dir=str(clone_to_dir)
)
assert output_dir.startswith(tempfile.gettempdir())
assert not mock_prompt_and_delete.called
def test_unzip_protected_local_file_user_bad_password(mocker, tmpdir):
"""Error in `unzip()`, if user can't provide a valid password."""
mocker.patch(
'cookiecutter.zipfile.prompt_and_delete',
return_value=True,
autospec=True
)
mocker.patch(
'cookiecutter.zipfile.read_repo_password',
return_value='not-the-right-password'
)
clone_to_dir = tmpdir.mkdir('clone')
with pytest.raises(InvalidZipRepository):
zipfile.unzip(
'tests/files/protected-fake-repo-tmpl.zip',
is_url=False,
clone_to_dir=str(clone_to_dir)
)
request = mocker.MagicMock()
request.iter_content.return_value = mock_download()
mocker.patch(
'cookiecutter.zipfile.requests.get',
return_value=request,
autospec=True,
)
clone_to_dir = tmpdir.mkdir('clone')
# Create an existing cache of the zipfile
existing_zip = clone_to_dir.join('fake-repo-tmpl.zip')
existing_zip.write('This is an existing zipfile')
output_dir = zipfile.unzip(
'https://example.com/path/to/fake-repo-tmpl.zip',
is_url=True,
clone_to_dir=str(clone_to_dir)
)
assert output_dir.startswith(tempfile.gettempdir())
assert mock_prompt_and_delete.call_count == 1
mock_requests_get = mocker.patch(
'cookiecutter.zipfile.requests.get',
autospec=True,
)
clone_to_dir = tmpdir.mkdir('clone')
# Create an existing cache of the zipfile
existing_zip = clone_to_dir.join('fake-repo-tmpl.zip')
existing_zip.write('This is an existing zipfile')
zipfile_url = 'https://example.com/path/to/fake-repo-tmpl.zip'
with pytest.raises(SystemExit):
zipfile.unzip(zipfile_url, is_url=True, clone_to_dir=str(clone_to_dir))
assert not mock_requests_get.called
def test_bad_zip_file(mocker, tmpdir):
"""In `unzip()`, a corrupted zip file raises an error."""
mocker.patch(
'cookiecutter.zipfile.prompt_and_delete',
return_value=True,
autospec=True
)
clone_to_dir = tmpdir.mkdir('clone')
with pytest.raises(InvalidZipRepository):
zipfile.unzip(
'tests/files/bad-zip-file.zip',
is_url=False,
clone_to_dir=str(clone_to_dir)
)
return_value=True,
autospec=True
)
request = mocker.MagicMock()
request.iter_content.return_value = mock_download()
mocker.patch(
'cookiecutter.zipfile.requests.get',
return_value=request,
autospec=True,
)
clone_to_dir = tmpdir.mkdir('clone')
output_dir = zipfile.unzip(
'https://example.com/path/to/fake-repo-tmpl.zip',
is_url=True,
clone_to_dir=str(clone_to_dir)
)
assert output_dir.startswith(tempfile.gettempdir())
assert not mock_prompt_and_delete.called
def test_unzip_local_file(mocker, tmpdir):
"""Local file reference can be unzipped."""
mock_prompt_and_delete = mocker.patch(
'cookiecutter.zipfile.prompt_and_delete',
return_value=True,
autospec=True
)
clone_to_dir = tmpdir.mkdir('clone')
output_dir = zipfile.unzip(
'tests/files/fake-repo-tmpl.zip',
is_url=False,
clone_to_dir=str(clone_to_dir)
)
assert output_dir.startswith(tempfile.gettempdir())
assert not mock_prompt_and_delete.called
or a URL to a git repository.
:param abbreviations: A dictionary of repository abbreviation
definitions.
:param clone_to_dir: The directory to clone the repository into.
:param checkout: The branch, tag or commit ID to checkout after clone.
:param no_input: Prompt the user at command line for manual configuration?
:param password: The password to use when extracting the repository.
:return: A tuple containing the cookiecutter template directory, and
a boolean descriving whether that directory should be cleaned up
after the template has been instantiated.
:raises: `RepositoryNotFound` if a repository directory could not be found.
"""
template = expand_abbreviations(template, abbreviations)
if is_zip_file(template):
unzipped_dir = unzip(
zip_uri=template,
is_url=is_repo_url(template),
clone_to_dir=clone_to_dir,
no_input=no_input,
password=password
)
repository_candidates = [unzipped_dir]
cleanup = True
elif is_repo_url(template):
cloned_repo = clone(
repo_url=template,
checkout=checkout,
clone_to_dir=clone_to_dir,
no_input=no_input,
)
repository_candidates = [cloned_repo]