Skip to content

back to Claude Sonnet 3.5 - Fill-in summary

Claude Sonnet 3.5 - Fill-in: cookiecutter

Pytest Summary for test tests

status count
failed 271
passed 96
skipped 4
total 371
collected 371

Failed pytests:

test_dump.py::test_type_error_if_no_template_name

test_dump.py::test_type_error_if_no_template_name
replay_test_dir = 'tests/test-replay/'
context = {'cookiecutter': {'email': 'raphael@hackebrot.de', 'full_name': 'Raphael Pierzina', 'github_username': 'hackebrot', 'version': '0.1.0'}}

    def test_type_error_if_no_template_name(replay_test_dir, context):
        """Test that replay.dump raises if the template_name is not a valid str."""
>       with pytest.raises(TypeError):
E       Failed: DID NOT RAISE 

tests/replay/test_dump.py:37: Failed

test_dump.py::test_type_error_if_not_dict_context

test_dump.py::test_type_error_if_not_dict_context
replay_test_dir = 'tests/test-replay/', template_name = 'cookiedozer'

    def test_type_error_if_not_dict_context(replay_test_dir, template_name):
        """Test that replay.dump raises if the context is not of type dict."""
>       with pytest.raises(TypeError):
E       Failed: DID NOT RAISE 

tests/replay/test_dump.py:43: Failed

test_dump.py::test_value_error_if_key_missing_in_context

test_dump.py::test_value_error_if_key_missing_in_context
replay_test_dir = 'tests/test-replay/', template_name = 'cookiedozer'

    def test_value_error_if_key_missing_in_context(replay_test_dir, template_name):
        """Test that replay.dump raises if the context does not contain a key \
        named 'cookiecutter'."""
>       with pytest.raises(ValueError):
E       Failed: DID NOT RAISE 

tests/replay/test_dump.py:50: Failed

test_load.py::test_type_error_if_no_template_name

test_load.py::test_type_error_if_no_template_name
replay_test_dir = 'tests/test-replay/'

    def test_type_error_if_no_template_name(replay_test_dir):
        """Test that replay.load raises if the template_name is not a valid str."""
>       with pytest.raises(TypeError):
E       Failed: DID NOT RAISE 

tests/replay/test_load.py:26: Failed

test_load.py::test_value_error_if_key_missing_in_context

test_load.py::test_value_error_if_key_missing_in_context
mocker = 
replay_test_dir = 'tests/test-replay/'

    def test_value_error_if_key_missing_in_context(mocker, replay_test_dir):
        """Test that replay.load raises if the loaded context does not contain \
        'cookiecutter'."""
>       with pytest.raises(ValueError):
E       Failed: DID NOT RAISE 

tests/replay/test_load.py:33: Failed

test_replay.py::test_get_replay_file_name[bar.json]

test_replay.py::test_get_replay_file_name[bar.json]
replay_file_name = 'bar.json'

    @pytest.mark.parametrize("replay_file_name", ['bar', 'bar.json'])
    def test_get_replay_file_name(replay_file_name):
        """Make sure that replay.get_file_name generates a valid json file path."""
        exp_replay_file_path = os.path.join('foo', 'bar.json')
        replay_file_path = replay.get_file_name('foo', replay_file_name)
>       assert replay_file_path == exp_replay_file_path
E       AssertionError: assert 'foo/bar.json.json' == 'foo/bar.json'
E         
E         - foo/bar.json
E         + foo/bar.json.json
E         ?             +++++

tests/replay/test_replay.py:15: AssertionError

test_replay.py::test_raise_on_invalid_mode[invalid_kwargs0]

test_replay.py::test_raise_on_invalid_mode[invalid_kwargs0]
invalid_kwargs = {'no_input': True}

    @pytest.mark.parametrize(
        'invalid_kwargs',
        (
            {'no_input': True},
            {'extra_context': {}},
            {'no_input': True, 'extra_context': {}},
        ),
    )
    def test_raise_on_invalid_mode(invalid_kwargs):
        """Test `cookiecutter` raise exception on unacceptable `replay` request."""
        with pytest.raises(exceptions.InvalidModeException):
>           main.cookiecutter('foo', replay=True, **invalid_kwargs)

tests/replay/test_replay.py:29: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = 'foo', checkout = None, no_input = True, extra_context = None
replay = True, overwrite_if_exists = False, output_dir = '.', config_file = None
default_config = False, password = None, directory = None
skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

cookiecutter/main.py:60: TypeError

test_replay.py::test_raise_on_invalid_mode[invalid_kwargs1]

test_replay.py::test_raise_on_invalid_mode[invalid_kwargs1]
invalid_kwargs = {'extra_context': {}}

    @pytest.mark.parametrize(
        'invalid_kwargs',
        (
            {'no_input': True},
            {'extra_context': {}},
            {'no_input': True, 'extra_context': {}},
        ),
    )
    def test_raise_on_invalid_mode(invalid_kwargs):
        """Test `cookiecutter` raise exception on unacceptable `replay` request."""
        with pytest.raises(exceptions.InvalidModeException):
>           main.cookiecutter('foo', replay=True, **invalid_kwargs)

tests/replay/test_replay.py:29: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = 'foo', checkout = None, no_input = False, extra_context = {}
replay = True, overwrite_if_exists = False, output_dir = '.', config_file = None
default_config = False, password = None, directory = None
skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

cookiecutter/main.py:60: TypeError

test_replay.py::test_raise_on_invalid_mode[invalid_kwargs2]

test_replay.py::test_raise_on_invalid_mode[invalid_kwargs2]
invalid_kwargs = {'extra_context': {}, 'no_input': True}

    @pytest.mark.parametrize(
        'invalid_kwargs',
        (
            {'no_input': True},
            {'extra_context': {}},
            {'no_input': True, 'extra_context': {}},
        ),
    )
    def test_raise_on_invalid_mode(invalid_kwargs):
        """Test `cookiecutter` raise exception on unacceptable `replay` request."""
        with pytest.raises(exceptions.InvalidModeException):
>           main.cookiecutter('foo', replay=True, **invalid_kwargs)

tests/replay/test_replay.py:29: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = 'foo', checkout = None, no_input = True, extra_context = {}
replay = True, overwrite_if_exists = False, output_dir = '.', config_file = None
default_config = False, password = None, directory = None
skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

cookiecutter/main.py:60: TypeError

test_replay.py::test_main_does_not_invoke_dump_but_load

test_replay.py::test_main_does_not_invoke_dump_but_load
mocker = 

    def test_main_does_not_invoke_dump_but_load(mocker):
        """Test `cookiecutter` calling correct functions on `replay`."""
        mock_prompt = mocker.patch('cookiecutter.main.prompt_for_config')
        mock_gen_context = mocker.patch('cookiecutter.main.generate_context')
        mock_gen_files = mocker.patch('cookiecutter.main.generate_files')
        mock_replay_dump = mocker.patch('cookiecutter.main.dump')
        mock_replay_load = mocker.patch('cookiecutter.main.load')

>       main.cookiecutter('tests/fake-repo-tmpl/', replay=True)

tests/replay/test_replay.py:40: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = 'tests/fake-repo-tmpl/', checkout = None, no_input = False
extra_context = None, replay = True, overwrite_if_exists = False
output_dir = '.', config_file = None, default_config = False, password = None
directory = None, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

cookiecutter/main.py:60: TypeError

test_replay.py::test_main_does_not_invoke_load_but_dump

test_replay.py::test_main_does_not_invoke_load_but_dump
mocker = 

    def test_main_does_not_invoke_load_but_dump(mocker):
        """Test `cookiecutter` calling correct functions on non-replay launch."""
        mock_prompt = mocker.patch('cookiecutter.main.prompt_for_config')
        mock_gen_context = mocker.patch('cookiecutter.main.generate_context')
        mock_gen_files = mocker.patch('cookiecutter.main.generate_files')
        mock_replay_dump = mocker.patch('cookiecutter.main.dump')
        mock_replay_load = mocker.patch('cookiecutter.main.load')

>       main.cookiecutter('tests/fake-repo-tmpl/', replay=False)

tests/replay/test_replay.py:57: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = 'tests/fake-repo-tmpl/', checkout = None, no_input = False
extra_context = None, replay = False, overwrite_if_exists = False
output_dir = '.', config_file = None, default_config = False, password = None
directory = None, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

cookiecutter/main.py:60: TypeError

test_abbreviation_expansion.py::test_abbreviation_expansion[Expansion prefix]

test_abbreviation_expansion.py::test_abbreviation_expansion[Expansion prefix]
template = 'xx:a', abbreviations = {'xx': '<{0}>'}, expected_result = ''

    @pytest.mark.parametrize(
        ('template', 'abbreviations', 'expected_result'),
        [
            ('foo', {'foo': 'bar'}, 'bar'),
            ('baz', {'foo': 'bar'}, 'baz'),
            ('xx:a', {'xx': '<{0}>'}, ''),
            ('gh:a', {'gh': '<{0}>'}, ''),
            ('xx:a', {'xx': '<>'}, '<>'),
            (
                'gh:pydanny/cookiecutter-django',
                BUILTIN_ABBREVIATIONS,
                'https://github.com/pydanny/cookiecutter-django.git',
            ),
            (
                'gl:pydanny/cookiecutter-django',
                BUILTIN_ABBREVIATIONS,
                'https://gitlab.com/pydanny/cookiecutter-django.git',
            ),
            (
                'bb:pydanny/cookiecutter-django',
                BUILTIN_ABBREVIATIONS,
                'https://bitbucket.org/pydanny/cookiecutter-django',
            ),
        ],
        ids=(
            'Simple expansion',
            'Skip expansion (expansion not an abbreviation)',
            'Expansion prefix',
            'expansion_override_builtin',
            'expansion_prefix_ignores_suffix',
            'Correct expansion for builtin abbreviations (github)',
            'Correct expansion for builtin abbreviations (gitlab)',
            'Correct expansion for builtin abbreviations (bitbucket)',
        ),
    )
    def test_abbreviation_expansion(template, abbreviations, expected_result):
        """Verify abbreviation unpacking."""
        expanded = expand_abbreviations(template, abbreviations)
>       assert expanded == expected_result
E       AssertionError: assert 'xx:a' == ''
E         
E         - 
E         + xx:a

tests/repository/test_abbreviation_expansion.py:47: AssertionError

test_abbreviation_expansion.py::test_abbreviation_expansion[expansion_override_builtin]

test_abbreviation_expansion.py::test_abbreviation_expansion[expansion_override_builtin]
template = 'gh:a', abbreviations = {'gh': '<{0}>'}, expected_result = ''

    @pytest.mark.parametrize(
        ('template', 'abbreviations', 'expected_result'),
        [
            ('foo', {'foo': 'bar'}, 'bar'),
            ('baz', {'foo': 'bar'}, 'baz'),
            ('xx:a', {'xx': '<{0}>'}, ''),
            ('gh:a', {'gh': '<{0}>'}, ''),
            ('xx:a', {'xx': '<>'}, '<>'),
            (
                'gh:pydanny/cookiecutter-django',
                BUILTIN_ABBREVIATIONS,
                'https://github.com/pydanny/cookiecutter-django.git',
            ),
            (
                'gl:pydanny/cookiecutter-django',
                BUILTIN_ABBREVIATIONS,
                'https://gitlab.com/pydanny/cookiecutter-django.git',
            ),
            (
                'bb:pydanny/cookiecutter-django',
                BUILTIN_ABBREVIATIONS,
                'https://bitbucket.org/pydanny/cookiecutter-django',
            ),
        ],
        ids=(
            'Simple expansion',
            'Skip expansion (expansion not an abbreviation)',
            'Expansion prefix',
            'expansion_override_builtin',
            'expansion_prefix_ignores_suffix',
            'Correct expansion for builtin abbreviations (github)',
            'Correct expansion for builtin abbreviations (gitlab)',
            'Correct expansion for builtin abbreviations (bitbucket)',
        ),
    )
    def test_abbreviation_expansion(template, abbreviations, expected_result):
        """Verify abbreviation unpacking."""
        expanded = expand_abbreviations(template, abbreviations)
>       assert expanded == expected_result
E       AssertionError: assert 'gh:a' == ''
E         
E         - 
E         + gh:a

tests/repository/test_abbreviation_expansion.py:47: AssertionError

test_abbreviation_expansion.py::test_abbreviation_expansion[expansion_prefix_ignores_suffix]

test_abbreviation_expansion.py::test_abbreviation_expansion[expansion_prefix_ignores_suffix]
template = 'xx:a', abbreviations = {'xx': '<>'}, expected_result = '<>'

    @pytest.mark.parametrize(
        ('template', 'abbreviations', 'expected_result'),
        [
            ('foo', {'foo': 'bar'}, 'bar'),
            ('baz', {'foo': 'bar'}, 'baz'),
            ('xx:a', {'xx': '<{0}>'}, ''),
            ('gh:a', {'gh': '<{0}>'}, ''),
            ('xx:a', {'xx': '<>'}, '<>'),
            (
                'gh:pydanny/cookiecutter-django',
                BUILTIN_ABBREVIATIONS,
                'https://github.com/pydanny/cookiecutter-django.git',
            ),
            (
                'gl:pydanny/cookiecutter-django',
                BUILTIN_ABBREVIATIONS,
                'https://gitlab.com/pydanny/cookiecutter-django.git',
            ),
            (
                'bb:pydanny/cookiecutter-django',
                BUILTIN_ABBREVIATIONS,
                'https://bitbucket.org/pydanny/cookiecutter-django',
            ),
        ],
        ids=(
            'Simple expansion',
            'Skip expansion (expansion not an abbreviation)',
            'Expansion prefix',
            'expansion_override_builtin',
            'expansion_prefix_ignores_suffix',
            'Correct expansion for builtin abbreviations (github)',
            'Correct expansion for builtin abbreviations (gitlab)',
            'Correct expansion for builtin abbreviations (bitbucket)',
        ),
    )
    def test_abbreviation_expansion(template, abbreviations, expected_result):
        """Verify abbreviation unpacking."""
        expanded = expand_abbreviations(template, abbreviations)
>       assert expanded == expected_result
E       AssertionError: assert 'xx:a' == '<>'
E         
E         - <>
E         + xx:a

tests/repository/test_abbreviation_expansion.py:47: AssertionError

test_abbreviation_expansion.py::test_abbreviation_expansion[Correct expansion for builtin abbreviations (github)]

test_abbreviation_expansion.py::test_abbreviation_expansion[Correct expansion for builtin abbreviations (github)]
template = 'gh:pydanny/cookiecutter-django'
abbreviations = {'bb': 'https://bitbucket.org/{0}', 'gh': 'https://github.com/{0}.git', 'gl': 'https://gitlab.com/{0}.git'}
expected_result = 'https://github.com/pydanny/cookiecutter-django.git'

    @pytest.mark.parametrize(
        ('template', 'abbreviations', 'expected_result'),
        [
            ('foo', {'foo': 'bar'}, 'bar'),
            ('baz', {'foo': 'bar'}, 'baz'),
            ('xx:a', {'xx': '<{0}>'}, ''),
            ('gh:a', {'gh': '<{0}>'}, ''),
            ('xx:a', {'xx': '<>'}, '<>'),
            (
                'gh:pydanny/cookiecutter-django',
                BUILTIN_ABBREVIATIONS,
                'https://github.com/pydanny/cookiecutter-django.git',
            ),
            (
                'gl:pydanny/cookiecutter-django',
                BUILTIN_ABBREVIATIONS,
                'https://gitlab.com/pydanny/cookiecutter-django.git',
            ),
            (
                'bb:pydanny/cookiecutter-django',
                BUILTIN_ABBREVIATIONS,
                'https://bitbucket.org/pydanny/cookiecutter-django',
            ),
        ],
        ids=(
            'Simple expansion',
            'Skip expansion (expansion not an abbreviation)',
            'Expansion prefix',
            'expansion_override_builtin',
            'expansion_prefix_ignores_suffix',
            'Correct expansion for builtin abbreviations (github)',
            'Correct expansion for builtin abbreviations (gitlab)',
            'Correct expansion for builtin abbreviations (bitbucket)',
        ),
    )
    def test_abbreviation_expansion(template, abbreviations, expected_result):
        """Verify abbreviation unpacking."""
        expanded = expand_abbreviations(template, abbreviations)
>       assert expanded == expected_result
E       AssertionError: assert 'gh:pydanny/cookiecutter-django' == 'https://github.com/pydanny/cookiecutter-django.git'
E         
E         - https://github.com/pydanny/cookiecutter-django.git
E         + gh:pydanny/cookiecutter-django

tests/repository/test_abbreviation_expansion.py:47: AssertionError

test_abbreviation_expansion.py::test_abbreviation_expansion[Correct expansion for builtin abbreviations (gitlab)]

test_abbreviation_expansion.py::test_abbreviation_expansion[Correct expansion for builtin abbreviations (gitlab)]
template = 'gl:pydanny/cookiecutter-django'
abbreviations = {'bb': 'https://bitbucket.org/{0}', 'gh': 'https://github.com/{0}.git', 'gl': 'https://gitlab.com/{0}.git'}
expected_result = 'https://gitlab.com/pydanny/cookiecutter-django.git'

    @pytest.mark.parametrize(
        ('template', 'abbreviations', 'expected_result'),
        [
            ('foo', {'foo': 'bar'}, 'bar'),
            ('baz', {'foo': 'bar'}, 'baz'),
            ('xx:a', {'xx': '<{0}>'}, ''),
            ('gh:a', {'gh': '<{0}>'}, ''),
            ('xx:a', {'xx': '<>'}, '<>'),
            (
                'gh:pydanny/cookiecutter-django',
                BUILTIN_ABBREVIATIONS,
                'https://github.com/pydanny/cookiecutter-django.git',
            ),
            (
                'gl:pydanny/cookiecutter-django',
                BUILTIN_ABBREVIATIONS,
                'https://gitlab.com/pydanny/cookiecutter-django.git',
            ),
            (
                'bb:pydanny/cookiecutter-django',
                BUILTIN_ABBREVIATIONS,
                'https://bitbucket.org/pydanny/cookiecutter-django',
            ),
        ],
        ids=(
            'Simple expansion',
            'Skip expansion (expansion not an abbreviation)',
            'Expansion prefix',
            'expansion_override_builtin',
            'expansion_prefix_ignores_suffix',
            'Correct expansion for builtin abbreviations (github)',
            'Correct expansion for builtin abbreviations (gitlab)',
            'Correct expansion for builtin abbreviations (bitbucket)',
        ),
    )
    def test_abbreviation_expansion(template, abbreviations, expected_result):
        """Verify abbreviation unpacking."""
        expanded = expand_abbreviations(template, abbreviations)
>       assert expanded == expected_result
E       AssertionError: assert 'gl:pydanny/cookiecutter-django' == 'https://gitlab.com/pydanny/cookiecutter-django.git'
E         
E         - https://gitlab.com/pydanny/cookiecutter-django.git
E         + gl:pydanny/cookiecutter-django

tests/repository/test_abbreviation_expansion.py:47: AssertionError

test_abbreviation_expansion.py::test_abbreviation_expansion[Correct expansion for builtin abbreviations (bitbucket)]

test_abbreviation_expansion.py::test_abbreviation_expansion[Correct expansion for builtin abbreviations (bitbucket)]
template = 'bb:pydanny/cookiecutter-django'
abbreviations = {'bb': 'https://bitbucket.org/{0}', 'gh': 'https://github.com/{0}.git', 'gl': 'https://gitlab.com/{0}.git'}
expected_result = 'https://bitbucket.org/pydanny/cookiecutter-django'

    @pytest.mark.parametrize(
        ('template', 'abbreviations', 'expected_result'),
        [
            ('foo', {'foo': 'bar'}, 'bar'),
            ('baz', {'foo': 'bar'}, 'baz'),
            ('xx:a', {'xx': '<{0}>'}, ''),
            ('gh:a', {'gh': '<{0}>'}, ''),
            ('xx:a', {'xx': '<>'}, '<>'),
            (
                'gh:pydanny/cookiecutter-django',
                BUILTIN_ABBREVIATIONS,
                'https://github.com/pydanny/cookiecutter-django.git',
            ),
            (
                'gl:pydanny/cookiecutter-django',
                BUILTIN_ABBREVIATIONS,
                'https://gitlab.com/pydanny/cookiecutter-django.git',
            ),
            (
                'bb:pydanny/cookiecutter-django',
                BUILTIN_ABBREVIATIONS,
                'https://bitbucket.org/pydanny/cookiecutter-django',
            ),
        ],
        ids=(
            'Simple expansion',
            'Skip expansion (expansion not an abbreviation)',
            'Expansion prefix',
            'expansion_override_builtin',
            'expansion_prefix_ignores_suffix',
            'Correct expansion for builtin abbreviations (github)',
            'Correct expansion for builtin abbreviations (gitlab)',
            'Correct expansion for builtin abbreviations (bitbucket)',
        ),
    )
    def test_abbreviation_expansion(template, abbreviations, expected_result):
        """Verify abbreviation unpacking."""
        expanded = expand_abbreviations(template, abbreviations)
>       assert expanded == expected_result
E       AssertionError: assert 'bb:pydanny/cookiecutter-django' == 'https://bitbucket.org/pydanny/cookiecutter-django'
E         
E         - https://bitbucket.org/pydanny/cookiecutter-django
E         + bb:pydanny/cookiecutter-django

tests/repository/test_abbreviation_expansion.py:47: AssertionError

test_abbreviation_expansion.py::test_abbreviation_expansion_prefix_not_0_in_braces

test_abbreviation_expansion.py::test_abbreviation_expansion_prefix_not_0_in_braces
def test_abbreviation_expansion_prefix_not_0_in_braces():
        """Verify abbreviation unpacking raises error on incorrect index."""
>       with pytest.raises(IndexError):
E       Failed: DID NOT RAISE 

tests/repository/test_abbreviation_expansion.py:52: Failed

zipfile.zip-True]

zipfile.zip-True]
mocker = 
template = 'https://example.com/path/to/zipfile.zip', is_url = True
user_config_data = {'cookiecutters_dir': '/tmp/pytest-of-root/pytest-0/user_dir0/cookiecutters', 'replay_dir': '/tmp/pytest-of-root/pytest-0/user_dir0/cookiecutter_replay'}

    @pytest.mark.parametrize(
        'template, is_url',
        [
            ('/path/to/zipfile.zip', False),
            ('https://example.com/path/to/zipfile.zip', True),
            ('http://example.com/path/to/zipfile.zip', True),
        ],
    )
    def test_zipfile_unzip(mocker, template, is_url, user_config_data):
        """Verify zip files correctly handled for different source locations.

        `unzip()` should be called with correct args when `determine_repo_dir()`
        is passed a zipfile, or a URL to a zipfile.
        """
        mock_clone = mocker.patch(
            'cookiecutter.repository.unzip',
            return_value='tests/fake-repo-tmpl',
            autospec=True,
        )

>       project_dir, cleanup = repository.determine_repo_dir(
            template,
            abbreviations={},
            clone_to_dir=user_config_data['cookiecutters_dir'],
            checkout=None,
            no_input=True,
            password=None,
        )

tests/repository/test_determine_repo_dir_clones_repo.py:30: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
cookiecutter/repository.py:78: in determine_repo_dir
    repo_dir = clone(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_url = 'https://example.com/path/to/zipfile.zip', checkout = None
clone_to_dir = '/tmp/pytest-of-root/pytest-0/user_dir0/cookiecutters'
no_input = True

    def clone(repo_url: str, checkout: Optional[str]=None, clone_to_dir:
        'os.PathLike[str]'='.', no_input: bool=False):
        """Clone a repo to the current directory.

        :param repo_url: Repo URL of unknown type.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param clone_to_dir: The directory to clone to.
                             Defaults to the current directory.
        :param no_input: Do not prompt for user input and eventually force a refresh of
            cached resources.
        :returns: str with path to the new directory of the repository.
        """
>       repo_type, repo_url = identify_repo(repo_url)
E       TypeError: cannot unpack non-iterable NoneType object

cookiecutter/vcs.py:60: TypeError

zipfile.zip-True]

zipfile.zip-True]
mocker = 
template = 'http://example.com/path/to/zipfile.zip', is_url = True
user_config_data = {'cookiecutters_dir': '/tmp/pytest-of-root/pytest-0/user_dir0/cookiecutters', 'replay_dir': '/tmp/pytest-of-root/pytest-0/user_dir0/cookiecutter_replay'}

    @pytest.mark.parametrize(
        'template, is_url',
        [
            ('/path/to/zipfile.zip', False),
            ('https://example.com/path/to/zipfile.zip', True),
            ('http://example.com/path/to/zipfile.zip', True),
        ],
    )
    def test_zipfile_unzip(mocker, template, is_url, user_config_data):
        """Verify zip files correctly handled for different source locations.

        `unzip()` should be called with correct args when `determine_repo_dir()`
        is passed a zipfile, or a URL to a zipfile.
        """
        mock_clone = mocker.patch(
            'cookiecutter.repository.unzip',
            return_value='tests/fake-repo-tmpl',
            autospec=True,
        )

>       project_dir, cleanup = repository.determine_repo_dir(
            template,
            abbreviations={},
            clone_to_dir=user_config_data['cookiecutters_dir'],
            checkout=None,
            no_input=True,
            password=None,
        )

tests/repository/test_determine_repo_dir_clones_repo.py:30: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
cookiecutter/repository.py:78: in determine_repo_dir
    repo_dir = clone(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_url = 'http://example.com/path/to/zipfile.zip', checkout = None
clone_to_dir = '/tmp/pytest-of-root/pytest-0/user_dir0/cookiecutters'
no_input = True

    def clone(repo_url: str, checkout: Optional[str]=None, clone_to_dir:
        'os.PathLike[str]'='.', no_input: bool=False):
        """Clone a repo to the current directory.

        :param repo_url: Repo URL of unknown type.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param clone_to_dir: The directory to clone to.
                             Defaults to the current directory.
        :param no_input: Do not prompt for user input and eventually force a refresh of
            cached resources.
        :returns: str with path to the new directory of the repository.
        """
>       repo_type, repo_url = identify_repo(repo_url)
E       TypeError: cannot unpack non-iterable NoneType object

cookiecutter/vcs.py:60: TypeError

test_determine_repo_dir_clones_repo.py::test_repository_url_should_clone

test_determine_repo_dir_clones_repo.py::test_repository_url_should_clone
mocker = 
template_url = 'https://github.com/pytest-dev/cookiecutter-pytest-plugin.git'
user_config_data = {'cookiecutters_dir': '/tmp/pytest-of-root/pytest-0/user_dir0/cookiecutters', 'replay_dir': '/tmp/pytest-of-root/pytest-0/user_dir0/cookiecutter_replay'}

    def test_repository_url_should_clone(mocker, template_url, user_config_data):
        """Verify repository url triggers clone function.

        `clone()` should be called with correct args when `determine_repo_dir()` is
        passed a repository template url.
        """
        mock_clone = mocker.patch(
            'cookiecutter.repository.clone',
            return_value='tests/fake-repo-tmpl',
            autospec=True,
        )

        project_dir, cleanup = repository.determine_repo_dir(
            template_url,
            abbreviations={},
            clone_to_dir=user_config_data['cookiecutters_dir'],
            checkout=None,
            no_input=True,
        )

        mock_clone.assert_called_once_with(
            repo_url=template_url,
            checkout=None,
            clone_to_dir=user_config_data['cookiecutters_dir'],
            no_input=True,
        )

        assert os.path.isdir(project_dir)
>       assert not cleanup
E       assert not True

tests/repository/test_determine_repo_dir_clones_repo.py:89: AssertionError

test_determine_repo_dir_clones_repo.py::test_repository_url_with_no_context_file

test_determine_repo_dir_clones_repo.py::test_repository_url_with_no_context_file
mocker = 
template_url = 'https://github.com/pytest-dev/cookiecutter-pytest-plugin.git'
user_config_data = {'cookiecutters_dir': '/tmp/pytest-of-root/pytest-0/user_dir0/cookiecutters', 'replay_dir': '/tmp/pytest-of-root/pytest-0/user_dir0/cookiecutter_replay'}

    def test_repository_url_with_no_context_file(mocker, template_url, user_config_data):
        """Verify cloned repository without `cookiecutter.json` file raises error."""
        mocker.patch(
            'cookiecutter.repository.clone',
            return_value='tests/fake-repo-bad',
            autospec=True,
        )

        with pytest.raises(exceptions.RepositoryNotFound) as err:
            repository.determine_repo_dir(
                template_url,
                abbreviations={},
                clone_to_dir=None,
                checkout=None,
                no_input=True,
            )

>       assert str(err.value) == (
            'A valid repository for "{}" could not be found in the following '
            'locations:\n{}'.format(template_url, 'tests/fake-repo-bad')
        )
E       assert 'The repository tests/fake-repo-bad does not contain a cookiecutter.json file' == 'A valid repository for "https://github.com/pytest-dev/cookiecutter-pytest-plugin.git" could not be found in the following locations:\ntests/fake-repo-bad'
E         
E         + The repository tests/fake-repo-bad does not contain a cookiecutter.json file
E         - A valid repository for "https://github.com/pytest-dev/cookiecutter-pytest-plugin.git" could not be found in the following locations:
E         - tests/fake-repo-bad

tests/repository/test_determine_repo_dir_clones_repo.py:110: AssertionError

test_determine_repo_dir_finds_existing_cookiecutter.py::test_should_find_existing_cookiecutter

test_determine_repo_dir_finds_existing_cookiecutter.py::test_should_find_existing_cookiecutter
template = 'cookiecutter-pytest-plugin'
user_config_data = {'cookiecutters_dir': '/tmp/pytest-of-root/pytest-0/user_dir0/cookiecutters', 'replay_dir': '/tmp/pytest-of-root/pytest-0/user_dir0/cookiecutter_replay'}
cloned_cookiecutter_path = '/tmp/pytest-of-root/pytest-0/user_dir0/cookiecutters/cookiecutter-pytest-plugin'

    def test_should_find_existing_cookiecutter(
        template, user_config_data, cloned_cookiecutter_path
    ):
        """
        Should find folder created by `cloned_cookiecutter_path` and return it.

        This folder is considered like previously cloned project directory.
        """
>       project_dir, cleanup = repository.determine_repo_dir(
            template=template,
            abbreviations={},
            clone_to_dir=user_config_data['cookiecutters_dir'],
            checkout=None,
            no_input=True,
        )

tests/repository/test_determine_repo_dir_finds_existing_cookiecutter.py:38: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = 'cookiecutter-pytest-plugin', abbreviations = {}
clone_to_dir = '/tmp/pytest-of-root/pytest-0/user_dir0/cookiecutters'
checkout = None, no_input = True, password = None, directory = None

    def determine_repo_dir(template, abbreviations, clone_to_dir, checkout,
        no_input, password=None, directory=None):
        """
        Locate the repository directory from a template reference.

        Applies repository abbreviations to the template reference.
        If the template refers to a repository URL, clone it.
        If the template is a path to a local repository, use it.

        :param template: A directory containing a project template directory,
            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: Do not prompt for user input and eventually force a refresh of
            cached resources.
        :param password: The password to use when extracting the repository.
        :param directory: Directory within repo where cookiecutter.json lives.
        :return: A tuple containing the cookiecutter template directory, and
            a boolean describing 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_repo_url(template):
            repo_dir = clone(
                repo_url=template,
                checkout=checkout,
                clone_to_dir=clone_to_dir,
                no_input=no_input
            )
            cleanup = True
        elif is_zip_file(template):
            repo_dir = unzip(
                zip_uri=template,
                is_url=is_repo_url(template),
                clone_to_dir=clone_to_dir,
                no_input=no_input,
                password=password
            )
            cleanup = True
        else:
            repo_dir = template
            cleanup = False

        if directory:
            repo_dir = os.path.join(repo_dir, directory)

        if not repository_has_cookiecutter_json(repo_dir):
>           raise RepositoryNotFound(
                'The repository {} does not contain a cookiecutter.json file'.format(repo_dir)
            )
E           cookiecutter.exceptions.RepositoryNotFound: The repository cookiecutter-pytest-plugin does not contain a cookiecutter.json file

cookiecutter/repository.py:102: RepositoryNotFound

test_determine_repo_dir_finds_subdirectories.py::test_should_find_existing_cookiecutter

test_determine_repo_dir_finds_subdirectories.py::test_should_find_existing_cookiecutter
template = 'cookiecutter-pytest-plugin'
user_config_data = {'cookiecutters_dir': '/tmp/pytest-of-root/pytest-0/user_dir0/cookiecutters', 'replay_dir': '/tmp/pytest-of-root/pytest-0/user_dir0/cookiecutter_replay'}
cloned_cookiecutter_path = '/tmp/pytest-of-root/pytest-0/user_dir0/cookiecutters/cookiecutter-pytest-plugin/my-dir'

    def test_should_find_existing_cookiecutter(
        template, user_config_data, cloned_cookiecutter_path
    ):
        """Find `cookiecutter.json` in sub folder created by `cloned_cookiecutter_path`."""
>       project_dir, cleanup = repository.determine_repo_dir(
            template=template,
            abbreviations={},
            clone_to_dir=user_config_data['cookiecutters_dir'],
            checkout=None,
            no_input=True,
            directory='my-dir',
        )

tests/repository/test_determine_repo_dir_finds_subdirectories.py:38: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = 'cookiecutter-pytest-plugin', abbreviations = {}
clone_to_dir = '/tmp/pytest-of-root/pytest-0/user_dir0/cookiecutters'
checkout = None, no_input = True, password = None, directory = 'my-dir'

    def determine_repo_dir(template, abbreviations, clone_to_dir, checkout,
        no_input, password=None, directory=None):
        """
        Locate the repository directory from a template reference.

        Applies repository abbreviations to the template reference.
        If the template refers to a repository URL, clone it.
        If the template is a path to a local repository, use it.

        :param template: A directory containing a project template directory,
            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: Do not prompt for user input and eventually force a refresh of
            cached resources.
        :param password: The password to use when extracting the repository.
        :param directory: Directory within repo where cookiecutter.json lives.
        :return: A tuple containing the cookiecutter template directory, and
            a boolean describing 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_repo_url(template):
            repo_dir = clone(
                repo_url=template,
                checkout=checkout,
                clone_to_dir=clone_to_dir,
                no_input=no_input
            )
            cleanup = True
        elif is_zip_file(template):
            repo_dir = unzip(
                zip_uri=template,
                is_url=is_repo_url(template),
                clone_to_dir=clone_to_dir,
                no_input=no_input,
                password=password
            )
            cleanup = True
        else:
            repo_dir = template
            cleanup = False

        if directory:
            repo_dir = os.path.join(repo_dir, directory)

        if not repository_has_cookiecutter_json(repo_dir):
>           raise RepositoryNotFound(
                'The repository {} does not contain a cookiecutter.json file'.format(repo_dir)
            )
E           cookiecutter.exceptions.RepositoryNotFound: The repository cookiecutter-pytest-plugin/my-dir does not contain a cookiecutter.json file

cookiecutter/repository.py:102: RepositoryNotFound

test_determine_repo_dir_finds_subdirectories.py::test_local_repo_typo

test_determine_repo_dir_finds_subdirectories.py::test_local_repo_typo
template = 'cookiecutter-pytest-plugin'
user_config_data = {'cookiecutters_dir': '/tmp/pytest-of-root/pytest-0/user_dir0/cookiecutters', 'replay_dir': '/tmp/pytest-of-root/pytest-0/user_dir0/cookiecutter_replay'}
cloned_cookiecutter_path = '/tmp/pytest-of-root/pytest-0/user_dir0/cookiecutters/cookiecutter-pytest-plugin/my-dir'

    def test_local_repo_typo(template, user_config_data, cloned_cookiecutter_path):
        """Wrong pointing to `cookiecutter.json` sub-directory should raise."""
        with pytest.raises(exceptions.RepositoryNotFound) as err:
            repository.determine_repo_dir(
                template=template,
                abbreviations={},
                clone_to_dir=user_config_data['cookiecutters_dir'],
                checkout=None,
                no_input=True,
                directory='wrong-dir',
            )

        wrong_full_cookiecutter_path = os.path.join(
            os.path.dirname(cloned_cookiecutter_path), 'wrong-dir'
        )
>       assert str(err.value) == (
            'A valid repository for "{}" could not be found in the following '
            'locations:\n{}'.format(
                template,
                '\n'.join(
                    [os.path.join(template, 'wrong-dir'), wrong_full_cookiecutter_path]
                ),
            )
        )
E       assert 'The repository cookiecutter-pytest-plugin/wrong-dir does not contain a cookiecutter.json file' == 'A valid repository for "cookiecutter-pytest-plugin" could not be found in the following locations:\ncookiecutter-pytest-plugin/wrong-dir\n/tmp/pytest-of-root/pytest-0/user_dir0/cookiecutters/cookiecutter-pytest-plugin/wrong-dir'
E         
E         + The repository cookiecutter-pytest-plugin/wrong-dir does not contain a cookiecutter.json file
E         - A valid repository for "cookiecutter-pytest-plugin" could not be found in the following locations:
E         - cookiecutter-pytest-plugin/wrong-dir
E         - /tmp/pytest-of-root/pytest-0/user_dir0/cookiecutters/cookiecutter-pytest-plugin/wrong-dir

tests/repository/test_determine_repo_dir_finds_subdirectories.py:66: AssertionError

test_determine_repository_should_use_local_repo.py::test_local_repo_with_no_context_raises

test_determine_repository_should_use_local_repo.py::test_local_repo_with_no_context_raises
tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_local_repo_with_no_contex0')

    def test_local_repo_with_no_context_raises(tmp_path):
        """A local repository without a cookiecutter.json should raise a \
        `RepositoryNotFound` exception."""
        template_path = str(Path('tests', 'fake-repo-bad'))
        with pytest.raises(exceptions.RepositoryNotFound) as err:
            repository.determine_repo_dir(
                template_path,
                abbreviations={},
                clone_to_dir=str(tmp_path),
                checkout=None,
                no_input=True,
            )

>       assert str(err.value) == (
            'A valid repository for "{}" could not be found in the following '
            'locations:\n{}'.format(
                template_path,
                '\n'.join(
                    [template_path, str(tmp_path.joinpath('tests', 'fake-repo-bad'))]
                ),
            )
        )
E       assert 'The repository tests/fake-repo-bad does not contain a cookiecutter.json file' == 'A valid repository for "tests/fake-repo-bad" could not be found in the following locations:\ntests/fake-repo-bad\n/tmp/pytest-of-root/pytest-0/test_local_repo_with_no_contex0/tests/fake-repo-bad'
E         
E         + The repository tests/fake-repo-bad does not contain a cookiecutter.json file
E         - A valid repository for "tests/fake-repo-bad" could not be found in the following locations:
E         - tests/fake-repo-bad
E         - /tmp/pytest-of-root/pytest-0/test_local_repo_with_no_contex0/tests/fake-repo-bad

tests/repository/test_determine_repository_should_use_local_repo.py:37: AssertionError

test_determine_repository_should_use_local_repo.py::test_local_repo_typo

test_determine_repository_should_use_local_repo.py::test_local_repo_typo
tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_local_repo_typo1')

    def test_local_repo_typo(tmp_path):
        """An unknown local repository should raise a `RepositoryNotFound` \
        exception."""
        template_path = str(Path('tests', 'unknown-repo'))
        with pytest.raises(exceptions.RepositoryNotFound) as err:
            repository.determine_repo_dir(
                template_path,
                abbreviations={},
                clone_to_dir=str(tmp_path),
                checkout=None,
                no_input=True,
            )

>       assert str(err.value) == (
            'A valid repository for "{}" could not be found in the following '
            'locations:\n{}'.format(
                template_path,
                '\n'.join([template_path, str(tmp_path.joinpath('tests', 'unknown-repo'))]),
            )
        )
E       assert 'The repository tests/unknown-repo does not contain a cookiecutter.json file' == 'A valid repository for "tests/unknown-repo" could not be found in the following locations:\ntests/unknown-repo\n/tmp/pytest-of-root/pytest-0/test_local_repo_typo1/tests/unknown-repo'
E         
E         + The repository tests/unknown-repo does not contain a cookiecutter.json file
E         - A valid repository for "tests/unknown-repo" could not be found in the following locations:
E         - tests/unknown-repo
E         - /tmp/pytest-of-root/pytest-0/test_local_repo_typo1/tests/unknown-repo

tests/repository/test_determine_repository_should_use_local_repo.py:61: AssertionError

test_is_repo_url.py::test_expand_abbreviations

test_is_repo_url.py::test_expand_abbreviations
def test_expand_abbreviations():
        """Validate `repository.expand_abbreviations` correctly translate url."""
        template = 'gh:audreyfeldroy/cookiecutter-pypackage'

        # This is not a valid repo url just yet!
        # First `repository.expand_abbreviations` needs to translate it
        assert is_repo_url(template) is False

        expanded_template = expand_abbreviations(template, BUILTIN_ABBREVIATIONS)
>       assert is_repo_url(expanded_template) is True
E       AssertionError: assert False is True
E        +  where False = is_repo_url('gh:audreyfeldroy/cookiecutter-pypackage')

tests/repository/test_is_repo_url.py:76: AssertionError

test_abort_generate_on_hook_error.py::test_hooks_raises_errors[pre_gen_hook_raises_error]

test_abort_generate_on_hook_error.py::test_hooks_raises_errors[pre_gen_hook_raises_error]
tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_hooks_raises_errors_pre_g0')
abort_pre_gen = 'yes', abort_post_gen = 'no'

    @pytest.mark.parametrize(
        ("abort_pre_gen", "abort_post_gen"),
        (("yes", "no"), ("no", "yes")),
        ids=("pre_gen_hook_raises_error", "post_gen_hook_raises_error"),
    )
    @pytest.mark.usefixtures("clean_system")
    def test_hooks_raises_errors(tmp_path, abort_pre_gen, abort_post_gen):
        """Verify pre- and pos-gen errors raises correct error code from script.

        This allows developers to make different error codes in their code,
        for different errors.
        """
        context = {
            "cookiecutter": {
                "repo_dir": "foobar",
                "abort_pre_gen": abort_pre_gen,
                "abort_post_gen": abort_post_gen,
            }
        }

        with pytest.raises(exceptions.FailedHookException) as error:
>           generate.generate_files(
                repo_dir="tests/hooks-abort-render",
                context=context,
                output_dir=str(tmp_path),
            )

tests/test_abort_generate_on_hook_error.py:34: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/hooks-abort-render'
context = {'cookiecutter': {'abort_post_gen': 'no', 'abort_pre_gen': 'yes', 'repo_dir': 'foobar'}}
output_dir = '/tmp/pytest-of-root/pytest-0/test_hooks_raises_errors_pre_g0'
overwrite_if_exists = False, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_abort_generate_on_hook_error.py::test_hooks_raises_errors[post_gen_hook_raises_error]

test_abort_generate_on_hook_error.py::test_hooks_raises_errors[post_gen_hook_raises_error]
tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_hooks_raises_errors_post_0')
abort_pre_gen = 'no', abort_post_gen = 'yes'

    @pytest.mark.parametrize(
        ("abort_pre_gen", "abort_post_gen"),
        (("yes", "no"), ("no", "yes")),
        ids=("pre_gen_hook_raises_error", "post_gen_hook_raises_error"),
    )
    @pytest.mark.usefixtures("clean_system")
    def test_hooks_raises_errors(tmp_path, abort_pre_gen, abort_post_gen):
        """Verify pre- and pos-gen errors raises correct error code from script.

        This allows developers to make different error codes in their code,
        for different errors.
        """
        context = {
            "cookiecutter": {
                "repo_dir": "foobar",
                "abort_pre_gen": abort_pre_gen,
                "abort_post_gen": abort_post_gen,
            }
        }

        with pytest.raises(exceptions.FailedHookException) as error:
>           generate.generate_files(
                repo_dir="tests/hooks-abort-render",
                context=context,
                output_dir=str(tmp_path),
            )

tests/test_abort_generate_on_hook_error.py:34: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/hooks-abort-render'
context = {'cookiecutter': {'abort_post_gen': 'yes', 'abort_pre_gen': 'no', 'repo_dir': 'foobar'}}
output_dir = '/tmp/pytest-of-root/pytest-0/test_hooks_raises_errors_post_0'
overwrite_if_exists = False, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_cli.py::test_cli_error_on_existing_output_directory

test_cli.py::test_cli_error_on_existing_output_directory
cli_runner = .cli_main at 0x7ee47e0faef0>

    @pytest.mark.usefixtures('make_fake_project_dir', 'remove_fake_project_dir')
    def test_cli_error_on_existing_output_directory(cli_runner):
        """Test cli invocation without `overwrite-if-exists` fail if dir exist."""
        result = cli_runner('tests/fake-repo-pre/', '--no-input')
        assert result.exit_code != 0
        expected_error_msg = 'Error: "fake-project" directory already exists\n'
>       assert result.output == expected_error_msg
E       assert "ERROR: Error: determine_repo_dir() missing 1 required positional argument: 'abbreviations'\nUnknown error: determine_repo_dir() missing 1 required positional argument: 'abbreviations'\n" == 'Error: "fake-project" directory already exists\n'
E         
E         - Error: "fake-project" directory already exists
E         + ERROR: Error: determine_repo_dir() missing 1 required positional argument: 'abbreviations'
E         + Unknown error: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

tests/test_cli.py:81: AssertionError

test_cli.py::test_cli

test_cli.py::test_cli
cli_runner = .cli_main at 0x7ee47e0faef0>

    @pytest.mark.usefixtures('remove_fake_project_dir')
    def test_cli(cli_runner):
        """Test cli invocation work without flags if directory not exist."""
        result = cli_runner('tests/fake-repo-pre/', '--no-input')
>       assert result.exit_code == 0
E       assert 1 == 0
E        +  where 1 = .exit_code

tests/test_cli.py:88: AssertionError

test_cli.py::test_cli_verbose

test_cli.py::test_cli_verbose
cli_runner = .cli_main at 0x7ee47e0faef0>

    @pytest.mark.usefixtures('remove_fake_project_dir')
    def test_cli_verbose(cli_runner):
        """Test cli invocation display log if called with `verbose` flag."""
        result = cli_runner('tests/fake-repo-pre/', '--no-input', '-v')
>       assert result.exit_code == 0
E       assert 1 == 0
E        +  where 1 = .exit_code

tests/test_cli.py:98: AssertionError

test_cli.py::test_cli_replay

test_cli.py::test_cli_replay
self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': True, 'config_file': None, 'default_config': False, 'directory': None, ...}
expected = call('tests/fake-repo-pre/', None, False, replay=True, overwrite_if_exists=False, skip_if_file_exists=False, output_dir='.', config_file=None, default_config=False, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
actual = call('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=True, overwrite_if_exists=False, output_dir='.', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
_error_message = ._error_message at 0x7ee47e0fbeb0>
cause = None

    def assert_called_with(self, /, *args, **kwargs):
        """assert that the last call was made with the specified arguments.

        Raises an AssertionError if the args and keyword args passed in are
        different to the last call to the mock."""
        if self.call_args is None:
            expected = self._format_mock_call_signature(args, kwargs)
            actual = 'not called.'
            error_message = ('expected call not found.\nExpected: %s\nActual: %s'
                    % (expected, actual))
            raise AssertionError(error_message)

        def _error_message():
            msg = self._format_mock_failure_message(args, kwargs)
            return msg
        expected = self._call_matcher(_Call((args, kwargs), two=True))
        actual = self._call_matcher(self.call_args)
        if actual != expected:
            cause = expected if isinstance(expected, Exception) else None
>           raise AssertionError(_error_message()) from cause
E           AssertionError: expected call not found.
E           Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=True, overwrite_if_exists=False, skip_if_file_exists=False, output_dir='.', config_file=None, default_config=False, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
E           Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=True, overwrite_if_exists=False, output_dir='.', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)

/usr/lib/python3.10/unittest/mock.py:929: AssertionError

During handling of the above exception, another exception occurred:

self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': True, 'config_file': None, 'default_config': False, 'directory': None, ...}

    def assert_called_once_with(self, /, *args, **kwargs):
        """assert that the mock was called exactly once and that that call was
        with the specified arguments."""
        if not self.call_count == 1:
            msg = ("Expected '%s' to be called once. Called %s times.%s"
                   % (self._mock_name or 'mock',
                      self.call_count,
                      self._calls_repr()))
            raise AssertionError(msg)
>       return self.assert_called_with(*args, **kwargs)
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=True, overwrite_if_exists=False, skip_if_file_exists=False, output_dir='.', config_file=None, default_config=False, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=True, overwrite_if_exists=False, output_dir='.', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': True, 'overwrite_if_exists': False, 'output_dir': '.', 'config_file': None, 'default_config': False, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'yes', 'keep_project_on_failure': False} == {'replay': True, 'overwrite_if_exists': False, 'skip_if_file_exists': False, 'output_dir': '.', 'config_file': None, 'default_config': False, 'extra_context': None, 'password': None, 'directory': None, 'accept_hooks': True, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': None,
E          'default_config': False,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '.',
E          'overwrite_if_exists': False,
E          'replay': True,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'yes'} != {'accept_hooks': True}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': True,
E         ?                     ^^^
E         +     'accept_hooks': 'yes',
E         ?                     ^^ ++
E         +     'checkout': None,
E               'config_file': None,
E               'default_config': False,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '.',
E               'overwrite_if_exists': False,
E         -     'password': None,
E               'replay': True,
E               'skip_if_file_exists': False,
E           }

/usr/lib/python3.10/unittest/mock.py:941: AssertionError

During handling of the above exception, another exception occurred:

mocker = 
cli_runner = .cli_main at 0x7ee47e0faef0>

    @pytest.mark.usefixtures('remove_fake_project_dir')
    def test_cli_replay(mocker, cli_runner):
        """Test cli invocation display log with `verbose` and `replay` flags."""
        mock_cookiecutter = mocker.patch('cookiecutter.cli.cookiecutter')

        template_path = 'tests/fake-repo-pre/'
        result = cli_runner(template_path, '--replay', '-v')

        assert result.exit_code == 0
>       mock_cookiecutter.assert_called_once_with(
            template_path,
            None,
            False,
            replay=True,
            overwrite_if_exists=False,
            skip_if_file_exists=False,
            output_dir='.',
            config_file=None,
            default_config=False,
            extra_context=None,
            password=None,
            directory=None,
            accept_hooks=True,
            keep_project_on_failure=False,
        )
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=True, overwrite_if_exists=False, skip_if_file_exists=False, output_dir='.', config_file=None, default_config=False, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=True, overwrite_if_exists=False, output_dir='.', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': True, 'overwrite_if_exists': False, 'output_dir': '.', 'config_file': None, 'default_config': False, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'yes', 'keep_project_on_failure': False} == {'replay': True, 'overwrite_if_exists': False, 'skip_if_file_exists': False, 'output_dir': '.', 'config_file': None, 'default_config': False, 'extra_context': None, 'password': None, 'directory': None, 'accept_hooks': True, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': None,
E          'default_config': False,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '.',
E          'overwrite_if_exists': False,
E          'replay': True,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'yes'} != {'accept_hooks': True}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': True,
E         ?                     ^^^
E         +     'accept_hooks': 'yes',
E         ?                     ^^ ++
E         +     'checkout': None,
E               'config_file': None,
E               'default_config': False,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '.',
E               'overwrite_if_exists': False,
E         -     'password': None,
E               'replay': True,
E               'skip_if_file_exists': False,
E           }

tests/test_cli.py:113: AssertionError

test_cli.py::test_cli_replay_file

test_cli.py::test_cli_replay_file
self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': True, 'config_file': None, 'default_config': False, 'directory': None, ...}
expected = call('tests/fake-repo-pre/', None, False, replay='~/custom-replay-file', overwrite_if_exists=False, skip_if_file_exists=False, output_dir='.', config_file=None, default_config=False, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
actual = call('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='.', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
_error_message = ._error_message at 0x7ee47e0303a0>
cause = None

    def assert_called_with(self, /, *args, **kwargs):
        """assert that the last call was made with the specified arguments.

        Raises an AssertionError if the args and keyword args passed in are
        different to the last call to the mock."""
        if self.call_args is None:
            expected = self._format_mock_call_signature(args, kwargs)
            actual = 'not called.'
            error_message = ('expected call not found.\nExpected: %s\nActual: %s'
                    % (expected, actual))
            raise AssertionError(error_message)

        def _error_message():
            msg = self._format_mock_failure_message(args, kwargs)
            return msg
        expected = self._call_matcher(_Call((args, kwargs), two=True))
        actual = self._call_matcher(self.call_args)
        if actual != expected:
            cause = expected if isinstance(expected, Exception) else None
>           raise AssertionError(_error_message()) from cause
E           AssertionError: expected call not found.
E           Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay='~/custom-replay-file', overwrite_if_exists=False, skip_if_file_exists=False, output_dir='.', config_file=None, default_config=False, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
E           Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='.', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)

/usr/lib/python3.10/unittest/mock.py:929: AssertionError

During handling of the above exception, another exception occurred:

self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': True, 'config_file': None, 'default_config': False, 'directory': None, ...}

    def assert_called_once_with(self, /, *args, **kwargs):
        """assert that the mock was called exactly once and that that call was
        with the specified arguments."""
        if not self.call_count == 1:
            msg = ("Expected '%s' to be called once. Called %s times.%s"
                   % (self._mock_name or 'mock',
                      self.call_count,
                      self._calls_repr()))
            raise AssertionError(msg)
>       return self.assert_called_with(*args, **kwargs)
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay='~/custom-replay-file', overwrite_if_exists=False, skip_if_file_exists=False, output_dir='.', config_file=None, default_config=False, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='.', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': False, 'overwrite_if_exists': False, 'output_dir': '.', 'config_file': None, 'default_config': False, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'yes', 'keep_project_on_failure': False} == {'replay': '~/custom-replay-file', 'overwrite_if_exists': False, 'skip_if_file_exists': False, 'output_dir': '.', 'config_file': None, 'default_config': False, 'extra_context': None, 'password': None, 'directory': None, 'accept_hooks': True, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': None,
E          'default_config': False,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '.',
E          'overwrite_if_exists': False,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'replay': False} != {'replay': '~/custom-replay-file'}
E         {'accept_hooks': 'yes'} != {'accept_hooks': True}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': True,
E         ?                     ^^^
E         +     'accept_hooks': 'yes',
E         ?                     ^^ ++
E         +     'checkout': None,
E               'config_file': None,
E               'default_config': False,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '.',
E               'overwrite_if_exists': False,
E         +     'replay': False,
E         -     'password': None,
E         -     'replay': '~/custom-replay-file',
E               'skip_if_file_exists': False,
E           }

/usr/lib/python3.10/unittest/mock.py:941: AssertionError

During handling of the above exception, another exception occurred:

mocker = 
cli_runner = .cli_main at 0x7ee47e0faef0>

    @pytest.mark.usefixtures('remove_fake_project_dir')
    def test_cli_replay_file(mocker, cli_runner):
        """Test cli invocation correctly pass --replay-file option."""
        mock_cookiecutter = mocker.patch('cookiecutter.cli.cookiecutter')

        template_path = 'tests/fake-repo-pre/'
        result = cli_runner(template_path, '--replay-file', '~/custom-replay-file', '-v')

        assert result.exit_code == 0
>       mock_cookiecutter.assert_called_once_with(
            template_path,
            None,
            False,
            replay='~/custom-replay-file',
            overwrite_if_exists=False,
            skip_if_file_exists=False,
            output_dir='.',
            config_file=None,
            default_config=False,
            extra_context=None,
            password=None,
            directory=None,
            accept_hooks=True,
            keep_project_on_failure=False,
        )
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay='~/custom-replay-file', overwrite_if_exists=False, skip_if_file_exists=False, output_dir='.', config_file=None, default_config=False, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='.', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': False, 'overwrite_if_exists': False, 'output_dir': '.', 'config_file': None, 'default_config': False, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'yes', 'keep_project_on_failure': False} == {'replay': '~/custom-replay-file', 'overwrite_if_exists': False, 'skip_if_file_exists': False, 'output_dir': '.', 'config_file': None, 'default_config': False, 'extra_context': None, 'password': None, 'directory': None, 'accept_hooks': True, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': None,
E          'default_config': False,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '.',
E          'overwrite_if_exists': False,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'replay': False} != {'replay': '~/custom-replay-file'}
E         {'accept_hooks': 'yes'} != {'accept_hooks': True}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': True,
E         ?                     ^^^
E         +     'accept_hooks': 'yes',
E         ?                     ^^ ++
E         +     'checkout': None,
E               'config_file': None,
E               'default_config': False,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '.',
E               'overwrite_if_exists': False,
E         +     'replay': False,
E         -     'password': None,
E         -     'replay': '~/custom-replay-file',
E               'skip_if_file_exists': False,
E           }

tests/test_cli.py:140: AssertionError

test_cli.py::test_cli_replay_generated

test_cli.py::test_cli_replay_generated
mocker = 
cli_runner = .cli_main at 0x7ee47e0faef0>

    @pytest.mark.usefixtures('remove_tmp_dir')
    def test_cli_replay_generated(mocker, cli_runner):
        """Test cli invocation correctly generates a project with replay."""
        template_path = 'tests/fake-repo-replay/'
        result = cli_runner(
            template_path,
            '--replay-file',
            'tests/test-replay/valid_replay.json',
            '-o',
            'tests/tmp/',
            '-v',
        )
>       assert result.exit_code == 0
E       assert 1 == 0
E        +  where 1 = .exit_code

tests/test_cli.py:170: AssertionError

test_cli.py::test_cli_exit_on_noinput_and_replay

test_cli.py::test_cli_exit_on_noinput_and_replay
mocker = 
cli_runner = .cli_main at 0x7ee47e0faef0>

    @pytest.mark.usefixtures('remove_fake_project_dir')
    def test_cli_exit_on_noinput_and_replay(mocker, cli_runner):
        """Test cli invocation fail if both `no-input` and `replay` flags passed."""
        mock_cookiecutter = mocker.patch(
            'cookiecutter.cli.cookiecutter', side_effect=cookiecutter
        )

        template_path = 'tests/fake-repo-pre/'
        result = cli_runner(template_path, '--no-input', '--replay', '-v')

        assert result.exit_code == 1

        expected_error_msg = (
            "You can not use both replay and no_input or extra_context at the same time."
        )

>       assert expected_error_msg in result.output
E       assert 'You can not use both replay and no_input or extra_context at the same time.' in "ERROR cookiecutter.main: Error: determine_repo_dir() missing 1 required positional argument: 'abbreviations'\nUnknown error: determine_repo_dir() missing 1 required positional argument: 'abbreviations'\n"
E        +  where "ERROR cookiecutter.main: Error: determine_repo_dir() missing 1 required positional argument: 'abbreviations'\nUnknown error: determine_repo_dir() missing 1 required positional argument: 'abbreviations'\n" = .output

tests/test_cli.py:190: AssertionError

test_cli.py::test_run_cookiecutter_on_overwrite_if_exists_and_replay[-f]

test_cli.py::test_run_cookiecutter_on_overwrite_if_exists_and_replay[-f]
self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': True, 'config_file': None, 'default_config': False, 'directory': None, ...}
expected = call('tests/fake-repo-pre/', None, False, replay=True, overwrite_if_exists=True, skip_if_file_exists=False, output_dir='.', config_file=None, default_config=False, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
actual = call('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=True, overwrite_if_exists=True, output_dir='.', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
_error_message = ._error_message at 0x7ee47e0fb490>
cause = None

    def assert_called_with(self, /, *args, **kwargs):
        """assert that the last call was made with the specified arguments.

        Raises an AssertionError if the args and keyword args passed in are
        different to the last call to the mock."""
        if self.call_args is None:
            expected = self._format_mock_call_signature(args, kwargs)
            actual = 'not called.'
            error_message = ('expected call not found.\nExpected: %s\nActual: %s'
                    % (expected, actual))
            raise AssertionError(error_message)

        def _error_message():
            msg = self._format_mock_failure_message(args, kwargs)
            return msg
        expected = self._call_matcher(_Call((args, kwargs), two=True))
        actual = self._call_matcher(self.call_args)
        if actual != expected:
            cause = expected if isinstance(expected, Exception) else None
>           raise AssertionError(_error_message()) from cause
E           AssertionError: expected call not found.
E           Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=True, overwrite_if_exists=True, skip_if_file_exists=False, output_dir='.', config_file=None, default_config=False, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
E           Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=True, overwrite_if_exists=True, output_dir='.', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)

/usr/lib/python3.10/unittest/mock.py:929: AssertionError

During handling of the above exception, another exception occurred:

self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': True, 'config_file': None, 'default_config': False, 'directory': None, ...}

    def assert_called_once_with(self, /, *args, **kwargs):
        """assert that the mock was called exactly once and that that call was
        with the specified arguments."""
        if not self.call_count == 1:
            msg = ("Expected '%s' to be called once. Called %s times.%s"
                   % (self._mock_name or 'mock',
                      self.call_count,
                      self._calls_repr()))
            raise AssertionError(msg)
>       return self.assert_called_with(*args, **kwargs)
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=True, overwrite_if_exists=True, skip_if_file_exists=False, output_dir='.', config_file=None, default_config=False, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=True, overwrite_if_exists=True, output_dir='.', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': True, 'overwrite_if_exists': True, 'output_dir': '.', 'config_file': None, 'default_config': False, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'yes', 'keep_project_on_failure': False} == {'replay': True, 'overwrite_if_exists': True, 'skip_if_file_exists': False, 'output_dir': '.', 'config_file': None, 'default_config': False, 'extra_context': None, 'password': None, 'directory': None, 'accept_hooks': True, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': None,
E          'default_config': False,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '.',
E          'overwrite_if_exists': True,
E          'replay': True,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'yes'} != {'accept_hooks': True}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': True,
E         ?                     ^^^
E         +     'accept_hooks': 'yes',
E         ?                     ^^ ++
E         +     'checkout': None,
E               'config_file': None,
E               'default_config': False,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '.',
E               'overwrite_if_exists': True,
E         -     'password': None,
E               'replay': True,
E               'skip_if_file_exists': False,
E           }

/usr/lib/python3.10/unittest/mock.py:941: AssertionError

During handling of the above exception, another exception occurred:

mocker = 
cli_runner = .cli_main at 0x7ee47e0faef0>
overwrite_cli_flag = '-f'

    @pytest.mark.usefixtures('remove_fake_project_dir')
    def test_run_cookiecutter_on_overwrite_if_exists_and_replay(
        mocker, cli_runner, overwrite_cli_flag
    ):
        """Test cli invocation with `overwrite-if-exists` and `replay` flags."""
        mock_cookiecutter = mocker.patch('cookiecutter.cli.cookiecutter')

        template_path = 'tests/fake-repo-pre/'
        result = cli_runner(template_path, '--replay', '-v', overwrite_cli_flag)

        assert result.exit_code == 0

>       mock_cookiecutter.assert_called_once_with(
            template_path,
            None,
            False,
            replay=True,
            overwrite_if_exists=True,
            skip_if_file_exists=False,
            output_dir='.',
            config_file=None,
            default_config=False,
            extra_context=None,
            password=None,
            directory=None,
            accept_hooks=True,
            keep_project_on_failure=False,
        )
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=True, overwrite_if_exists=True, skip_if_file_exists=False, output_dir='.', config_file=None, default_config=False, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=True, overwrite_if_exists=True, output_dir='.', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': True, 'overwrite_if_exists': True, 'output_dir': '.', 'config_file': None, 'default_config': False, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'yes', 'keep_project_on_failure': False} == {'replay': True, 'overwrite_if_exists': True, 'skip_if_file_exists': False, 'output_dir': '.', 'config_file': None, 'default_config': False, 'extra_context': None, 'password': None, 'directory': None, 'accept_hooks': True, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': None,
E          'default_config': False,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '.',
E          'overwrite_if_exists': True,
E          'replay': True,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'yes'} != {'accept_hooks': True}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': True,
E         ?                     ^^^
E         +     'accept_hooks': 'yes',
E         ?                     ^^ ++
E         +     'checkout': None,
E               'config_file': None,
E               'default_config': False,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '.',
E               'overwrite_if_exists': True,
E         -     'password': None,
E               'replay': True,
E               'skip_if_file_exists': False,
E           }

tests/test_cli.py:228: AssertionError

test_cli.py::test_run_cookiecutter_on_overwrite_if_exists_and_replay[--overwrite-if-exists]

test_cli.py::test_run_cookiecutter_on_overwrite_if_exists_and_replay[--overwrite-if-exists]
self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': True, 'config_file': None, 'default_config': False, 'directory': None, ...}
expected = call('tests/fake-repo-pre/', None, False, replay=True, overwrite_if_exists=True, skip_if_file_exists=False, output_dir='.', config_file=None, default_config=False, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
actual = call('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=True, overwrite_if_exists=True, output_dir='.', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
_error_message = ._error_message at 0x7ee47e0fb010>
cause = None

    def assert_called_with(self, /, *args, **kwargs):
        """assert that the last call was made with the specified arguments.

        Raises an AssertionError if the args and keyword args passed in are
        different to the last call to the mock."""
        if self.call_args is None:
            expected = self._format_mock_call_signature(args, kwargs)
            actual = 'not called.'
            error_message = ('expected call not found.\nExpected: %s\nActual: %s'
                    % (expected, actual))
            raise AssertionError(error_message)

        def _error_message():
            msg = self._format_mock_failure_message(args, kwargs)
            return msg
        expected = self._call_matcher(_Call((args, kwargs), two=True))
        actual = self._call_matcher(self.call_args)
        if actual != expected:
            cause = expected if isinstance(expected, Exception) else None
>           raise AssertionError(_error_message()) from cause
E           AssertionError: expected call not found.
E           Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=True, overwrite_if_exists=True, skip_if_file_exists=False, output_dir='.', config_file=None, default_config=False, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
E           Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=True, overwrite_if_exists=True, output_dir='.', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)

/usr/lib/python3.10/unittest/mock.py:929: AssertionError

During handling of the above exception, another exception occurred:

self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': True, 'config_file': None, 'default_config': False, 'directory': None, ...}

    def assert_called_once_with(self, /, *args, **kwargs):
        """assert that the mock was called exactly once and that that call was
        with the specified arguments."""
        if not self.call_count == 1:
            msg = ("Expected '%s' to be called once. Called %s times.%s"
                   % (self._mock_name or 'mock',
                      self.call_count,
                      self._calls_repr()))
            raise AssertionError(msg)
>       return self.assert_called_with(*args, **kwargs)
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=True, overwrite_if_exists=True, skip_if_file_exists=False, output_dir='.', config_file=None, default_config=False, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=True, overwrite_if_exists=True, output_dir='.', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': True, 'overwrite_if_exists': True, 'output_dir': '.', 'config_file': None, 'default_config': False, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'yes', 'keep_project_on_failure': False} == {'replay': True, 'overwrite_if_exists': True, 'skip_if_file_exists': False, 'output_dir': '.', 'config_file': None, 'default_config': False, 'extra_context': None, 'password': None, 'directory': None, 'accept_hooks': True, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': None,
E          'default_config': False,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '.',
E          'overwrite_if_exists': True,
E          'replay': True,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'yes'} != {'accept_hooks': True}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': True,
E         ?                     ^^^
E         +     'accept_hooks': 'yes',
E         ?                     ^^ ++
E         +     'checkout': None,
E               'config_file': None,
E               'default_config': False,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '.',
E               'overwrite_if_exists': True,
E         -     'password': None,
E               'replay': True,
E               'skip_if_file_exists': False,
E           }

/usr/lib/python3.10/unittest/mock.py:941: AssertionError

During handling of the above exception, another exception occurred:

mocker = 
cli_runner = .cli_main at 0x7ee47e0faef0>
overwrite_cli_flag = '--overwrite-if-exists'

    @pytest.mark.usefixtures('remove_fake_project_dir')
    def test_run_cookiecutter_on_overwrite_if_exists_and_replay(
        mocker, cli_runner, overwrite_cli_flag
    ):
        """Test cli invocation with `overwrite-if-exists` and `replay` flags."""
        mock_cookiecutter = mocker.patch('cookiecutter.cli.cookiecutter')

        template_path = 'tests/fake-repo-pre/'
        result = cli_runner(template_path, '--replay', '-v', overwrite_cli_flag)

        assert result.exit_code == 0

>       mock_cookiecutter.assert_called_once_with(
            template_path,
            None,
            False,
            replay=True,
            overwrite_if_exists=True,
            skip_if_file_exists=False,
            output_dir='.',
            config_file=None,
            default_config=False,
            extra_context=None,
            password=None,
            directory=None,
            accept_hooks=True,
            keep_project_on_failure=False,
        )
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=True, overwrite_if_exists=True, skip_if_file_exists=False, output_dir='.', config_file=None, default_config=False, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=True, overwrite_if_exists=True, output_dir='.', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': True, 'overwrite_if_exists': True, 'output_dir': '.', 'config_file': None, 'default_config': False, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'yes', 'keep_project_on_failure': False} == {'replay': True, 'overwrite_if_exists': True, 'skip_if_file_exists': False, 'output_dir': '.', 'config_file': None, 'default_config': False, 'extra_context': None, 'password': None, 'directory': None, 'accept_hooks': True, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': None,
E          'default_config': False,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '.',
E          'overwrite_if_exists': True,
E          'replay': True,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'yes'} != {'accept_hooks': True}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': True,
E         ?                     ^^^
E         +     'accept_hooks': 'yes',
E         ?                     ^^ ++
E         +     'checkout': None,
E               'config_file': None,
E               'default_config': False,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '.',
E               'overwrite_if_exists': True,
E         -     'password': None,
E               'replay': True,
E               'skip_if_file_exists': False,
E           }

tests/test_cli.py:228: AssertionError

test_cli.py::test_cli_overwrite_if_exists_when_output_dir_does_not_exist[-f]

test_cli.py::test_cli_overwrite_if_exists_when_output_dir_does_not_exist[-f]
cli_runner = .cli_main at 0x7ee47e0faef0>
overwrite_cli_flag = '-f'

    @pytest.mark.usefixtures('remove_fake_project_dir')
    def test_cli_overwrite_if_exists_when_output_dir_does_not_exist(
        cli_runner, overwrite_cli_flag
    ):
        """Test cli invocation with `overwrite-if-exists` and `no-input` flags.

        Case when output dir not exist.
        """
        result = cli_runner('tests/fake-repo-pre/', '--no-input', overwrite_cli_flag)

>       assert result.exit_code == 0
E       assert 1 == 0
E        +  where 1 = .exit_code

tests/test_cli.py:256: AssertionError

test_cli.py::test_cli_overwrite_if_exists_when_output_dir_does_not_exist[--overwrite-if-exists]

test_cli.py::test_cli_overwrite_if_exists_when_output_dir_does_not_exist[--overwrite-if-exists]
cli_runner = .cli_main at 0x7ee47e0faef0>
overwrite_cli_flag = '--overwrite-if-exists'

    @pytest.mark.usefixtures('remove_fake_project_dir')
    def test_cli_overwrite_if_exists_when_output_dir_does_not_exist(
        cli_runner, overwrite_cli_flag
    ):
        """Test cli invocation with `overwrite-if-exists` and `no-input` flags.

        Case when output dir not exist.
        """
        result = cli_runner('tests/fake-repo-pre/', '--no-input', overwrite_cli_flag)

>       assert result.exit_code == 0
E       assert 1 == 0
E        +  where 1 = .exit_code

tests/test_cli.py:256: AssertionError

test_cli.py::test_cli_overwrite_if_exists_when_output_dir_exists[-f]

test_cli.py::test_cli_overwrite_if_exists_when_output_dir_exists[-f]
cli_runner = .cli_main at 0x7ee47e0faef0>
overwrite_cli_flag = '-f'

    @pytest.mark.usefixtures('make_fake_project_dir', 'remove_fake_project_dir')
    def test_cli_overwrite_if_exists_when_output_dir_exists(cli_runner, overwrite_cli_flag):
        """Test cli invocation with `overwrite-if-exists` and `no-input` flags.

        Case when output dir already exist.
        """
        result = cli_runner('tests/fake-repo-pre/', '--no-input', overwrite_cli_flag)
>       assert result.exit_code == 0
E       assert 1 == 0
E        +  where 1 = .exit_code

tests/test_cli.py:267: AssertionError

test_cli.py::test_cli_overwrite_if_exists_when_output_dir_exists[--overwrite-if-exists]

test_cli.py::test_cli_overwrite_if_exists_when_output_dir_exists[--overwrite-if-exists]
cli_runner = .cli_main at 0x7ee47e0faef0>
overwrite_cli_flag = '--overwrite-if-exists'

    @pytest.mark.usefixtures('make_fake_project_dir', 'remove_fake_project_dir')
    def test_cli_overwrite_if_exists_when_output_dir_exists(cli_runner, overwrite_cli_flag):
        """Test cli invocation with `overwrite-if-exists` and `no-input` flags.

        Case when output dir already exist.
        """
        result = cli_runner('tests/fake-repo-pre/', '--no-input', overwrite_cli_flag)
>       assert result.exit_code == 0
E       assert 1 == 0
E        +  where 1 = .exit_code

tests/test_cli.py:267: AssertionError

test_cli.py::test_cli_output_dir[-o]

test_cli.py::test_cli_output_dir[-o]
self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': True, 'config_file': None, 'default_config': False, 'directory': None, ...}
expected = call('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, skip_if_file_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_output_dir__o_0/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
actual = call('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_output_dir__o_0/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
_error_message = ._error_message at 0x7ee47e030af0>
cause = None

    def assert_called_with(self, /, *args, **kwargs):
        """assert that the last call was made with the specified arguments.

        Raises an AssertionError if the args and keyword args passed in are
        different to the last call to the mock."""
        if self.call_args is None:
            expected = self._format_mock_call_signature(args, kwargs)
            actual = 'not called.'
            error_message = ('expected call not found.\nExpected: %s\nActual: %s'
                    % (expected, actual))
            raise AssertionError(error_message)

        def _error_message():
            msg = self._format_mock_failure_message(args, kwargs)
            return msg
        expected = self._call_matcher(_Call((args, kwargs), two=True))
        actual = self._call_matcher(self.call_args)
        if actual != expected:
            cause = expected if isinstance(expected, Exception) else None
>           raise AssertionError(_error_message()) from cause
E           AssertionError: expected call not found.
E           Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, skip_if_file_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_output_dir__o_0/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
E           Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_output_dir__o_0/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)

/usr/lib/python3.10/unittest/mock.py:929: AssertionError

During handling of the above exception, another exception occurred:

self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': True, 'config_file': None, 'default_config': False, 'directory': None, ...}

    def assert_called_once_with(self, /, *args, **kwargs):
        """assert that the mock was called exactly once and that that call was
        with the specified arguments."""
        if not self.call_count == 1:
            msg = ("Expected '%s' to be called once. Called %s times.%s"
                   % (self._mock_name or 'mock',
                      self.call_count,
                      self._calls_repr()))
            raise AssertionError(msg)
>       return self.assert_called_with(*args, **kwargs)
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, skip_if_file_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_output_dir__o_0/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_output_dir__o_0/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_output_dir__o_0/output', 'config_file': None, 'default_config': False, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'yes', 'keep_project_on_failure': False} == {'replay': False, 'overwrite_if_exists': False, 'skip_if_file_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_output_dir__o_0/output', 'config_file': None, 'default_config': False, 'extra_context': None, 'password': None, 'directory': None, 'accept_hooks': True, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': None,
E          'default_config': False,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_output_dir__o_0/output',
E          'overwrite_if_exists': False,
E          'replay': False,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'yes'} != {'accept_hooks': True}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': True,
E         ?                     ^^^
E         +     'accept_hooks': 'yes',
E         ?                     ^^ ++
E         +     'checkout': None,
E               'config_file': None,
E               'default_config': False,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_output_dir__o_0/output',
E               'overwrite_if_exists': False,
E         -     'password': None,
E               'replay': False,
E               'skip_if_file_exists': False,
E           }

/usr/lib/python3.10/unittest/mock.py:941: AssertionError

During handling of the above exception, another exception occurred:

mocker = 
cli_runner = .cli_main at 0x7ee47e0faef0>
output_dir_flag = '-o'
output_dir = '/tmp/pytest-of-root/pytest-0/test_cli_output_dir__o_0/output'

    def test_cli_output_dir(mocker, cli_runner, output_dir_flag, output_dir):
        """Test cli invocation with `output-dir` flag changes output directory."""
        mock_cookiecutter = mocker.patch('cookiecutter.cli.cookiecutter')

        template_path = 'tests/fake-repo-pre/'
        result = cli_runner(template_path, output_dir_flag, output_dir)

        assert result.exit_code == 0
>       mock_cookiecutter.assert_called_once_with(
            template_path,
            None,
            False,
            replay=False,
            overwrite_if_exists=False,
            skip_if_file_exists=False,
            output_dir=output_dir,
            config_file=None,
            default_config=False,
            extra_context=None,
            password=None,
            directory=None,
            accept_hooks=True,
            keep_project_on_failure=False,
        )
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, skip_if_file_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_output_dir__o_0/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_output_dir__o_0/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_output_dir__o_0/output', 'config_file': None, 'default_config': False, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'yes', 'keep_project_on_failure': False} == {'replay': False, 'overwrite_if_exists': False, 'skip_if_file_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_output_dir__o_0/output', 'config_file': None, 'default_config': False, 'extra_context': None, 'password': None, 'directory': None, 'accept_hooks': True, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': None,
E          'default_config': False,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_output_dir__o_0/output',
E          'overwrite_if_exists': False,
E          'replay': False,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'yes'} != {'accept_hooks': True}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': True,
E         ?                     ^^^
E         +     'accept_hooks': 'yes',
E         ?                     ^^ ++
E         +     'checkout': None,
E               'config_file': None,
E               'default_config': False,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_output_dir__o_0/output',
E               'overwrite_if_exists': False,
E         -     'password': None,
E               'replay': False,
E               'skip_if_file_exists': False,
E           }

tests/test_cli.py:285: AssertionError

test_cli.py::test_cli_output_dir[--output-dir]

test_cli.py::test_cli_output_dir[--output-dir]
self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': True, 'config_file': None, 'default_config': False, 'directory': None, ...}
expected = call('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, skip_if_file_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_output_dir___output_d0/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
actual = call('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_output_dir___output_d0/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
_error_message = ._error_message at 0x7ee47e0fbeb0>
cause = None

    def assert_called_with(self, /, *args, **kwargs):
        """assert that the last call was made with the specified arguments.

        Raises an AssertionError if the args and keyword args passed in are
        different to the last call to the mock."""
        if self.call_args is None:
            expected = self._format_mock_call_signature(args, kwargs)
            actual = 'not called.'
            error_message = ('expected call not found.\nExpected: %s\nActual: %s'
                    % (expected, actual))
            raise AssertionError(error_message)

        def _error_message():
            msg = self._format_mock_failure_message(args, kwargs)
            return msg
        expected = self._call_matcher(_Call((args, kwargs), two=True))
        actual = self._call_matcher(self.call_args)
        if actual != expected:
            cause = expected if isinstance(expected, Exception) else None
>           raise AssertionError(_error_message()) from cause
E           AssertionError: expected call not found.
E           Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, skip_if_file_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_output_dir___output_d0/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
E           Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_output_dir___output_d0/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)

/usr/lib/python3.10/unittest/mock.py:929: AssertionError

During handling of the above exception, another exception occurred:

self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': True, 'config_file': None, 'default_config': False, 'directory': None, ...}

    def assert_called_once_with(self, /, *args, **kwargs):
        """assert that the mock was called exactly once and that that call was
        with the specified arguments."""
        if not self.call_count == 1:
            msg = ("Expected '%s' to be called once. Called %s times.%s"
                   % (self._mock_name or 'mock',
                      self.call_count,
                      self._calls_repr()))
            raise AssertionError(msg)
>       return self.assert_called_with(*args, **kwargs)
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, skip_if_file_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_output_dir___output_d0/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_output_dir___output_d0/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_output_dir___output_d0/output', 'config_file': None, 'default_config': False, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'yes', 'keep_project_on_failure': False} == {'replay': False, 'overwrite_if_exists': False, 'skip_if_file_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_output_dir___output_d0/output', 'config_file': None, 'default_config': False, 'extra_context': None, 'password': None, 'directory': None, 'accept_hooks': True, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': None,
E          'default_config': False,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_output_dir___output_d0/output',
E          'overwrite_if_exists': False,
E          'replay': False,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'yes'} != {'accept_hooks': True}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': True,
E         ?                     ^^^
E         +     'accept_hooks': 'yes',
E         ?                     ^^ ++
E         +     'checkout': None,
E               'config_file': None,
E               'default_config': False,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_output_dir___output_d0/output',
E               'overwrite_if_exists': False,
E         -     'password': None,
E               'replay': False,
E               'skip_if_file_exists': False,
E           }

/usr/lib/python3.10/unittest/mock.py:941: AssertionError

During handling of the above exception, another exception occurred:

mocker = 
cli_runner = .cli_main at 0x7ee47e0faef0>
output_dir_flag = '--output-dir'
output_dir = '/tmp/pytest-of-root/pytest-0/test_cli_output_dir___output_d0/output'

    def test_cli_output_dir(mocker, cli_runner, output_dir_flag, output_dir):
        """Test cli invocation with `output-dir` flag changes output directory."""
        mock_cookiecutter = mocker.patch('cookiecutter.cli.cookiecutter')

        template_path = 'tests/fake-repo-pre/'
        result = cli_runner(template_path, output_dir_flag, output_dir)

        assert result.exit_code == 0
>       mock_cookiecutter.assert_called_once_with(
            template_path,
            None,
            False,
            replay=False,
            overwrite_if_exists=False,
            skip_if_file_exists=False,
            output_dir=output_dir,
            config_file=None,
            default_config=False,
            extra_context=None,
            password=None,
            directory=None,
            accept_hooks=True,
            keep_project_on_failure=False,
        )
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, skip_if_file_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_output_dir___output_d0/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_output_dir___output_d0/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_output_dir___output_d0/output', 'config_file': None, 'default_config': False, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'yes', 'keep_project_on_failure': False} == {'replay': False, 'overwrite_if_exists': False, 'skip_if_file_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_output_dir___output_d0/output', 'config_file': None, 'default_config': False, 'extra_context': None, 'password': None, 'directory': None, 'accept_hooks': True, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': None,
E          'default_config': False,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_output_dir___output_d0/output',
E          'overwrite_if_exists': False,
E          'replay': False,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'yes'} != {'accept_hooks': True}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': True,
E         ?                     ^^^
E         +     'accept_hooks': 'yes',
E         ?                     ^^ ++
E         +     'checkout': None,
E               'config_file': None,
E               'default_config': False,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_output_dir___output_d0/output',
E               'overwrite_if_exists': False,
E         -     'password': None,
E               'replay': False,
E               'skip_if_file_exists': False,
E           }

tests/test_cli.py:285: AssertionError

test_cli.py::test_cli_help[help]

test_cli.py::test_cli_help[help]
cli_runner = .cli_main at 0x7ee47e0faef0>
help_cli_flag = 'help'

    def test_cli_help(cli_runner, help_cli_flag):
        """Test cli invocation display help message with `help` flag."""
        result = cli_runner(help_cli_flag)
>       assert result.exit_code == 0
E       assert 1 == 0
E        +  where 1 = .exit_code

tests/test_cli.py:312: AssertionError

test_cli.py::test_user_config

test_cli.py::test_user_config
self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': True, 'config_file': '/tmp/pytest-of-root/pytest-0/test_user_config0/tests/config.yaml', 'default_config': False, 'directory': None, ...}
expected = call('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, skip_if_file_exists=False, output_dir='.', config_file='/tmp/pytest-of-root/pytest-0/test_user_config0/tests/config.yaml', default_config=False, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
actual = call('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='.', config_file='/tmp/pytest-of-root/pytest-0/test_user_config0/tests/config.yaml', default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
_error_message = ._error_message at 0x7ee47e031750>
cause = None

    def assert_called_with(self, /, *args, **kwargs):
        """assert that the last call was made with the specified arguments.

        Raises an AssertionError if the args and keyword args passed in are
        different to the last call to the mock."""
        if self.call_args is None:
            expected = self._format_mock_call_signature(args, kwargs)
            actual = 'not called.'
            error_message = ('expected call not found.\nExpected: %s\nActual: %s'
                    % (expected, actual))
            raise AssertionError(error_message)

        def _error_message():
            msg = self._format_mock_failure_message(args, kwargs)
            return msg
        expected = self._call_matcher(_Call((args, kwargs), two=True))
        actual = self._call_matcher(self.call_args)
        if actual != expected:
            cause = expected if isinstance(expected, Exception) else None
>           raise AssertionError(_error_message()) from cause
E           AssertionError: expected call not found.
E           Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, skip_if_file_exists=False, output_dir='.', config_file='/tmp/pytest-of-root/pytest-0/test_user_config0/tests/config.yaml', default_config=False, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
E           Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='.', config_file='/tmp/pytest-of-root/pytest-0/test_user_config0/tests/config.yaml', default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)

/usr/lib/python3.10/unittest/mock.py:929: AssertionError

During handling of the above exception, another exception occurred:

self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': True, 'config_file': '/tmp/pytest-of-root/pytest-0/test_user_config0/tests/config.yaml', 'default_config': False, 'directory': None, ...}

    def assert_called_once_with(self, /, *args, **kwargs):
        """assert that the mock was called exactly once and that that call was
        with the specified arguments."""
        if not self.call_count == 1:
            msg = ("Expected '%s' to be called once. Called %s times.%s"
                   % (self._mock_name or 'mock',
                      self.call_count,
                      self._calls_repr()))
            raise AssertionError(msg)
>       return self.assert_called_with(*args, **kwargs)
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, skip_if_file_exists=False, output_dir='.', config_file='/tmp/pytest-of-root/pytest-0/test_user_config0/tests/config.yaml', default_config=False, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='.', config_file='/tmp/pytest-of-root/pytest-0/test_user_config0/tests/config.yaml', default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': False, 'overwrite_if_exists': False, 'output_dir': '.', 'config_file': '/tmp/pytest-of-root/pytest-0/test_user_config0/tests/config.yaml', 'default_config': False, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'yes', 'keep_project_on_failure': False} == {'replay': False, 'overwrite_if_exists': False, 'skip_if_file_exists': False, 'output_dir': '.', 'config_file': '/tmp/pytest-of-root/pytest-0/test_user_config0/tests/config.yaml', 'default_config': False, 'extra_context': None, 'password': None, 'directory': None, 'accept_hooks': True, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': '/tmp/pytest-of-root/pytest-0/test_user_config0/tests/config.yaml',
E          'default_config': False,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '.',
E          'overwrite_if_exists': False,
E          'replay': False,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'yes'} != {'accept_hooks': True}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': True,
E         ?                     ^^^
E         +     'accept_hooks': 'yes',
E         ?                     ^^ ++
E         +     'checkout': None,
E               'config_file': '/tmp/pytest-of-root/pytest-0/test_user_config0/tests/config.yaml',
E               'default_config': False,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '.',
E               'overwrite_if_exists': False,
E         -     'password': None,
E               'replay': False,
E               'skip_if_file_exists': False,
E           }

/usr/lib/python3.10/unittest/mock.py:941: AssertionError

During handling of the above exception, another exception occurred:

mocker = 
cli_runner = .cli_main at 0x7ee47e0faef0>
user_config_path = '/tmp/pytest-of-root/pytest-0/test_user_config0/tests/config.yaml'

    def test_user_config(mocker, cli_runner, user_config_path):
        """Test cli invocation works with `config-file` option."""
        mock_cookiecutter = mocker.patch('cookiecutter.cli.cookiecutter')

        template_path = 'tests/fake-repo-pre/'
        result = cli_runner(template_path, '--config-file', user_config_path)

        assert result.exit_code == 0
>       mock_cookiecutter.assert_called_once_with(
            template_path,
            None,
            False,
            replay=False,
            overwrite_if_exists=False,
            skip_if_file_exists=False,
            output_dir='.',
            config_file=user_config_path,
            default_config=False,
            extra_context=None,
            password=None,
            directory=None,
            accept_hooks=True,
            keep_project_on_failure=False,
        )
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, skip_if_file_exists=False, output_dir='.', config_file='/tmp/pytest-of-root/pytest-0/test_user_config0/tests/config.yaml', default_config=False, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='.', config_file='/tmp/pytest-of-root/pytest-0/test_user_config0/tests/config.yaml', default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': False, 'overwrite_if_exists': False, 'output_dir': '.', 'config_file': '/tmp/pytest-of-root/pytest-0/test_user_config0/tests/config.yaml', 'default_config': False, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'yes', 'keep_project_on_failure': False} == {'replay': False, 'overwrite_if_exists': False, 'skip_if_file_exists': False, 'output_dir': '.', 'config_file': '/tmp/pytest-of-root/pytest-0/test_user_config0/tests/config.yaml', 'default_config': False, 'extra_context': None, 'password': None, 'directory': None, 'accept_hooks': True, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': '/tmp/pytest-of-root/pytest-0/test_user_config0/tests/config.yaml',
E          'default_config': False,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '.',
E          'overwrite_if_exists': False,
E          'replay': False,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'yes'} != {'accept_hooks': True}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': True,
E         ?                     ^^^
E         +     'accept_hooks': 'yes',
E         ?                     ^^ ++
E         +     'checkout': None,
E               'config_file': '/tmp/pytest-of-root/pytest-0/test_user_config0/tests/config.yaml',
E               'default_config': False,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '.',
E               'overwrite_if_exists': False,
E         -     'password': None,
E               'replay': False,
E               'skip_if_file_exists': False,
E           }

tests/test_cli.py:330: AssertionError

test_cli.py::test_default_user_config_overwrite

test_cli.py::test_default_user_config_overwrite
self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': True, 'config_file': '/tmp/pytest-of-root/pytest-0/test_default_user_config_overw0/tests/config.yaml', 'default_config': True, 'directory': None, ...}
expected = call('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, skip_if_file_exists=False, output_dir='.', config_file='/tmp/pytest-of-root/pytest-0/test_default_user_config_overw0/tests/config.yaml', default_config=True, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
actual = call('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='.', config_file='/tmp/pytest-of-root/pytest-0/test_default_user_config_overw0/tests/config.yaml', default_config=True, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
_error_message = ._error_message at 0x7ee47e0301f0>
cause = None

    def assert_called_with(self, /, *args, **kwargs):
        """assert that the last call was made with the specified arguments.

        Raises an AssertionError if the args and keyword args passed in are
        different to the last call to the mock."""
        if self.call_args is None:
            expected = self._format_mock_call_signature(args, kwargs)
            actual = 'not called.'
            error_message = ('expected call not found.\nExpected: %s\nActual: %s'
                    % (expected, actual))
            raise AssertionError(error_message)

        def _error_message():
            msg = self._format_mock_failure_message(args, kwargs)
            return msg
        expected = self._call_matcher(_Call((args, kwargs), two=True))
        actual = self._call_matcher(self.call_args)
        if actual != expected:
            cause = expected if isinstance(expected, Exception) else None
>           raise AssertionError(_error_message()) from cause
E           AssertionError: expected call not found.
E           Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, skip_if_file_exists=False, output_dir='.', config_file='/tmp/pytest-of-root/pytest-0/test_default_user_config_overw0/tests/config.yaml', default_config=True, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
E           Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='.', config_file='/tmp/pytest-of-root/pytest-0/test_default_user_config_overw0/tests/config.yaml', default_config=True, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)

/usr/lib/python3.10/unittest/mock.py:929: AssertionError

During handling of the above exception, another exception occurred:

self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': True, 'config_file': '/tmp/pytest-of-root/pytest-0/test_default_user_config_overw0/tests/config.yaml', 'default_config': True, 'directory': None, ...}

    def assert_called_once_with(self, /, *args, **kwargs):
        """assert that the mock was called exactly once and that that call was
        with the specified arguments."""
        if not self.call_count == 1:
            msg = ("Expected '%s' to be called once. Called %s times.%s"
                   % (self._mock_name or 'mock',
                      self.call_count,
                      self._calls_repr()))
            raise AssertionError(msg)
>       return self.assert_called_with(*args, **kwargs)
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, skip_if_file_exists=False, output_dir='.', config_file='/tmp/pytest-of-root/pytest-0/test_default_user_config_overw0/tests/config.yaml', default_config=True, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='.', config_file='/tmp/pytest-of-root/pytest-0/test_default_user_config_overw0/tests/config.yaml', default_config=True, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': False, 'overwrite_if_exists': False, 'output_dir': '.', 'config_file': '/tmp/pytest-of-root/pytest-0/test_default_user_config_overw0/tests/config.yaml', 'default_config': True, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'yes', 'keep_project_on_failure': False} == {'replay': False, 'overwrite_if_exists': False, 'skip_if_file_exists': False, 'output_dir': '.', 'config_file': '/tmp/pytest-of-root/pytest-0/test_default_user_config_overw0/tests/config.yaml', 'default_config': True, 'extra_context': None, 'password': None, 'directory': None, 'accept_hooks': True, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': '/tmp/pytest-of-root/pytest-0/test_default_user_config_overw0/tests/config.yaml',
E          'default_config': True,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '.',
E          'overwrite_if_exists': False,
E          'replay': False,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'yes'} != {'accept_hooks': True}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': True,
E         ?                     ^^^
E         +     'accept_hooks': 'yes',
E         ?                     ^^ ++
E         +     'checkout': None,
E               'config_file': '/tmp/pytest-of-root/pytest-0/test_default_user_config_overw0/tests/config.yaml',
E               'default_config': True,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '.',
E               'overwrite_if_exists': False,
E         -     'password': None,
E               'replay': False,
E               'skip_if_file_exists': False,
E           }

/usr/lib/python3.10/unittest/mock.py:941: AssertionError

During handling of the above exception, another exception occurred:

mocker = 
cli_runner = .cli_main at 0x7ee47e0faef0>
user_config_path = '/tmp/pytest-of-root/pytest-0/test_default_user_config_overw0/tests/config.yaml'

    def test_default_user_config_overwrite(mocker, cli_runner, user_config_path):
        """Test cli invocation ignores `config-file` if `default-config` passed."""
        mock_cookiecutter = mocker.patch('cookiecutter.cli.cookiecutter')

        template_path = 'tests/fake-repo-pre/'
        result = cli_runner(
            template_path,
            '--config-file',
            user_config_path,
            '--default-config',
        )

        assert result.exit_code == 0
>       mock_cookiecutter.assert_called_once_with(
            template_path,
            None,
            False,
            replay=False,
            overwrite_if_exists=False,
            skip_if_file_exists=False,
            output_dir='.',
            config_file=user_config_path,
            default_config=True,
            extra_context=None,
            password=None,
            directory=None,
            accept_hooks=True,
            keep_project_on_failure=False,
        )
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, skip_if_file_exists=False, output_dir='.', config_file='/tmp/pytest-of-root/pytest-0/test_default_user_config_overw0/tests/config.yaml', default_config=True, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='.', config_file='/tmp/pytest-of-root/pytest-0/test_default_user_config_overw0/tests/config.yaml', default_config=True, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': False, 'overwrite_if_exists': False, 'output_dir': '.', 'config_file': '/tmp/pytest-of-root/pytest-0/test_default_user_config_overw0/tests/config.yaml', 'default_config': True, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'yes', 'keep_project_on_failure': False} == {'replay': False, 'overwrite_if_exists': False, 'skip_if_file_exists': False, 'output_dir': '.', 'config_file': '/tmp/pytest-of-root/pytest-0/test_default_user_config_overw0/tests/config.yaml', 'default_config': True, 'extra_context': None, 'password': None, 'directory': None, 'accept_hooks': True, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': '/tmp/pytest-of-root/pytest-0/test_default_user_config_overw0/tests/config.yaml',
E          'default_config': True,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '.',
E          'overwrite_if_exists': False,
E          'replay': False,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'yes'} != {'accept_hooks': True}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': True,
E         ?                     ^^^
E         +     'accept_hooks': 'yes',
E         ?                     ^^ ++
E         +     'checkout': None,
E               'config_file': '/tmp/pytest-of-root/pytest-0/test_default_user_config_overw0/tests/config.yaml',
E               'default_config': True,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '.',
E               'overwrite_if_exists': False,
E         -     'password': None,
E               'replay': False,
E               'skip_if_file_exists': False,
E           }

tests/test_cli.py:361: AssertionError

test_cli.py::test_default_user_config

test_cli.py::test_default_user_config
self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': True, 'config_file': None, 'default_config': True, 'directory': None, ...}
expected = call('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, skip_if_file_exists=False, output_dir='.', config_file=None, default_config=True, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
actual = call('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='.', config_file=None, default_config=True, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
_error_message = ._error_message at 0x7ee47e0316c0>
cause = None

    def assert_called_with(self, /, *args, **kwargs):
        """assert that the last call was made with the specified arguments.

        Raises an AssertionError if the args and keyword args passed in are
        different to the last call to the mock."""
        if self.call_args is None:
            expected = self._format_mock_call_signature(args, kwargs)
            actual = 'not called.'
            error_message = ('expected call not found.\nExpected: %s\nActual: %s'
                    % (expected, actual))
            raise AssertionError(error_message)

        def _error_message():
            msg = self._format_mock_failure_message(args, kwargs)
            return msg
        expected = self._call_matcher(_Call((args, kwargs), two=True))
        actual = self._call_matcher(self.call_args)
        if actual != expected:
            cause = expected if isinstance(expected, Exception) else None
>           raise AssertionError(_error_message()) from cause
E           AssertionError: expected call not found.
E           Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, skip_if_file_exists=False, output_dir='.', config_file=None, default_config=True, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
E           Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='.', config_file=None, default_config=True, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)

/usr/lib/python3.10/unittest/mock.py:929: AssertionError

During handling of the above exception, another exception occurred:

self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': True, 'config_file': None, 'default_config': True, 'directory': None, ...}

    def assert_called_once_with(self, /, *args, **kwargs):
        """assert that the mock was called exactly once and that that call was
        with the specified arguments."""
        if not self.call_count == 1:
            msg = ("Expected '%s' to be called once. Called %s times.%s"
                   % (self._mock_name or 'mock',
                      self.call_count,
                      self._calls_repr()))
            raise AssertionError(msg)
>       return self.assert_called_with(*args, **kwargs)
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, skip_if_file_exists=False, output_dir='.', config_file=None, default_config=True, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='.', config_file=None, default_config=True, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': False, 'overwrite_if_exists': False, 'output_dir': '.', 'config_file': None, 'default_config': True, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'yes', 'keep_project_on_failure': False} == {'replay': False, 'overwrite_if_exists': False, 'skip_if_file_exists': False, 'output_dir': '.', 'config_file': None, 'default_config': True, 'extra_context': None, 'password': None, 'directory': None, 'accept_hooks': True, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': None,
E          'default_config': True,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '.',
E          'overwrite_if_exists': False,
E          'replay': False,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'yes'} != {'accept_hooks': True}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': True,
E         ?                     ^^^
E         +     'accept_hooks': 'yes',
E         ?                     ^^ ++
E         +     'checkout': None,
E               'config_file': None,
E               'default_config': True,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '.',
E               'overwrite_if_exists': False,
E         -     'password': None,
E               'replay': False,
E               'skip_if_file_exists': False,
E           }

/usr/lib/python3.10/unittest/mock.py:941: AssertionError

During handling of the above exception, another exception occurred:

mocker = 
cli_runner = .cli_main at 0x7ee47e0faef0>

    def test_default_user_config(mocker, cli_runner):
        """Test cli invocation accepts `default-config` flag correctly."""
        mock_cookiecutter = mocker.patch('cookiecutter.cli.cookiecutter')

        template_path = 'tests/fake-repo-pre/'
        result = cli_runner(template_path, '--default-config')

        assert result.exit_code == 0
>       mock_cookiecutter.assert_called_once_with(
            template_path,
            None,
            False,
            replay=False,
            overwrite_if_exists=False,
            skip_if_file_exists=False,
            output_dir='.',
            config_file=None,
            default_config=True,
            extra_context=None,
            password=None,
            directory=None,
            accept_hooks=True,
            keep_project_on_failure=False,
        )
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, skip_if_file_exists=False, output_dir='.', config_file=None, default_config=True, extra_context=None, password=None, directory=None, accept_hooks=True, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='.', config_file=None, default_config=True, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': False, 'overwrite_if_exists': False, 'output_dir': '.', 'config_file': None, 'default_config': True, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'yes', 'keep_project_on_failure': False} == {'replay': False, 'overwrite_if_exists': False, 'skip_if_file_exists': False, 'output_dir': '.', 'config_file': None, 'default_config': True, 'extra_context': None, 'password': None, 'directory': None, 'accept_hooks': True, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': None,
E          'default_config': True,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '.',
E          'overwrite_if_exists': False,
E          'replay': False,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'yes'} != {'accept_hooks': True}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': True,
E         ?                     ^^^
E         +     'accept_hooks': 'yes',
E         ?                     ^^ ++
E         +     'checkout': None,
E               'config_file': None,
E               'default_config': True,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '.',
E               'overwrite_if_exists': False,
E         -     'password': None,
E               'replay': False,
E               'skip_if_file_exists': False,
E           }

tests/test_cli.py:387: AssertionError

test_cli.py::test_echo_undefined_variable_error

test_cli.py::test_echo_undefined_variable_error
output_dir = '/tmp/pytest-of-root/pytest-0/test_echo_undefined_variable_e0/output'
cli_runner = .cli_main at 0x7ee47e0faef0>

    def test_echo_undefined_variable_error(output_dir, cli_runner):
        """Cli invocation return error if variable undefined in template."""
        template_path = 'tests/undefined-variable/file-name/'

        result = cli_runner(
            '--no-input',
            '--default-config',
            '--output-dir',
            output_dir,
            template_path,
        )

        assert result.exit_code == 1

        error = "Unable to create file '{{cookiecutter.foobar}}'"
>       assert error in result.output
E       assert "Unable to create file '{{cookiecutter.foobar}}'" in "ERROR: Error: determine_repo_dir() missing 1 required positional argument: 'abbreviations'\nUnknown error: determine_repo_dir() missing 1 required positional argument: 'abbreviations'\n"
E        +  where "ERROR: Error: determine_repo_dir() missing 1 required positional argument: 'abbreviations'\nUnknown error: determine_repo_dir() missing 1 required positional argument: 'abbreviations'\n" = .output

tests/test_cli.py:420: AssertionError

test_cli.py::test_echo_unknown_extension_error

test_cli.py::test_echo_unknown_extension_error
output_dir = '/tmp/pytest-of-root/pytest-0/test_echo_unknown_extension_er0/output'
cli_runner = .cli_main at 0x7ee47e0faef0>

    def test_echo_unknown_extension_error(output_dir, cli_runner):
        """Cli return error if extension incorrectly defined in template."""
        template_path = 'tests/test-extensions/unknown/'

        result = cli_runner(
            '--no-input',
            '--default-config',
            '--output-dir',
            output_dir,
            template_path,
        )

        assert result.exit_code == 1

>       assert 'Unable to load extension: ' in result.output
E       assert 'Unable to load extension: ' in "ERROR: Error: determine_repo_dir() missing 1 required positional argument: 'abbreviations'\nUnknown error: determine_repo_dir() missing 1 required positional argument: 'abbreviations'\n"
E        +  where "ERROR: Error: determine_repo_dir() missing 1 required positional argument: 'abbreviations'\nUnknown error: determine_repo_dir() missing 1 required positional argument: 'abbreviations'\n" = .output

tests/test_cli.py:459: AssertionError

test_cli.py::test_local_extension

test_cli.py::test_local_extension
tmpdir = local('/tmp/pytest-of-root/pytest-0/test_local_extension0')
cli_runner = .cli_main at 0x7ee47e0faef0>

    def test_local_extension(tmpdir, cli_runner):
        """Test to verify correct work of extension, included in template."""
        output_dir = str(tmpdir.mkdir('output'))
        template_path = 'tests/test-extensions/local_extension/'

        result = cli_runner(
            '--no-input',
            '--default-config',
            '--output-dir',
            output_dir,
            template_path,
        )
>       assert result.exit_code == 0
E       assert 1 == 0
E        +  where 1 = .exit_code

tests/test_cli.py:474: AssertionError

test_cli.py::test_cli_extra_context

test_cli.py::test_cli_extra_context
cli_runner = .cli_main at 0x7ee47e0faef0>

    @pytest.mark.usefixtures('remove_fake_project_dir')
    def test_cli_extra_context(cli_runner):
        """Cli invocation replace content if called with replacement pairs."""
        result = cli_runner(
            'tests/fake-repo-pre/',
            '--no-input',
            '-v',
            'project_name=Awesomez',
        )
>       assert result.exit_code == 0
E       assert 1 == 0
E        +  where 1 = .exit_code

tests/test_cli.py:499: AssertionError

test_cli.py::test_cli_extra_context_invalid_format

test_cli.py::test_cli_extra_context_invalid_format
cli_runner = .cli_main at 0x7ee47e0faef0>

    @pytest.mark.usefixtures('remove_fake_project_dir')
    def test_cli_extra_context_invalid_format(cli_runner):
        """Cli invocation raise error if called with unknown argument."""
        result = cli_runner(
            'tests/fake-repo-pre/',
            '--no-input',
            '-v',
            'ExtraContextWithNoEqualsSoInvalid',
        )
        assert result.exit_code == 2
        assert "Error: Invalid value for '[EXTRA_CONTEXT]...'" in result.output
>       assert 'should contain items of the form key=value' in result.output
E       assert 'should contain items of the form key=value' in 'Usage: main [OPTIONS] [TEMPLATE] [EXTRA_CONTEXT]...\nTry \'main -h\' for help.\n\nError: Invalid value for \'[EXTRA_CONTEXT]...\': "ExtraContextWithNoEqualsSoInvalid" is not a valid key/value pair. Use the format key=value.\n'
E        +  where 'Usage: main [OPTIONS] [TEMPLATE] [EXTRA_CONTEXT]...\nTry \'main -h\' for help.\n\nError: Invalid value for \'[EXTRA_CONTEXT]...\': "ExtraContextWithNoEqualsSoInvalid" is not a valid key/value pair. Use the format key=value.\n' = .output

tests/test_cli.py:516: AssertionError

test_cli.py::test_debug_file_non_verbose

test_cli.py::test_debug_file_non_verbose
cli_runner = .cli_main at 0x7ee47e0faef0>
debug_file = PosixPath('/tmp/pytest-of-root/pytest-0/test_debug_file_non_verbose0/fake-repo.log')

    @pytest.mark.usefixtures('remove_fake_project_dir')
    def test_debug_file_non_verbose(cli_runner, debug_file):
        """Test cli invocation writes log to `debug-file` if flag enabled.

        Case for normal log output.
        """
        assert not debug_file.exists()

        result = cli_runner(
            '--no-input',
            '--debug-file',
            str(debug_file),
            'tests/fake-repo-pre/',
        )
>       assert result.exit_code == 0
E       assert 1 == 0
E        +  where 1 = .exit_code

tests/test_cli.py:539: AssertionError

test_cli.py::test_debug_file_verbose

test_cli.py::test_debug_file_verbose
cli_runner = .cli_main at 0x7ee47e0faef0>
debug_file = PosixPath('/tmp/pytest-of-root/pytest-0/test_debug_file_verbose0/fake-repo.log')

    @pytest.mark.usefixtures('remove_fake_project_dir')
    def test_debug_file_verbose(cli_runner, debug_file):
        """Test cli invocation writes log to `debug-file` if flag enabled.

        Case for verbose log output.
        """
        assert not debug_file.exists()

        result = cli_runner(
            '--verbose',
            '--no-input',
            '--debug-file',
            str(debug_file),
            'tests/fake-repo-pre/',
        )
>       assert result.exit_code == 0
E       assert 1 == 0
E        +  where 1 = .exit_code

tests/test_cli.py:566: AssertionError

test_cli.py::test_debug_list_installed_templates

test_cli.py::test_debug_list_installed_templates
cli_runner = .cli_main at 0x7ee47e0faef0>
debug_file = PosixPath('/tmp/pytest-of-root/pytest-0/test_debug_list_installed_temp0/fake-repo.log')
user_config_path = '/tmp/pytest-of-root/pytest-0/test_debug_list_installed_temp0/tests/config.yaml'

    @pytest.mark.usefixtures('make_fake_project_dir', 'remove_fake_project_dir')
    def test_debug_list_installed_templates(cli_runner, debug_file, user_config_path):
        """Verify --list-installed command correct invocation."""
        fake_template_dir = os.path.dirname(os.path.abspath('fake-project'))
        os.makedirs(os.path.dirname(user_config_path))
        # Single quotes in YAML will not parse escape codes (\).
        Path(user_config_path).write_text(f"cookiecutters_dir: '{fake_template_dir}'")
        Path("fake-project", "cookiecutter.json").write_text('{}')

        result = cli_runner(
            '--list-installed',
            '--config-file',
            user_config_path,
            str(debug_file),
        )

>       assert "1 installed templates:" in result.output
E       AssertionError: assert '1 installed templates:' in 'Installed templates:\n  docs\n  tests\n  cookiecutter.egg-info\n  cookiecutter\n  .venv\n  .github\n  logo\n  .git\n  fake-project\n'
E        +  where 'Installed templates:\n  docs\n  tests\n  cookiecutter.egg-info\n  cookiecutter\n  .venv\n  .github\n  logo\n  .git\n  fake-project\n' = .output

tests/test_cli.py:594: AssertionError

test_cli.py::test_debug_list_installed_templates_failure

test_cli.py::test_debug_list_installed_templates_failure
cli_runner = .cli_main at 0x7ee47e0faef0>
debug_file = PosixPath('/tmp/pytest-of-root/pytest-0/test_debug_list_installed_temp1/fake-repo.log')
user_config_path = '/tmp/pytest-of-root/pytest-0/test_debug_list_installed_temp1/tests/config.yaml'

    def test_debug_list_installed_templates_failure(
        cli_runner, debug_file, user_config_path
    ):
        """Verify --list-installed command error on invocation."""
        os.makedirs(os.path.dirname(user_config_path))
        Path(user_config_path).write_text('cookiecutters_dir: "/notarealplace/"')

        result = cli_runner(
            '--list-installed', '--config-file', user_config_path, str(debug_file)
        )

>       assert "Error: Cannot list installed templates." in result.output
E       AssertionError: assert 'Error: Cannot list installed templates.' in 'No templates found in /notarealplace/\n'
E        +  where 'No templates found in /notarealplace/\n' = .output

tests/test_cli.py:609: AssertionError

test_cli.py::test_directory_repo

test_cli.py::test_directory_repo
cli_runner = .cli_main at 0x7ee47e0faef0>

    @pytest.mark.usefixtures('remove_fake_project_dir')
    def test_directory_repo(cli_runner):
        """Test cli invocation works with `directory` option."""
        result = cli_runner(
            'tests/fake-repo-dir/',
            '--no-input',
            '-v',
            '--directory=my-dir',
        )
>       assert result.exit_code == 0
E       assert 1 == 0
E        +  where 1 = .exit_code

tests/test_cli.py:622: AssertionError

test_cli.py::test_cli_accept_hooks[-o---accept-hooks=yes-None-True]

test_cli.py::test_cli_accept_hooks[-o---accept-hooks=yes-None-True]
self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': True, 'config_file': None, 'default_config': False, 'directory': None, ...}
expected = call('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc0/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False)
actual = call('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc0/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
_error_message = ._error_message at 0x7ee47df06170>
cause = None

    def assert_called_with(self, /, *args, **kwargs):
        """assert that the last call was made with the specified arguments.

        Raises an AssertionError if the args and keyword args passed in are
        different to the last call to the mock."""
        if self.call_args is None:
            expected = self._format_mock_call_signature(args, kwargs)
            actual = 'not called.'
            error_message = ('expected call not found.\nExpected: %s\nActual: %s'
                    % (expected, actual))
            raise AssertionError(error_message)

        def _error_message():
            msg = self._format_mock_failure_message(args, kwargs)
            return msg
        expected = self._call_matcher(_Call((args, kwargs), two=True))
        actual = self._call_matcher(self.call_args)
        if actual != expected:
            cause = expected if isinstance(expected, Exception) else None
>           raise AssertionError(_error_message()) from cause
E           AssertionError: expected call not found.
E           Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc0/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False)
E           Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc0/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)

/usr/lib/python3.10/unittest/mock.py:929: AssertionError

During handling of the above exception, another exception occurred:

self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': True, 'config_file': None, 'default_config': False, 'directory': None, ...}

    def assert_called_once_with(self, /, *args, **kwargs):
        """assert that the mock was called exactly once and that that call was
        with the specified arguments."""
        if not self.call_count == 1:
            msg = ("Expected '%s' to be called once. Called %s times.%s"
                   % (self._mock_name or 'mock',
                      self.call_count,
                      self._calls_repr()))
            raise AssertionError(msg)
>       return self.assert_called_with(*args, **kwargs)
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc0/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc0/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc0/output', 'config_file': None, 'default_config': False, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'yes', 'keep_project_on_failure': False} == {'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc0/output', 'config_file': None, 'default_config': False, 'extra_context': None, 'password': None, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': True, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': None,
E          'default_config': False,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc0/output',
E          'overwrite_if_exists': False,
E          'replay': False,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'yes'} != {'accept_hooks': True}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': True,
E         ?                     ^^^
E         +     'accept_hooks': 'yes',
E         ?                     ^^ ++
E         +     'checkout': None,
E               'config_file': None,
E               'default_config': False,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc0/output',
E               'overwrite_if_exists': False,
E         -     'password': None,
E               'replay': False,
E               'skip_if_file_exists': False,
E           }

/usr/lib/python3.10/unittest/mock.py:941: AssertionError

During handling of the above exception, another exception occurred:

mocker = 
cli_runner = .cli_main at 0x7ee47e0faef0>
output_dir_flag = '-o'
output_dir = '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc0/output'
accept_hooks_arg = '--accept-hooks=yes', user_input = None, expected = True

    @pytest.mark.parametrize(
        "accept_hooks_arg,user_input,expected", cli_accept_hook_arg_testdata
    )
    def test_cli_accept_hooks(
        mocker,
        cli_runner,
        output_dir_flag,
        output_dir,
        accept_hooks_arg,
        user_input,
        expected,
    ):
        """Test cli invocation works with `accept-hooks` option."""
        mock_cookiecutter = mocker.patch("cookiecutter.cli.cookiecutter")

        template_path = "tests/fake-repo-pre/"
        result = cli_runner(
            template_path, output_dir_flag, output_dir, accept_hooks_arg, input=user_input
        )

        assert result.exit_code == 0
>       mock_cookiecutter.assert_called_once_with(
            template_path,
            None,
            False,
            replay=False,
            overwrite_if_exists=False,
            output_dir=output_dir,
            config_file=None,
            default_config=False,
            extra_context=None,
            password=None,
            directory=None,
            skip_if_file_exists=False,
            accept_hooks=expected,
            keep_project_on_failure=False,
        )
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc0/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc0/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc0/output', 'config_file': None, 'default_config': False, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'yes', 'keep_project_on_failure': False} == {'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc0/output', 'config_file': None, 'default_config': False, 'extra_context': None, 'password': None, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': True, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': None,
E          'default_config': False,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc0/output',
E          'overwrite_if_exists': False,
E          'replay': False,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'yes'} != {'accept_hooks': True}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': True,
E         ?                     ^^^
E         +     'accept_hooks': 'yes',
E         ?                     ^^ ++
E         +     'checkout': None,
E               'config_file': None,
E               'default_config': False,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc0/output',
E               'overwrite_if_exists': False,
E         -     'password': None,
E               'replay': False,
E               'skip_if_file_exists': False,
E           }

tests/test_cli.py:657: AssertionError

test_cli.py::test_cli_accept_hooks[-o---accept-hooks=no-None-False]

test_cli.py::test_cli_accept_hooks[-o---accept-hooks=no-None-False]
self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': False, 'config_file': None, 'default_config': False, 'directory': None, ...}
expected = call('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc1/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=False, keep_project_on_failure=False)
actual = call('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc1/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='no', keep_project_on_failure=False)
_error_message = ._error_message at 0x7ee47dee8ee0>
cause = None

    def assert_called_with(self, /, *args, **kwargs):
        """assert that the last call was made with the specified arguments.

        Raises an AssertionError if the args and keyword args passed in are
        different to the last call to the mock."""
        if self.call_args is None:
            expected = self._format_mock_call_signature(args, kwargs)
            actual = 'not called.'
            error_message = ('expected call not found.\nExpected: %s\nActual: %s'
                    % (expected, actual))
            raise AssertionError(error_message)

        def _error_message():
            msg = self._format_mock_failure_message(args, kwargs)
            return msg
        expected = self._call_matcher(_Call((args, kwargs), two=True))
        actual = self._call_matcher(self.call_args)
        if actual != expected:
            cause = expected if isinstance(expected, Exception) else None
>           raise AssertionError(_error_message()) from cause
E           AssertionError: expected call not found.
E           Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc1/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=False, keep_project_on_failure=False)
E           Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc1/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='no', keep_project_on_failure=False)

/usr/lib/python3.10/unittest/mock.py:929: AssertionError

During handling of the above exception, another exception occurred:

self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': False, 'config_file': None, 'default_config': False, 'directory': None, ...}

    def assert_called_once_with(self, /, *args, **kwargs):
        """assert that the mock was called exactly once and that that call was
        with the specified arguments."""
        if not self.call_count == 1:
            msg = ("Expected '%s' to be called once. Called %s times.%s"
                   % (self._mock_name or 'mock',
                      self.call_count,
                      self._calls_repr()))
            raise AssertionError(msg)
>       return self.assert_called_with(*args, **kwargs)
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc1/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=False, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc1/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='no', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc1/output', 'config_file': None, 'default_config': False, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'no', 'keep_project_on_failure': False} == {'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc1/output', 'config_file': None, 'default_config': False, 'extra_context': None, 'password': None, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': False, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': None,
E          'default_config': False,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc1/output',
E          'overwrite_if_exists': False,
E          'replay': False,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'no'} != {'accept_hooks': False}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': False,
E         ?                     ^^^^^
E         +     'accept_hooks': 'no',
E         ?                     ^^^^
E         +     'checkout': None,
E               'config_file': None,
E               'default_config': False,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc1/output',
E               'overwrite_if_exists': False,
E         -     'password': None,
E               'replay': False,
E               'skip_if_file_exists': False,
E           }

/usr/lib/python3.10/unittest/mock.py:941: AssertionError

During handling of the above exception, another exception occurred:

mocker = 
cli_runner = .cli_main at 0x7ee47e0faef0>
output_dir_flag = '-o'
output_dir = '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc1/output'
accept_hooks_arg = '--accept-hooks=no', user_input = None, expected = False

    @pytest.mark.parametrize(
        "accept_hooks_arg,user_input,expected", cli_accept_hook_arg_testdata
    )
    def test_cli_accept_hooks(
        mocker,
        cli_runner,
        output_dir_flag,
        output_dir,
        accept_hooks_arg,
        user_input,
        expected,
    ):
        """Test cli invocation works with `accept-hooks` option."""
        mock_cookiecutter = mocker.patch("cookiecutter.cli.cookiecutter")

        template_path = "tests/fake-repo-pre/"
        result = cli_runner(
            template_path, output_dir_flag, output_dir, accept_hooks_arg, input=user_input
        )

        assert result.exit_code == 0
>       mock_cookiecutter.assert_called_once_with(
            template_path,
            None,
            False,
            replay=False,
            overwrite_if_exists=False,
            output_dir=output_dir,
            config_file=None,
            default_config=False,
            extra_context=None,
            password=None,
            directory=None,
            skip_if_file_exists=False,
            accept_hooks=expected,
            keep_project_on_failure=False,
        )
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc1/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=False, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc1/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='no', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc1/output', 'config_file': None, 'default_config': False, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'no', 'keep_project_on_failure': False} == {'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc1/output', 'config_file': None, 'default_config': False, 'extra_context': None, 'password': None, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': False, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': None,
E          'default_config': False,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc1/output',
E          'overwrite_if_exists': False,
E          'replay': False,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'no'} != {'accept_hooks': False}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': False,
E         ?                     ^^^^^
E         +     'accept_hooks': 'no',
E         ?                     ^^^^
E         +     'checkout': None,
E               'config_file': None,
E               'default_config': False,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc1/output',
E               'overwrite_if_exists': False,
E         -     'password': None,
E               'replay': False,
E               'skip_if_file_exists': False,
E           }

tests/test_cli.py:657: AssertionError

test_cli.py::test_cli_accept_hooks[-o---accept-hooks=ask-yes-True]

test_cli.py::test_cli_accept_hooks[-o---accept-hooks=ask-yes-True]
self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': True, 'config_file': None, 'default_config': False, 'directory': None, ...}
expected = call('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc2/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False)
actual = call('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc2/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='ask', keep_project_on_failure=False)
_error_message = ._error_message at 0x7ee47dee8f70>
cause = None

    def assert_called_with(self, /, *args, **kwargs):
        """assert that the last call was made with the specified arguments.

        Raises an AssertionError if the args and keyword args passed in are
        different to the last call to the mock."""
        if self.call_args is None:
            expected = self._format_mock_call_signature(args, kwargs)
            actual = 'not called.'
            error_message = ('expected call not found.\nExpected: %s\nActual: %s'
                    % (expected, actual))
            raise AssertionError(error_message)

        def _error_message():
            msg = self._format_mock_failure_message(args, kwargs)
            return msg
        expected = self._call_matcher(_Call((args, kwargs), two=True))
        actual = self._call_matcher(self.call_args)
        if actual != expected:
            cause = expected if isinstance(expected, Exception) else None
>           raise AssertionError(_error_message()) from cause
E           AssertionError: expected call not found.
E           Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc2/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False)
E           Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc2/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='ask', keep_project_on_failure=False)

/usr/lib/python3.10/unittest/mock.py:929: AssertionError

During handling of the above exception, another exception occurred:

self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': True, 'config_file': None, 'default_config': False, 'directory': None, ...}

    def assert_called_once_with(self, /, *args, **kwargs):
        """assert that the mock was called exactly once and that that call was
        with the specified arguments."""
        if not self.call_count == 1:
            msg = ("Expected '%s' to be called once. Called %s times.%s"
                   % (self._mock_name or 'mock',
                      self.call_count,
                      self._calls_repr()))
            raise AssertionError(msg)
>       return self.assert_called_with(*args, **kwargs)
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc2/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc2/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='ask', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc2/output', 'config_file': None, 'default_config': False, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'ask', 'keep_project_on_failure': False} == {'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc2/output', 'config_file': None, 'default_config': False, 'extra_context': None, 'password': None, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': True, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': None,
E          'default_config': False,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc2/output',
E          'overwrite_if_exists': False,
E          'replay': False,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'ask'} != {'accept_hooks': True}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': True,
E         ?                     ^^^^
E         +     'accept_hooks': 'ask',
E         ?                     ^^^^^
E         +     'checkout': None,
E               'config_file': None,
E               'default_config': False,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc2/output',
E               'overwrite_if_exists': False,
E         -     'password': None,
E               'replay': False,
E               'skip_if_file_exists': False,
E           }

/usr/lib/python3.10/unittest/mock.py:941: AssertionError

During handling of the above exception, another exception occurred:

mocker = 
cli_runner = .cli_main at 0x7ee47e0faef0>
output_dir_flag = '-o'
output_dir = '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc2/output'
accept_hooks_arg = '--accept-hooks=ask', user_input = 'yes', expected = True

    @pytest.mark.parametrize(
        "accept_hooks_arg,user_input,expected", cli_accept_hook_arg_testdata
    )
    def test_cli_accept_hooks(
        mocker,
        cli_runner,
        output_dir_flag,
        output_dir,
        accept_hooks_arg,
        user_input,
        expected,
    ):
        """Test cli invocation works with `accept-hooks` option."""
        mock_cookiecutter = mocker.patch("cookiecutter.cli.cookiecutter")

        template_path = "tests/fake-repo-pre/"
        result = cli_runner(
            template_path, output_dir_flag, output_dir, accept_hooks_arg, input=user_input
        )

        assert result.exit_code == 0
>       mock_cookiecutter.assert_called_once_with(
            template_path,
            None,
            False,
            replay=False,
            overwrite_if_exists=False,
            output_dir=output_dir,
            config_file=None,
            default_config=False,
            extra_context=None,
            password=None,
            directory=None,
            skip_if_file_exists=False,
            accept_hooks=expected,
            keep_project_on_failure=False,
        )
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc2/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc2/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='ask', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc2/output', 'config_file': None, 'default_config': False, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'ask', 'keep_project_on_failure': False} == {'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc2/output', 'config_file': None, 'default_config': False, 'extra_context': None, 'password': None, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': True, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': None,
E          'default_config': False,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc2/output',
E          'overwrite_if_exists': False,
E          'replay': False,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'ask'} != {'accept_hooks': True}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': True,
E         ?                     ^^^^
E         +     'accept_hooks': 'ask',
E         ?                     ^^^^^
E         +     'checkout': None,
E               'config_file': None,
E               'default_config': False,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc2/output',
E               'overwrite_if_exists': False,
E         -     'password': None,
E               'replay': False,
E               'skip_if_file_exists': False,
E           }

tests/test_cli.py:657: AssertionError

test_cli.py::test_cli_accept_hooks[-o---accept-hooks=ask-no-False]

test_cli.py::test_cli_accept_hooks[-o---accept-hooks=ask-no-False]
self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': False, 'config_file': None, 'default_config': False, 'directory': None, ...}
expected = call('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc3/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=False, keep_project_on_failure=False)
actual = call('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc3/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='ask', keep_project_on_failure=False)
_error_message = ._error_message at 0x7ee47dee96c0>
cause = None

    def assert_called_with(self, /, *args, **kwargs):
        """assert that the last call was made with the specified arguments.

        Raises an AssertionError if the args and keyword args passed in are
        different to the last call to the mock."""
        if self.call_args is None:
            expected = self._format_mock_call_signature(args, kwargs)
            actual = 'not called.'
            error_message = ('expected call not found.\nExpected: %s\nActual: %s'
                    % (expected, actual))
            raise AssertionError(error_message)

        def _error_message():
            msg = self._format_mock_failure_message(args, kwargs)
            return msg
        expected = self._call_matcher(_Call((args, kwargs), two=True))
        actual = self._call_matcher(self.call_args)
        if actual != expected:
            cause = expected if isinstance(expected, Exception) else None
>           raise AssertionError(_error_message()) from cause
E           AssertionError: expected call not found.
E           Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc3/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=False, keep_project_on_failure=False)
E           Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc3/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='ask', keep_project_on_failure=False)

/usr/lib/python3.10/unittest/mock.py:929: AssertionError

During handling of the above exception, another exception occurred:

self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': False, 'config_file': None, 'default_config': False, 'directory': None, ...}

    def assert_called_once_with(self, /, *args, **kwargs):
        """assert that the mock was called exactly once and that that call was
        with the specified arguments."""
        if not self.call_count == 1:
            msg = ("Expected '%s' to be called once. Called %s times.%s"
                   % (self._mock_name or 'mock',
                      self.call_count,
                      self._calls_repr()))
            raise AssertionError(msg)
>       return self.assert_called_with(*args, **kwargs)
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc3/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=False, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc3/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='ask', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc3/output', 'config_file': None, 'default_config': False, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'ask', 'keep_project_on_failure': False} == {'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc3/output', 'config_file': None, 'default_config': False, 'extra_context': None, 'password': None, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': False, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': None,
E          'default_config': False,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc3/output',
E          'overwrite_if_exists': False,
E          'replay': False,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'ask'} != {'accept_hooks': False}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': False,
E         ?                     ^ - ^
E         +     'accept_hooks': 'ask',
E         ?                     ^  ^^
E         +     'checkout': None,
E               'config_file': None,
E               'default_config': False,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc3/output',
E               'overwrite_if_exists': False,
E         -     'password': None,
E               'replay': False,
E               'skip_if_file_exists': False,
E           }

/usr/lib/python3.10/unittest/mock.py:941: AssertionError

During handling of the above exception, another exception occurred:

mocker = 
cli_runner = .cli_main at 0x7ee47e0faef0>
output_dir_flag = '-o'
output_dir = '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc3/output'
accept_hooks_arg = '--accept-hooks=ask', user_input = 'no', expected = False

    @pytest.mark.parametrize(
        "accept_hooks_arg,user_input,expected", cli_accept_hook_arg_testdata
    )
    def test_cli_accept_hooks(
        mocker,
        cli_runner,
        output_dir_flag,
        output_dir,
        accept_hooks_arg,
        user_input,
        expected,
    ):
        """Test cli invocation works with `accept-hooks` option."""
        mock_cookiecutter = mocker.patch("cookiecutter.cli.cookiecutter")

        template_path = "tests/fake-repo-pre/"
        result = cli_runner(
            template_path, output_dir_flag, output_dir, accept_hooks_arg, input=user_input
        )

        assert result.exit_code == 0
>       mock_cookiecutter.assert_called_once_with(
            template_path,
            None,
            False,
            replay=False,
            overwrite_if_exists=False,
            output_dir=output_dir,
            config_file=None,
            default_config=False,
            extra_context=None,
            password=None,
            directory=None,
            skip_if_file_exists=False,
            accept_hooks=expected,
            keep_project_on_failure=False,
        )
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc3/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=False, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc3/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='ask', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc3/output', 'config_file': None, 'default_config': False, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'ask', 'keep_project_on_failure': False} == {'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc3/output', 'config_file': None, 'default_config': False, 'extra_context': None, 'password': None, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': False, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': None,
E          'default_config': False,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc3/output',
E          'overwrite_if_exists': False,
E          'replay': False,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'ask'} != {'accept_hooks': False}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': False,
E         ?                     ^ - ^
E         +     'accept_hooks': 'ask',
E         ?                     ^  ^^
E         +     'checkout': None,
E               'config_file': None,
E               'default_config': False,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks__o___acc3/output',
E               'overwrite_if_exists': False,
E         -     'password': None,
E               'replay': False,
E               'skip_if_file_exists': False,
E           }

tests/test_cli.py:657: AssertionError

test_cli.py::test_cli_accept_hooks[--output-dir---accept-hooks=yes-None-True]

test_cli.py::test_cli_accept_hooks[--output-dir---accept-hooks=yes-None-True]
self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': True, 'config_file': None, 'default_config': False, 'directory': None, ...}
expected = call('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output0/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False)
actual = call('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output0/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
_error_message = ._error_message at 0x7ee47dee9510>
cause = None

    def assert_called_with(self, /, *args, **kwargs):
        """assert that the last call was made with the specified arguments.

        Raises an AssertionError if the args and keyword args passed in are
        different to the last call to the mock."""
        if self.call_args is None:
            expected = self._format_mock_call_signature(args, kwargs)
            actual = 'not called.'
            error_message = ('expected call not found.\nExpected: %s\nActual: %s'
                    % (expected, actual))
            raise AssertionError(error_message)

        def _error_message():
            msg = self._format_mock_failure_message(args, kwargs)
            return msg
        expected = self._call_matcher(_Call((args, kwargs), two=True))
        actual = self._call_matcher(self.call_args)
        if actual != expected:
            cause = expected if isinstance(expected, Exception) else None
>           raise AssertionError(_error_message()) from cause
E           AssertionError: expected call not found.
E           Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output0/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False)
E           Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output0/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)

/usr/lib/python3.10/unittest/mock.py:929: AssertionError

During handling of the above exception, another exception occurred:

self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': True, 'config_file': None, 'default_config': False, 'directory': None, ...}

    def assert_called_once_with(self, /, *args, **kwargs):
        """assert that the mock was called exactly once and that that call was
        with the specified arguments."""
        if not self.call_count == 1:
            msg = ("Expected '%s' to be called once. Called %s times.%s"
                   % (self._mock_name or 'mock',
                      self.call_count,
                      self._calls_repr()))
            raise AssertionError(msg)
>       return self.assert_called_with(*args, **kwargs)
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output0/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output0/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output0/output', 'config_file': None, 'default_config': False, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'yes', 'keep_project_on_failure': False} == {'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output0/output', 'config_file': None, 'default_config': False, 'extra_context': None, 'password': None, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': True, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': None,
E          'default_config': False,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output0/output',
E          'overwrite_if_exists': False,
E          'replay': False,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'yes'} != {'accept_hooks': True}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': True,
E         ?                     ^^^
E         +     'accept_hooks': 'yes',
E         ?                     ^^ ++
E         +     'checkout': None,
E               'config_file': None,
E               'default_config': False,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output0/output',
E               'overwrite_if_exists': False,
E         -     'password': None,
E               'replay': False,
E               'skip_if_file_exists': False,
E           }

/usr/lib/python3.10/unittest/mock.py:941: AssertionError

During handling of the above exception, another exception occurred:

mocker = 
cli_runner = .cli_main at 0x7ee47e0faef0>
output_dir_flag = '--output-dir'
output_dir = '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output0/output'
accept_hooks_arg = '--accept-hooks=yes', user_input = None, expected = True

    @pytest.mark.parametrize(
        "accept_hooks_arg,user_input,expected", cli_accept_hook_arg_testdata
    )
    def test_cli_accept_hooks(
        mocker,
        cli_runner,
        output_dir_flag,
        output_dir,
        accept_hooks_arg,
        user_input,
        expected,
    ):
        """Test cli invocation works with `accept-hooks` option."""
        mock_cookiecutter = mocker.patch("cookiecutter.cli.cookiecutter")

        template_path = "tests/fake-repo-pre/"
        result = cli_runner(
            template_path, output_dir_flag, output_dir, accept_hooks_arg, input=user_input
        )

        assert result.exit_code == 0
>       mock_cookiecutter.assert_called_once_with(
            template_path,
            None,
            False,
            replay=False,
            overwrite_if_exists=False,
            output_dir=output_dir,
            config_file=None,
            default_config=False,
            extra_context=None,
            password=None,
            directory=None,
            skip_if_file_exists=False,
            accept_hooks=expected,
            keep_project_on_failure=False,
        )
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output0/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output0/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='yes', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output0/output', 'config_file': None, 'default_config': False, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'yes', 'keep_project_on_failure': False} == {'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output0/output', 'config_file': None, 'default_config': False, 'extra_context': None, 'password': None, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': True, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': None,
E          'default_config': False,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output0/output',
E          'overwrite_if_exists': False,
E          'replay': False,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'yes'} != {'accept_hooks': True}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': True,
E         ?                     ^^^
E         +     'accept_hooks': 'yes',
E         ?                     ^^ ++
E         +     'checkout': None,
E               'config_file': None,
E               'default_config': False,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output0/output',
E               'overwrite_if_exists': False,
E         -     'password': None,
E               'replay': False,
E               'skip_if_file_exists': False,
E           }

tests/test_cli.py:657: AssertionError

test_cli.py::test_cli_accept_hooks[--output-dir---accept-hooks=no-None-False]

test_cli.py::test_cli_accept_hooks[--output-dir---accept-hooks=no-None-False]
self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': False, 'config_file': None, 'default_config': False, 'directory': None, ...}
expected = call('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output1/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=False, keep_project_on_failure=False)
actual = call('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output1/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='no', keep_project_on_failure=False)
_error_message = ._error_message at 0x7ee47deea4d0>
cause = None

    def assert_called_with(self, /, *args, **kwargs):
        """assert that the last call was made with the specified arguments.

        Raises an AssertionError if the args and keyword args passed in are
        different to the last call to the mock."""
        if self.call_args is None:
            expected = self._format_mock_call_signature(args, kwargs)
            actual = 'not called.'
            error_message = ('expected call not found.\nExpected: %s\nActual: %s'
                    % (expected, actual))
            raise AssertionError(error_message)

        def _error_message():
            msg = self._format_mock_failure_message(args, kwargs)
            return msg
        expected = self._call_matcher(_Call((args, kwargs), two=True))
        actual = self._call_matcher(self.call_args)
        if actual != expected:
            cause = expected if isinstance(expected, Exception) else None
>           raise AssertionError(_error_message()) from cause
E           AssertionError: expected call not found.
E           Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output1/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=False, keep_project_on_failure=False)
E           Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output1/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='no', keep_project_on_failure=False)

/usr/lib/python3.10/unittest/mock.py:929: AssertionError

During handling of the above exception, another exception occurred:

self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': False, 'config_file': None, 'default_config': False, 'directory': None, ...}

    def assert_called_once_with(self, /, *args, **kwargs):
        """assert that the mock was called exactly once and that that call was
        with the specified arguments."""
        if not self.call_count == 1:
            msg = ("Expected '%s' to be called once. Called %s times.%s"
                   % (self._mock_name or 'mock',
                      self.call_count,
                      self._calls_repr()))
            raise AssertionError(msg)
>       return self.assert_called_with(*args, **kwargs)
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output1/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=False, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output1/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='no', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output1/output', 'config_file': None, 'default_config': False, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'no', 'keep_project_on_failure': False} == {'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output1/output', 'config_file': None, 'default_config': False, 'extra_context': None, 'password': None, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': False, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': None,
E          'default_config': False,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output1/output',
E          'overwrite_if_exists': False,
E          'replay': False,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'no'} != {'accept_hooks': False}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': False,
E         ?                     ^^^^^
E         +     'accept_hooks': 'no',
E         ?                     ^^^^
E         +     'checkout': None,
E               'config_file': None,
E               'default_config': False,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output1/output',
E               'overwrite_if_exists': False,
E         -     'password': None,
E               'replay': False,
E               'skip_if_file_exists': False,
E           }

/usr/lib/python3.10/unittest/mock.py:941: AssertionError

During handling of the above exception, another exception occurred:

mocker = 
cli_runner = .cli_main at 0x7ee47e0faef0>
output_dir_flag = '--output-dir'
output_dir = '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output1/output'
accept_hooks_arg = '--accept-hooks=no', user_input = None, expected = False

    @pytest.mark.parametrize(
        "accept_hooks_arg,user_input,expected", cli_accept_hook_arg_testdata
    )
    def test_cli_accept_hooks(
        mocker,
        cli_runner,
        output_dir_flag,
        output_dir,
        accept_hooks_arg,
        user_input,
        expected,
    ):
        """Test cli invocation works with `accept-hooks` option."""
        mock_cookiecutter = mocker.patch("cookiecutter.cli.cookiecutter")

        template_path = "tests/fake-repo-pre/"
        result = cli_runner(
            template_path, output_dir_flag, output_dir, accept_hooks_arg, input=user_input
        )

        assert result.exit_code == 0
>       mock_cookiecutter.assert_called_once_with(
            template_path,
            None,
            False,
            replay=False,
            overwrite_if_exists=False,
            output_dir=output_dir,
            config_file=None,
            default_config=False,
            extra_context=None,
            password=None,
            directory=None,
            skip_if_file_exists=False,
            accept_hooks=expected,
            keep_project_on_failure=False,
        )
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output1/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=False, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output1/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='no', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output1/output', 'config_file': None, 'default_config': False, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'no', 'keep_project_on_failure': False} == {'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output1/output', 'config_file': None, 'default_config': False, 'extra_context': None, 'password': None, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': False, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': None,
E          'default_config': False,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output1/output',
E          'overwrite_if_exists': False,
E          'replay': False,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'no'} != {'accept_hooks': False}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': False,
E         ?                     ^^^^^
E         +     'accept_hooks': 'no',
E         ?                     ^^^^
E         +     'checkout': None,
E               'config_file': None,
E               'default_config': False,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output1/output',
E               'overwrite_if_exists': False,
E         -     'password': None,
E               'replay': False,
E               'skip_if_file_exists': False,
E           }

tests/test_cli.py:657: AssertionError

test_cli.py::test_cli_accept_hooks[--output-dir---accept-hooks=ask-yes-True]

test_cli.py::test_cli_accept_hooks[--output-dir---accept-hooks=ask-yes-True]
self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': True, 'config_file': None, 'default_config': False, 'directory': None, ...}
expected = call('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output2/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False)
actual = call('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output2/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='ask', keep_project_on_failure=False)
_error_message = ._error_message at 0x7ee47deeb1c0>
cause = None

    def assert_called_with(self, /, *args, **kwargs):
        """assert that the last call was made with the specified arguments.

        Raises an AssertionError if the args and keyword args passed in are
        different to the last call to the mock."""
        if self.call_args is None:
            expected = self._format_mock_call_signature(args, kwargs)
            actual = 'not called.'
            error_message = ('expected call not found.\nExpected: %s\nActual: %s'
                    % (expected, actual))
            raise AssertionError(error_message)

        def _error_message():
            msg = self._format_mock_failure_message(args, kwargs)
            return msg
        expected = self._call_matcher(_Call((args, kwargs), two=True))
        actual = self._call_matcher(self.call_args)
        if actual != expected:
            cause = expected if isinstance(expected, Exception) else None
>           raise AssertionError(_error_message()) from cause
E           AssertionError: expected call not found.
E           Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output2/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False)
E           Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output2/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='ask', keep_project_on_failure=False)

/usr/lib/python3.10/unittest/mock.py:929: AssertionError

During handling of the above exception, another exception occurred:

self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': True, 'config_file': None, 'default_config': False, 'directory': None, ...}

    def assert_called_once_with(self, /, *args, **kwargs):
        """assert that the mock was called exactly once and that that call was
        with the specified arguments."""
        if not self.call_count == 1:
            msg = ("Expected '%s' to be called once. Called %s times.%s"
                   % (self._mock_name or 'mock',
                      self.call_count,
                      self._calls_repr()))
            raise AssertionError(msg)
>       return self.assert_called_with(*args, **kwargs)
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output2/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output2/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='ask', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output2/output', 'config_file': None, 'default_config': False, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'ask', 'keep_project_on_failure': False} == {'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output2/output', 'config_file': None, 'default_config': False, 'extra_context': None, 'password': None, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': True, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': None,
E          'default_config': False,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output2/output',
E          'overwrite_if_exists': False,
E          'replay': False,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'ask'} != {'accept_hooks': True}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': True,
E         ?                     ^^^^
E         +     'accept_hooks': 'ask',
E         ?                     ^^^^^
E         +     'checkout': None,
E               'config_file': None,
E               'default_config': False,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output2/output',
E               'overwrite_if_exists': False,
E         -     'password': None,
E               'replay': False,
E               'skip_if_file_exists': False,
E           }

/usr/lib/python3.10/unittest/mock.py:941: AssertionError

During handling of the above exception, another exception occurred:

mocker = 
cli_runner = .cli_main at 0x7ee47e0faef0>
output_dir_flag = '--output-dir'
output_dir = '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output2/output'
accept_hooks_arg = '--accept-hooks=ask', user_input = 'yes', expected = True

    @pytest.mark.parametrize(
        "accept_hooks_arg,user_input,expected", cli_accept_hook_arg_testdata
    )
    def test_cli_accept_hooks(
        mocker,
        cli_runner,
        output_dir_flag,
        output_dir,
        accept_hooks_arg,
        user_input,
        expected,
    ):
        """Test cli invocation works with `accept-hooks` option."""
        mock_cookiecutter = mocker.patch("cookiecutter.cli.cookiecutter")

        template_path = "tests/fake-repo-pre/"
        result = cli_runner(
            template_path, output_dir_flag, output_dir, accept_hooks_arg, input=user_input
        )

        assert result.exit_code == 0
>       mock_cookiecutter.assert_called_once_with(
            template_path,
            None,
            False,
            replay=False,
            overwrite_if_exists=False,
            output_dir=output_dir,
            config_file=None,
            default_config=False,
            extra_context=None,
            password=None,
            directory=None,
            skip_if_file_exists=False,
            accept_hooks=expected,
            keep_project_on_failure=False,
        )
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output2/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output2/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='ask', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output2/output', 'config_file': None, 'default_config': False, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'ask', 'keep_project_on_failure': False} == {'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output2/output', 'config_file': None, 'default_config': False, 'extra_context': None, 'password': None, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': True, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': None,
E          'default_config': False,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output2/output',
E          'overwrite_if_exists': False,
E          'replay': False,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'ask'} != {'accept_hooks': True}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': True,
E         ?                     ^^^^
E         +     'accept_hooks': 'ask',
E         ?                     ^^^^^
E         +     'checkout': None,
E               'config_file': None,
E               'default_config': False,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output2/output',
E               'overwrite_if_exists': False,
E         -     'password': None,
E               'replay': False,
E               'skip_if_file_exists': False,
E           }

tests/test_cli.py:657: AssertionError

test_cli.py::test_cli_accept_hooks[--output-dir---accept-hooks=ask-no-False]

test_cli.py::test_cli_accept_hooks[--output-dir---accept-hooks=ask-no-False]
self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': False, 'config_file': None, 'default_config': False, 'directory': None, ...}
expected = call('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output3/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=False, keep_project_on_failure=False)
actual = call('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output3/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='ask', keep_project_on_failure=False)
_error_message = ._error_message at 0x7ee47deebeb0>
cause = None

    def assert_called_with(self, /, *args, **kwargs):
        """assert that the last call was made with the specified arguments.

        Raises an AssertionError if the args and keyword args passed in are
        different to the last call to the mock."""
        if self.call_args is None:
            expected = self._format_mock_call_signature(args, kwargs)
            actual = 'not called.'
            error_message = ('expected call not found.\nExpected: %s\nActual: %s'
                    % (expected, actual))
            raise AssertionError(error_message)

        def _error_message():
            msg = self._format_mock_failure_message(args, kwargs)
            return msg
        expected = self._call_matcher(_Call((args, kwargs), two=True))
        actual = self._call_matcher(self.call_args)
        if actual != expected:
            cause = expected if isinstance(expected, Exception) else None
>           raise AssertionError(_error_message()) from cause
E           AssertionError: expected call not found.
E           Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output3/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=False, keep_project_on_failure=False)
E           Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output3/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='ask', keep_project_on_failure=False)

/usr/lib/python3.10/unittest/mock.py:929: AssertionError

During handling of the above exception, another exception occurred:

self = 
args = ('tests/fake-repo-pre/', None, False)
kwargs = {'accept_hooks': False, 'config_file': None, 'default_config': False, 'directory': None, ...}

    def assert_called_once_with(self, /, *args, **kwargs):
        """assert that the mock was called exactly once and that that call was
        with the specified arguments."""
        if not self.call_count == 1:
            msg = ("Expected '%s' to be called once. Called %s times.%s"
                   % (self._mock_name or 'mock',
                      self.call_count,
                      self._calls_repr()))
            raise AssertionError(msg)
>       return self.assert_called_with(*args, **kwargs)
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output3/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=False, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output3/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='ask', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output3/output', 'config_file': None, 'default_config': False, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'ask', 'keep_project_on_failure': False} == {'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output3/output', 'config_file': None, 'default_config': False, 'extra_context': None, 'password': None, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': False, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': None,
E          'default_config': False,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output3/output',
E          'overwrite_if_exists': False,
E          'replay': False,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'ask'} != {'accept_hooks': False}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': False,
E         ?                     ^ - ^
E         +     'accept_hooks': 'ask',
E         ?                     ^  ^^
E         +     'checkout': None,
E               'config_file': None,
E               'default_config': False,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output3/output',
E               'overwrite_if_exists': False,
E         -     'password': None,
E               'replay': False,
E               'skip_if_file_exists': False,
E           }

/usr/lib/python3.10/unittest/mock.py:941: AssertionError

During handling of the above exception, another exception occurred:

mocker = 
cli_runner = .cli_main at 0x7ee47e0faef0>
output_dir_flag = '--output-dir'
output_dir = '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output3/output'
accept_hooks_arg = '--accept-hooks=ask', user_input = 'no', expected = False

    @pytest.mark.parametrize(
        "accept_hooks_arg,user_input,expected", cli_accept_hook_arg_testdata
    )
    def test_cli_accept_hooks(
        mocker,
        cli_runner,
        output_dir_flag,
        output_dir,
        accept_hooks_arg,
        user_input,
        expected,
    ):
        """Test cli invocation works with `accept-hooks` option."""
        mock_cookiecutter = mocker.patch("cookiecutter.cli.cookiecutter")

        template_path = "tests/fake-repo-pre/"
        result = cli_runner(
            template_path, output_dir_flag, output_dir, accept_hooks_arg, input=user_input
        )

        assert result.exit_code == 0
>       mock_cookiecutter.assert_called_once_with(
            template_path,
            None,
            False,
            replay=False,
            overwrite_if_exists=False,
            output_dir=output_dir,
            config_file=None,
            default_config=False,
            extra_context=None,
            password=None,
            directory=None,
            skip_if_file_exists=False,
            accept_hooks=expected,
            keep_project_on_failure=False,
        )
E       AssertionError: expected call not found.
E       Expected: cookiecutter('tests/fake-repo-pre/', None, False, replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output3/output', config_file=None, default_config=False, extra_context=None, password=None, directory=None, skip_if_file_exists=False, accept_hooks=False, keep_project_on_failure=False)
E       Actual: cookiecutter('tests/fake-repo-pre/', checkout=None, no_input=False, extra_context=OrderedDict(), replay=False, overwrite_if_exists=False, output_dir='/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output3/output', config_file=None, default_config=False, directory=None, skip_if_file_exists=False, accept_hooks='ask', keep_project_on_failure=False)
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('tests/fake-repo-pre/',) == ('tests/fake-repo-pre/', None, False)
E         
E         Right contains 2 more items, first extra item: None
E         
E         Full diff:
E           (
E               'tests/fake-repo-pre/',
E         -     None,
E         -     False,
E           )
E       Kwargs:
E       assert {'checkout': None, 'no_input': False, 'extra_context': OrderedDict(), 'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output3/output', 'config_file': None, 'default_config': False, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': 'ask', 'keep_project_on_failure': False} == {'replay': False, 'overwrite_if_exists': False, 'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output3/output', 'config_file': None, 'default_config': False, 'extra_context': None, 'password': None, 'directory': None, 'skip_if_file_exists': False, 'accept_hooks': False, 'keep_project_on_failure': False}
E         
E         Common items:
E         {'config_file': None,
E          'default_config': False,
E          'directory': None,
E          'keep_project_on_failure': False,
E          'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output3/output',
E          'overwrite_if_exists': False,
E          'replay': False,
E          'skip_if_file_exists': False}
E         Differing items:
E         {'extra_context': OrderedDict()} != {'extra_context': None}
E         {'accept_hooks': 'ask'} != {'accept_hooks': False}
E         Left contains 2 more items:
E         {'checkout': None, 'no_input': False}
E         Right contains 1 more item:
E         {'password': None}
E         
E         Full diff:
E           {
E         -     'accept_hooks': False,
E         ?                     ^ - ^
E         +     'accept_hooks': 'ask',
E         ?                     ^  ^^
E         +     'checkout': None,
E               'config_file': None,
E               'default_config': False,
E               'directory': None,
E         -     'extra_context': None,
E         ?                      ^^^
E         +     'extra_context': OrderedDict(),
E         ?                      ^^^ +++++++++
E               'keep_project_on_failure': False,
E         +     'no_input': False,
E               'output_dir': '/tmp/pytest-of-root/pytest-0/test_cli_accept_hooks___output3/output',
E               'overwrite_if_exists': False,
E         -     'password': None,
E               'replay': False,
E               'skip_if_file_exists': False,
E           }

tests/test_cli.py:657: AssertionError

test_cli.py::test_cli_with_json_decoding_error

test_cli.py::test_cli_with_json_decoding_error
cli_runner = .cli_main at 0x7ee47e0faef0>

    @pytest.mark.usefixtures('remove_fake_project_dir')
    def test_cli_with_json_decoding_error(cli_runner):
        """Test cli invocation with a malformed JSON file."""
        template_path = 'tests/fake-repo-bad-json/'
        result = cli_runner(template_path, '--no-input')
        assert result.exit_code != 0

        # Validate the error message.
        # original message from json module should be included
        pattern = 'Expecting \'{0,1}:\'{0,1} delimiter: line 1 column (19|20) \\(char 19\\)'
>       assert re.search(pattern, result.output)
E       assert None
E        +  where None = ("Expecting '{0,1}:'{0,1} delimiter: line 1 column (19|20) \\(char 19\\)", "ERROR: Error: determine_repo_dir() missing 1 required positional argument: 'abbreviations'\nUnknown error: determine_repo_dir() missing 1 required positional argument: 'abbreviations'\n")
E        +    where  = re.search
E        +    and   "ERROR: Error: determine_repo_dir() missing 1 required positional argument: 'abbreviations'\nUnknown error: determine_repo_dir() missing 1 required positional argument: 'abbreviations'\n" = .output

tests/test_cli.py:685: AssertionError

test_cli.py::test_cli_with_pre_prompt_hook

test_cli.py::test_cli_with_pre_prompt_hook
cli_runner = .cli_main at 0x7ee47e0faef0>

    @pytest.mark.usefixtures('remove_fake_project_dir')
    def test_cli_with_pre_prompt_hook(cli_runner):
        """Test cli invocation in a template with pre_prompt hook."""
        template_path = 'tests/test-pyhooks/'
        result = cli_runner(template_path, '--no-input')
>       assert result.exit_code == 0
E       assert 1 == 0
E        +  where 1 = .exit_code

tests/test_cli.py:699: AssertionError

test_cookiecutter_invocation.py::test_should_invoke_main

test_cookiecutter_invocation.py::test_should_invoke_main
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7ee47e150400>
project_dir = 'fake-project-templated'

    @pytest.mark.usefixtures('clean_system')
    def test_should_invoke_main(monkeypatch, project_dir):
        """Should create a project and exit with 0 code on cli invocation."""
        monkeypatch.setenv('PYTHONPATH', '.')

>       exit_code = subprocess.check_call(
            [sys.executable, '-m', 'cookiecutter.cli', 'tests/fake-repo-tmpl', '--no-input']
        )

tests/test_cookiecutter_invocation.py:31: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

popenargs = (['/testbed/.venv/bin/python3', '-m', 'cookiecutter.cli', 'tests/fake-repo-tmpl', '--no-input'],)
kwargs = {}, retcode = 1
cmd = ['/testbed/.venv/bin/python3', '-m', 'cookiecutter.cli', 'tests/fake-repo-tmpl', '--no-input']

    def check_call(*popenargs, **kwargs):
        """Run command with arguments.  Wait for command to complete.  If
        the exit code was zero then return, otherwise raise
        CalledProcessError.  The CalledProcessError object will have the
        return code in the returncode attribute.

        The arguments are the same as for the call function.  Example:

        check_call(["ls", "-l"])
        """
        retcode = call(*popenargs, **kwargs)
        if retcode:
            cmd = kwargs.get("args")
            if cmd is None:
                cmd = popenargs[0]
>           raise CalledProcessError(retcode, cmd)
E           subprocess.CalledProcessError: Command '['/testbed/.venv/bin/python3', '-m', 'cookiecutter.cli', 'tests/fake-repo-tmpl', '--no-input']' returned non-zero exit status 1.

/usr/lib/python3.10/subprocess.py:369: CalledProcessError

]

]
path = 'tests/fake-repo-pre/'

    @pytest.mark.parametrize('path', ['tests/fake-repo-pre/', 'tests/fake-repo-pre'])
    @pytest.mark.usefixtures('clean_system', 'remove_additional_dirs')
    def test_cookiecutter_no_input_return_project_dir(path):
        """Verify `cookiecutter` create project dir on input with or without slash."""
>       project_dir = main.cookiecutter(path, no_input=True)

tests/test_cookiecutter_local_no_input.py:39: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = 'tests/fake-repo-pre/', checkout = None, no_input = True
extra_context = None, replay = None, overwrite_if_exists = False
output_dir = '.', config_file = None, default_config = False, password = None
directory = None, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

cookiecutter/main.py:60: TypeError

fake-repo-pre]

fake-repo-pre]
path = 'tests/fake-repo-pre'

    @pytest.mark.parametrize('path', ['tests/fake-repo-pre/', 'tests/fake-repo-pre'])
    @pytest.mark.usefixtures('clean_system', 'remove_additional_dirs')
    def test_cookiecutter_no_input_return_project_dir(path):
        """Verify `cookiecutter` create project dir on input with or without slash."""
>       project_dir = main.cookiecutter(path, no_input=True)

tests/test_cookiecutter_local_no_input.py:39: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = 'tests/fake-repo-pre', checkout = None, no_input = True
extra_context = None, replay = None, overwrite_if_exists = False
output_dir = '.', config_file = None, default_config = False, password = None
directory = None, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

cookiecutter/main.py:60: TypeError

test_cookiecutter_local_no_input.py::test_cookiecutter_no_input_extra_context

test_cookiecutter_local_no_input.py::test_cookiecutter_no_input_extra_context
@pytest.mark.usefixtures('clean_system', 'remove_additional_dirs')
    def test_cookiecutter_no_input_extra_context():
        """Verify `cookiecutter` accept `extra_context` argument."""
>       main.cookiecutter(
            'tests/fake-repo-pre',
            no_input=True,
            extra_context={'repo_name': 'fake-project-extra'},
        )

tests/test_cookiecutter_local_no_input.py:50: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = 'tests/fake-repo-pre', checkout = None, no_input = True
extra_context = {'repo_name': 'fake-project-extra'}, replay = None
overwrite_if_exists = False, output_dir = '.', config_file = None
default_config = False, password = None, directory = None
skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

cookiecutter/main.py:60: TypeError

test_cookiecutter_local_no_input.py::test_cookiecutter_templated_context

test_cookiecutter_local_no_input.py::test_cookiecutter_templated_context
@pytest.mark.usefixtures('clean_system', 'remove_additional_dirs')
    def test_cookiecutter_templated_context():
        """Verify Jinja2 templating correctly works in `cookiecutter.json` file."""
>       main.cookiecutter('tests/fake-repo-tmpl', no_input=True)

tests/test_cookiecutter_local_no_input.py:61: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = 'tests/fake-repo-tmpl', checkout = None, no_input = True
extra_context = None, replay = None, overwrite_if_exists = False
output_dir = '.', config_file = None, default_config = False, password = None
directory = None, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

cookiecutter/main.py:60: TypeError

test_cookiecutter_local_no_input.py::test_cookiecutter_no_input_return_rendered_file

test_cookiecutter_local_no_input.py::test_cookiecutter_no_input_return_rendered_file
@pytest.mark.usefixtures('clean_system', 'remove_additional_dirs')
    def test_cookiecutter_no_input_return_rendered_file():
        """Verify Jinja2 templating correctly works in `cookiecutter.json` file."""
>       project_dir = main.cookiecutter('tests/fake-repo-pre', no_input=True)

tests/test_cookiecutter_local_no_input.py:68: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = 'tests/fake-repo-pre', checkout = None, no_input = True
extra_context = None, replay = None, overwrite_if_exists = False
output_dir = '.', config_file = None, default_config = False, password = None
directory = None, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

cookiecutter/main.py:60: TypeError

test_cookiecutter_local_no_input.py::test_cookiecutter_dict_values_in_context

test_cookiecutter_local_no_input.py::test_cookiecutter_dict_values_in_context
@pytest.mark.usefixtures('clean_system', 'remove_additional_dirs')
    def test_cookiecutter_dict_values_in_context():
        """Verify configured dictionary from `cookiecutter.json` correctly unpacked."""
>       project_dir = main.cookiecutter('tests/fake-repo-dict', no_input=True)

tests/test_cookiecutter_local_no_input.py:77: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = 'tests/fake-repo-dict', checkout = None, no_input = True
extra_context = None, replay = None, overwrite_if_exists = False
output_dir = '.', config_file = None, default_config = False, password = None
directory = None, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

cookiecutter/main.py:60: TypeError

test_cookiecutter_local_no_input.py::test_cookiecutter_template_cleanup

test_cookiecutter_local_no_input.py::test_cookiecutter_template_cleanup
mocker = 

    @pytest.mark.usefixtures('clean_system', 'remove_additional_dirs')
    def test_cookiecutter_template_cleanup(mocker):
        """Verify temporary folder for zip unpacking dropped."""
        mocker.patch('tempfile.mkdtemp', return_value='fake-tmp', autospec=True)

        mocker.patch(
            'cookiecutter.prompt.prompt_and_delete', return_value=True, autospec=True
        )

>       main.cookiecutter('tests/files/fake-repo-tmpl.zip', no_input=True)

tests/test_cookiecutter_local_no_input.py:133: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = 'tests/files/fake-repo-tmpl.zip', checkout = None, no_input = True
extra_context = None, replay = None, overwrite_if_exists = False
output_dir = '.', config_file = None, default_config = False, password = None
directory = None, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

cookiecutter/main.py:60: TypeError

test_cookiecutter_local_with_input.py::test_cookiecutter_local_with_input

test_cookiecutter_local_with_input.py::test_cookiecutter_local_with_input
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7ee47db3d3f0>

    @pytest.mark.usefixtures('clean_system', 'remove_additional_dirs')
    def test_cookiecutter_local_with_input(monkeypatch):
        """Verify simple cookiecutter run results, without extra_context provided."""
        monkeypatch.setattr(
            'cookiecutter.prompt.read_user_variable',
            lambda var, default, prompts, prefix: default,
        )
>       main.cookiecutter('tests/fake-repo-pre/', no_input=False)

tests/test_cookiecutter_local_with_input.py:27: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = 'tests/fake-repo-pre/', checkout = None, no_input = False
extra_context = None, replay = None, overwrite_if_exists = False
output_dir = '.', config_file = None, default_config = False, password = None
directory = None, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

cookiecutter/main.py:60: TypeError

test_cookiecutter_local_with_input.py::test_cookiecutter_input_extra_context

test_cookiecutter_local_with_input.py::test_cookiecutter_input_extra_context
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7ee47e048e50>

    @pytest.mark.usefixtures('clean_system', 'remove_additional_dirs')
    def test_cookiecutter_input_extra_context(monkeypatch):
        """Verify simple cookiecutter run results, with extra_context provided."""
        monkeypatch.setattr(
            'cookiecutter.prompt.read_user_variable',
            lambda var, default, prompts, prefix: default,
        )
>       main.cookiecutter(
            'tests/fake-repo-pre',
            no_input=False,
            extra_context={'repo_name': 'fake-project-input-extra'},
        )

tests/test_cookiecutter_local_with_input.py:42: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = 'tests/fake-repo-pre', checkout = None, no_input = False
extra_context = {'repo_name': 'fake-project-input-extra'}, replay = None
overwrite_if_exists = False, output_dir = '.', config_file = None
default_config = False, password = None, directory = None
skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

cookiecutter/main.py:60: TypeError

test_cookiecutter_nested_templates.py::test_cookiecutter_nested_templates[fake-nested-templates-fake-project]

test_cookiecutter_nested_templates.py::test_cookiecutter_nested_templates[fake-nested-templates-fake-project]
mocker = 
template_dir = 'fake-nested-templates', output_dir = 'fake-project'

    @pytest.mark.parametrize(
        "template_dir,output_dir",
        [
            ["fake-nested-templates", "fake-project"],
            ["fake-nested-templates-old-style", "fake-package"],
        ],
    )
    def test_cookiecutter_nested_templates(mocker, template_dir: str, output_dir: str):
        """Verify cookiecutter nested configuration files mechanism."""
        mock_generate_files = mocker.patch("cookiecutter.main.generate_files")
        main_dir = (Path("tests") / template_dir).resolve()
>       main.cookiecutter(f"{main_dir}", no_input=True)

tests/test_cookiecutter_nested_templates.py:21: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = '/testbed/tests/fake-nested-templates', checkout = None
no_input = True, extra_context = None, replay = None
overwrite_if_exists = False, output_dir = '.', config_file = None
default_config = False, password = None, directory = None
skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

cookiecutter/main.py:60: TypeError

test_cookiecutter_nested_templates.py::test_cookiecutter_nested_templates[fake-nested-templates-old-style-fake-package]

test_cookiecutter_nested_templates.py::test_cookiecutter_nested_templates[fake-nested-templates-old-style-fake-package]
mocker = 
template_dir = 'fake-nested-templates-old-style', output_dir = 'fake-package'

    @pytest.mark.parametrize(
        "template_dir,output_dir",
        [
            ["fake-nested-templates", "fake-project"],
            ["fake-nested-templates-old-style", "fake-package"],
        ],
    )
    def test_cookiecutter_nested_templates(mocker, template_dir: str, output_dir: str):
        """Verify cookiecutter nested configuration files mechanism."""
        mock_generate_files = mocker.patch("cookiecutter.main.generate_files")
        main_dir = (Path("tests") / template_dir).resolve()
>       main.cookiecutter(f"{main_dir}", no_input=True)

tests/test_cookiecutter_nested_templates.py:21: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = '/testbed/tests/fake-nested-templates-old-style', checkout = None
no_input = True, extra_context = None, replay = None
overwrite_if_exists = False, output_dir = '.', config_file = None
default_config = False, password = None, directory = None
skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

cookiecutter/main.py:60: TypeError

test_custom_extensions_in_hooks.py::test_hook_with_extension[pre_gen_hook]

test_custom_extensions_in_hooks.py::test_hook_with_extension[pre_gen_hook]
template = 'tests/test-extensions/custom-extension-pre'
output_dir = '/tmp/pytest-of-root/pytest-0/test_hook_with_extension_pre_g0/output'

    def test_hook_with_extension(template, output_dir):
        """Verify custom Jinja2 extension correctly work in hooks and file rendering.

        Each file in hooks has simple tests inside and will raise error if not
        correctly rendered.
        """
>       project_dir = main.cookiecutter(
            template,
            no_input=True,
            output_dir=output_dir,
            extra_context={'project_slug': 'foobar', 'name': 'Cookiemonster'},
        )

tests/test_custom_extensions_in_hooks.py:36: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = 'tests/test-extensions/custom-extension-pre', checkout = None
no_input = True
extra_context = {'name': 'Cookiemonster', 'project_slug': 'foobar'}
replay = None, overwrite_if_exists = False
output_dir = '/tmp/pytest-of-root/pytest-0/test_hook_with_extension_pre_g0/output'
config_file = None, default_config = False, password = None, directory = None
skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

cookiecutter/main.py:60: TypeError

test_custom_extensions_in_hooks.py::test_hook_with_extension[post_gen_hook]

test_custom_extensions_in_hooks.py::test_hook_with_extension[post_gen_hook]
template = 'tests/test-extensions/custom-extension-post'
output_dir = '/tmp/pytest-of-root/pytest-0/test_hook_with_extension_post_0/output'

    def test_hook_with_extension(template, output_dir):
        """Verify custom Jinja2 extension correctly work in hooks and file rendering.

        Each file in hooks has simple tests inside and will raise error if not
        correctly rendered.
        """
>       project_dir = main.cookiecutter(
            template,
            no_input=True,
            output_dir=output_dir,
            extra_context={'project_slug': 'foobar', 'name': 'Cookiemonster'},
        )

tests/test_custom_extensions_in_hooks.py:36: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = 'tests/test-extensions/custom-extension-post', checkout = None
no_input = True
extra_context = {'name': 'Cookiemonster', 'project_slug': 'foobar'}
replay = None, overwrite_if_exists = False
output_dir = '/tmp/pytest-of-root/pytest-0/test_hook_with_extension_post_0/output'
config_file = None, default_config = False, password = None, directory = None
skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

cookiecutter/main.py:60: TypeError

test_default_extensions.py::test_jinja2_time_extension

test_default_extensions.py::test_jinja2_time_extension
tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_jinja2_time_extension0')

    def test_jinja2_time_extension(tmp_path):
        """Verify Jinja2 time extension work correctly."""
>       project_dir = cookiecutter(
            'tests/test-extensions/default/', no_input=True, output_dir=str(tmp_path)
        )

tests/test_default_extensions.py:24: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = 'tests/test-extensions/default/', checkout = None, no_input = True
extra_context = None, replay = None, overwrite_if_exists = False
output_dir = '/tmp/pytest-of-root/pytest-0/test_jinja2_time_extension0'
config_file = None, default_config = False, password = None, directory = None
skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

cookiecutter/main.py:60: TypeError

test_default_extensions.py::test_jinja2_slugify_extension

test_default_extensions.py::test_jinja2_slugify_extension
tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_jinja2_slugify_extension0')

    def test_jinja2_slugify_extension(tmp_path):
        """Verify Jinja2 slugify extension work correctly."""
>       project_dir = cookiecutter(
            'tests/test-extensions/default/', no_input=True, output_dir=str(tmp_path)
        )

tests/test_default_extensions.py:47: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = 'tests/test-extensions/default/', checkout = None, no_input = True
extra_context = None, replay = None, overwrite_if_exists = False
output_dir = '/tmp/pytest-of-root/pytest-0/test_jinja2_slugify_extension0'
config_file = None, default_config = False, password = None, directory = None
skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

cookiecutter/main.py:60: TypeError

test_default_extensions.py::test_jinja2_uuid_extension

test_default_extensions.py::test_jinja2_uuid_extension
tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_jinja2_uuid_extension0')

    def test_jinja2_uuid_extension(tmp_path):
        """Verify Jinja2 uuid extension work correctly."""
>       project_dir = cookiecutter(
            'tests/test-extensions/default/', no_input=True, output_dir=str(tmp_path)
        )

tests/test_default_extensions.py:56: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = 'tests/test-extensions/default/', checkout = None, no_input = True
extra_context = None, replay = None, overwrite_if_exists = False
output_dir = '/tmp/pytest-of-root/pytest-0/test_jinja2_uuid_extension0'
config_file = None, default_config = False, password = None, directory = None
skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

cookiecutter/main.py:60: TypeError

test_find.py::test_find_template[template with default jinja strings]

test_find.py::test_find_template[template with default jinja strings]
repo_name = 'fake-repo-pre'
env = 
error_expectation = 
expected = '{{cookiecutter.repo_name}}'

    @pytest.mark.parametrize(
        "repo_name,context,error_expectation,expected",
        [
            ("fake-repo-pre", {}, does_not_raise(), '{{cookiecutter.repo_name}}'),
            (
                "fake-repo-pre2",
                {
                    'cookiecutter': {
                        '_jinja2_env_vars': {
                            'variable_start_string': '{%{',
                            'variable_end_string': '}%}',
                        }
                    }
                },
                does_not_raise(),
                '{%{cookiecutter.repo_name}%}',
            ),
            (
                "fake-repo-pre",
                {
                    'cookiecutter': {
                        '_jinja2_env_vars': {
                            'variable_start_string': '{%{',
                            'variable_end_string': '}%}',
                        }
                    }
                },
                pytest.raises(NonTemplatedInputDirException),
                None,
            ),
            ("fake-repo-bad", {}, pytest.raises(NonTemplatedInputDirException), None),
        ],
        ids=[
            'template with default jinja strings',
            'template with custom jinja strings',
            'template with custom jinja strings but folder with default jinja strings',
            'template missing folder',
        ],
    )
    def test_find_template(repo_name, env, error_expectation, expected):
        """Verify correctness of `find.find_template` path detection."""
        repo_dir = Path('tests', repo_name)

        with error_expectation:
            template = find.find_template(repo_dir, env)

            test_dir = Path(repo_dir, expected)
>           assert template == test_dir
E           AssertionError: assert PosixPath('tests/fake-repo-pre') == PosixPath('tests/fake-repo-pre/{{cookiecutter.repo_name}}')

tests/test_find.py:72: AssertionError

test_find.py::test_find_template[template with custom jinja strings]

test_find.py::test_find_template[template with custom jinja strings]
repo_name = 'fake-repo-pre2'
env = 
error_expectation = 
expected = '{%{cookiecutter.repo_name}%}'

    @pytest.mark.parametrize(
        "repo_name,context,error_expectation,expected",
        [
            ("fake-repo-pre", {}, does_not_raise(), '{{cookiecutter.repo_name}}'),
            (
                "fake-repo-pre2",
                {
                    'cookiecutter': {
                        '_jinja2_env_vars': {
                            'variable_start_string': '{%{',
                            'variable_end_string': '}%}',
                        }
                    }
                },
                does_not_raise(),
                '{%{cookiecutter.repo_name}%}',
            ),
            (
                "fake-repo-pre",
                {
                    'cookiecutter': {
                        '_jinja2_env_vars': {
                            'variable_start_string': '{%{',
                            'variable_end_string': '}%}',
                        }
                    }
                },
                pytest.raises(NonTemplatedInputDirException),
                None,
            ),
            ("fake-repo-bad", {}, pytest.raises(NonTemplatedInputDirException), None),
        ],
        ids=[
            'template with default jinja strings',
            'template with custom jinja strings',
            'template with custom jinja strings but folder with default jinja strings',
            'template missing folder',
        ],
    )
    def test_find_template(repo_name, env, error_expectation, expected):
        """Verify correctness of `find.find_template` path detection."""
        repo_dir = Path('tests', repo_name)

        with error_expectation:
            template = find.find_template(repo_dir, env)

            test_dir = Path(repo_dir, expected)
>           assert template == test_dir
E           AssertionError: assert PosixPath('tests/fake-repo-pre2') == PosixPath('tests/fake-repo-pre2/{%{cookiecutter.repo_name}%}')

tests/test_find.py:72: AssertionError

test_find.py::test_find_template[template with custom jinja strings but folder with default jinja strings]

test_find.py::test_find_template[template with custom jinja strings but folder with default jinja strings]
repo_name = 'fake-repo-pre'
env = 
error_expectation = <_pytest.python_api.RaisesContext object at 0x7ee47e9f6c20>
expected = None

    @pytest.mark.parametrize(
        "repo_name,context,error_expectation,expected",
        [
            ("fake-repo-pre", {}, does_not_raise(), '{{cookiecutter.repo_name}}'),
            (
                "fake-repo-pre2",
                {
                    'cookiecutter': {
                        '_jinja2_env_vars': {
                            'variable_start_string': '{%{',
                            'variable_end_string': '}%}',
                        }
                    }
                },
                does_not_raise(),
                '{%{cookiecutter.repo_name}%}',
            ),
            (
                "fake-repo-pre",
                {
                    'cookiecutter': {
                        '_jinja2_env_vars': {
                            'variable_start_string': '{%{',
                            'variable_end_string': '}%}',
                        }
                    }
                },
                pytest.raises(NonTemplatedInputDirException),
                None,
            ),
            ("fake-repo-bad", {}, pytest.raises(NonTemplatedInputDirException), None),
        ],
        ids=[
            'template with default jinja strings',
            'template with custom jinja strings',
            'template with custom jinja strings but folder with default jinja strings',
            'template missing folder',
        ],
    )
    def test_find_template(repo_name, env, error_expectation, expected):
        """Verify correctness of `find.find_template` path detection."""
        repo_dir = Path('tests', repo_name)

        with error_expectation:
            template = find.find_template(repo_dir, env)

>           test_dir = Path(repo_dir, expected)

tests/test_find.py:71: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/usr/lib/python3.10/pathlib.py:960: in __new__
    self = cls._from_parts(args)
/usr/lib/python3.10/pathlib.py:594: in _from_parts
    drv, root, parts = self._parse_args(args)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

cls = 
args = (PosixPath('tests/fake-repo-pre'), None)

    @classmethod
    def _parse_args(cls, args):
        # This is useful when you don't want to create an instance, just
        # canonicalize some constructor arguments.
        parts = []
        for a in args:
            if isinstance(a, PurePath):
                parts += a._parts
            else:
>               a = os.fspath(a)
E               TypeError: expected str, bytes or os.PathLike object, not NoneType

/usr/lib/python3.10/pathlib.py:578: TypeError

test_generate_context.py::test_generate_context[input_params0-expected_context0]

test_generate_context.py::test_generate_context[input_params0-expected_context0]
input_params = {'context_file': 'tests/test-generate-context/test.json'}
expected_context = {'test': {'1': 2, 'some_key': 'some_val'}}

    @pytest.mark.usefixtures('clean_system')
    @pytest.mark.parametrize('input_params, expected_context', context_data())
    def test_generate_context(input_params, expected_context):
        """Verify input contexts combinations result in expected content on output."""
>       assert generate.generate_context(**input_params) == expected_context
E       AssertionError: assert OrderedDict([('1', 2), ('some_key', 'some_val')]) == {'test': {'1': 2, 'some_key': 'some_val'}}
E         
E         Left contains 2 more items:
E         {'1': 2, 'some_key': 'some_val'}
E         Right contains 1 more item:
E         {'test': {'1': 2, 'some_key': 'some_val'}}
E         
E         Full diff:
E         + OrderedDict({
E         - {
E         -     'test': {
E         -         '1': 2,
E         ? ----
E         +     '1': 2,
E         -         'some_key': 'some_val',
E         ? ----
E         +     'some_key': 'some_val',
E         + })
E         -     },
E         - }

tests/test_generate_context.py:58: AssertionError

test_generate_context.py::test_generate_context[input_params1-expected_context1]

test_generate_context.py::test_generate_context[input_params1-expected_context1]
input_params = {'context_file': 'tests/test-generate-context/test.json', 'default_context': {'1': 3}}
expected_context = {'test': {'1': 3, 'some_key': 'some_val'}}

    @pytest.mark.usefixtures('clean_system')
    @pytest.mark.parametrize('input_params, expected_context', context_data())
    def test_generate_context(input_params, expected_context):
        """Verify input contexts combinations result in expected content on output."""
>       assert generate.generate_context(**input_params) == expected_context
E       AssertionError: assert OrderedDict([('1', '3'), ('some_key', 'some_val')]) == {'test': {'1': 3, 'some_key': 'some_val'}}
E         
E         Left contains 2 more items:
E         {'1': '3', 'some_key': 'some_val'}
E         Right contains 1 more item:
E         {'test': {'1': 3, 'some_key': 'some_val'}}
E         
E         Full diff:
E         + OrderedDict({
E         - {
E         -     'test': {
E         -         '1': 3,
E         ? ----
E         +     '1': '3',
E         ?          + +
E         -         'some_key': 'some_val',
E         ? ----
E         +     'some_key': 'some_val',
E         + })
E         -     },
E         - }

tests/test_generate_context.py:58: AssertionError

test_generate_context.py::test_generate_context[input_params2-expected_context2]

test_generate_context.py::test_generate_context[input_params2-expected_context2]
input_params = {'context_file': 'tests/test-generate-context/test.json', 'extra_context': {'1': 4}}
expected_context = {'test': {'1': 4, 'some_key': 'some_val'}}

    @pytest.mark.usefixtures('clean_system')
    @pytest.mark.parametrize('input_params, expected_context', context_data())
    def test_generate_context(input_params, expected_context):
        """Verify input contexts combinations result in expected content on output."""
>       assert generate.generate_context(**input_params) == expected_context
E       AssertionError: assert OrderedDict([('1', '4'), ('some_key', 'some_val')]) == {'test': {'1': 4, 'some_key': 'some_val'}}
E         
E         Left contains 2 more items:
E         {'1': '4', 'some_key': 'some_val'}
E         Right contains 1 more item:
E         {'test': {'1': 4, 'some_key': 'some_val'}}
E         
E         Full diff:
E         + OrderedDict({
E         - {
E         -     'test': {
E         -         '1': 4,
E         ? ----
E         +     '1': '4',
E         ?          + +
E         -         'some_key': 'some_val',
E         ? ----
E         +     'some_key': 'some_val',
E         + })
E         -     },
E         - }

tests/test_generate_context.py:58: AssertionError

test_generate_context.py::test_generate_context[input_params3-expected_context3]

test_generate_context.py::test_generate_context[input_params3-expected_context3]
input_params = {'context_file': 'tests/test-generate-context/test.json', 'default_context': {'1': 3}, 'extra_context': {'1': 5}}
expected_context = {'test': {'1': 5, 'some_key': 'some_val'}}

    @pytest.mark.usefixtures('clean_system')
    @pytest.mark.parametrize('input_params, expected_context', context_data())
    def test_generate_context(input_params, expected_context):
        """Verify input contexts combinations result in expected content on output."""
>       assert generate.generate_context(**input_params) == expected_context
E       AssertionError: assert OrderedDict([('1', '5'), ('some_key', 'some_val')]) == {'test': {'1': 5, 'some_key': 'some_val'}}
E         
E         Left contains 2 more items:
E         {'1': '5', 'some_key': 'some_val'}
E         Right contains 1 more item:
E         {'test': {'1': 5, 'some_key': 'some_val'}}
E         
E         Full diff:
E         + OrderedDict({
E         - {
E         -     'test': {
E         -         '1': 5,
E         ? ----
E         +     '1': '5',
E         ?          + +
E         -         'some_key': 'some_val',
E         ? ----
E         +     'some_key': 'some_val',
E         + })
E         -     },
E         - }

tests/test_generate_context.py:58: AssertionError

test_generate_context.py::test_default_context_replacement_in_generate_context

test_generate_context.py::test_default_context_replacement_in_generate_context
def test_default_context_replacement_in_generate_context():
        """Verify default content settings are correctly replaced by template settings.

        Make sure that the default for list variables of `orientation` is based on
        the user config (`choices_template.json`) and not changed to a single value
        from `default_context`.
        """
        expected_context = {
            'choices_template': OrderedDict(
                [
                    ('full_name', 'Raphael Pierzina'),
                    ('github_username', 'hackebrot'),
                    ('project_name', 'Kivy Project'),
                    ('repo_name', '{{cookiecutter.project_name|lower}}'),
                    ('orientation', ['landscape', 'all', 'portrait']),
                ]
            )
        }

        generated_context = generate.generate_context(
            context_file='tests/test-generate-context/choices_template.json',
            default_context={
                'not_in_template': 'foobar',
                'project_name': 'Kivy Project',
                'orientation': 'landscape',
            },
            extra_context={
                'also_not_in_template': 'foobar2',
                'github_username': 'hackebrot',
            },
        )

>       assert generated_context == expected_context
E       AssertionError: assert OrderedDict([('full_name', 'Raphael Pierzina'), ('github_username', 'hackebrot'), ('project_name', 'Kivy Project'), ('repo_name', '{{cookiecutter.project_name|lower}}'), ('orientation', 'landscape'), ('not_in_template', 'foobar'), ('also_not_in_template', 'foobar2')]) == {'choices_template': OrderedDict([('full_name', 'Raphael Pierzina'), ('github_username', 'hackebrot'), ('project_name', 'Kivy Project'), ('repo_name', '{{cookiecutter.project_name|lower}}'), ('orientation', ['landscape', 'all', 'portrait'])])}
E         
E         Left contains 7 more items:
E         {'also_not_in_template': 'foobar2',
E          'full_name': 'Raphael Pierzina',
E          'github_username': 'hackebrot',
E          'not_in_template': 'foobar',
E          'orientation': 'landscape',
E          'project_name': 'Kivy Project',
E          'repo_name': '{{cookiecutter.project_name|lower}}'}
E         Right contains 1 more item:
E         {'choices_template': OrderedDict([('full_name', 'Raphael Pierzina'),
E                                           ('github_username', 'hackebrot'),
E                                           ('project_name', 'Kivy Project'),
E                                           ('repo_name',
E                                            '{{cookiecutter.project_name|lower}}'),
E                                           ('orientation',
E                                            ['landscape', 'all', 'portrait'])])}
E         
E         Full diff:
E         - {
E         -     'choices_template': OrderedDict({
E         + OrderedDict({
E         +     'also_not_in_template': 'foobar2',
E         -         'full_name': 'Raphael Pierzina',
E         ? ----
E         +     'full_name': 'Raphael Pierzina',
E         -         'github_username': 'hackebrot',
E         ? ----
E         +     'github_username': 'hackebrot',
E         +     'not_in_template': 'foobar',
E         +     'orientation': 'landscape',
E         -         'orientation': [
E         -             'landscape',
E         -             'all',
E         -             'portrait',
E         -         ],
E         -         'project_name': 'Kivy Project',
E         ? ----
E         +     'project_name': 'Kivy Project',
E         -         'repo_name': '{{cookiecutter.project_name|lower}}',
E         ? ----
E         +     'repo_name': '{{cookiecutter.project_name|lower}}',
E         + })
E         -     }),
E         - }

tests/test_generate_context.py:109: AssertionError

test_generate_context.py::test_generate_context_decodes_non_ascii_chars

test_generate_context.py::test_generate_context_decodes_non_ascii_chars
def test_generate_context_decodes_non_ascii_chars():
        """Verify `generate_context` correctly decodes non-ascii chars."""
        expected_context = {
            'non_ascii': OrderedDict(
                [
                    ('full_name', 'éèà'),
                ]
            )
        }

        generated_context = generate.generate_context(
            context_file='tests/test-generate-context/non_ascii.json'
        )

>       assert generated_context == expected_context
E       AssertionError: assert OrderedDict([('full_name', 'éèà')]) == {'non_ascii': OrderedDict([('full_name', 'éèà')])}
E         
E         Left contains 1 more item:
E         {'full_name': 'éèà'}
E         Right contains 1 more item:
E         {'non_ascii': OrderedDict([('full_name', 'éèà')])}
E         
E         Full diff:
E         + OrderedDict({
E         - {
E         -     'non_ascii': OrderedDict({
E         -         'full_name': 'éèà',
E         ? ----
E         +     'full_name': 'éèà',
E         + })
E         -     }),
E         - }

tests/test_generate_context.py:126: AssertionError

test_generate_context.py::test_apply_overwrites_does_include_unused_variables

test_generate_context.py::test_apply_overwrites_does_include_unused_variables
template_context = OrderedDict([('full_name', 'Raphael Pierzina'), ('github_username', 'hackebrot'), ('project_name', 'Kivy Project'), ('repo_name', '{{cookiecutter.project_name|lower}}'), ('orientation', ['all', 'landscape', 'portrait']), ('deployment_regions', ['eu', 'us', 'ap']), ('deployments', {'preprod': ['eu', 'us', 'ap'], 'prod': ['eu', 'us', 'ap']}), ('not in template', 'foobar')])

    def test_apply_overwrites_does_include_unused_variables(template_context):
        """Verify `apply_overwrites_to_context` skips variables that are not in context."""
        generate.apply_overwrites_to_context(
            context=template_context, overwrite_context={'not in template': 'foobar'}
        )

>       assert 'not in template' not in template_context
E       AssertionError: assert 'not in template' not in OrderedDict([('full_name', 'Raphael Pierzina'), ('github_username', 'hackebrot'), ('project_name', 'Kivy Project'), ('repo_name', '{{cookiecutter.project_name|lower}}'), ('orientation', ['all', 'landscape', 'portrait']), ('deployment_regions', ['eu', 'us', 'ap']), ('deployments', {'preprod': ['eu', 'us', 'ap'], 'prod': ['eu', 'us', 'ap']}), ('not in template', 'foobar')])

tests/test_generate_context.py:157: AssertionError

test_generate_context.py::test_apply_overwrites_does_not_modify_choices_for_invalid_overwrite

test_generate_context.py::test_apply_overwrites_does_not_modify_choices_for_invalid_overwrite
def test_apply_overwrites_does_not_modify_choices_for_invalid_overwrite():
        """Verify variables overwrite for list if variable not in list ignored."""
        expected_context = {
            'choices_template': OrderedDict(
                [
                    ('full_name', 'Raphael Pierzina'),
                    ('github_username', 'hackebrot'),
                    ('project_name', 'Kivy Project'),
                    ('repo_name', '{{cookiecutter.project_name|lower}}'),
                    ('orientation', ['all', 'landscape', 'portrait']),
                ]
            )
        }

>       with pytest.warns(UserWarning, match="Invalid default received"):
E       Failed: DID NOT WARN. No warnings of type (,) were emitted.
E        Emitted warnings: [].

tests/test_generate_context.py:183: Failed

test_generate_context.py::test_apply_overwrites_invalid_overwrite

test_generate_context.py::test_apply_overwrites_invalid_overwrite
template_context = OrderedDict([('full_name', 'Raphael Pierzina'), ('github_username', 'hackebrot'), ('project_name', 'Kivy Project'), ('repo_name', '{{cookiecutter.project_name|lower}}'), ('orientation', 'foobar'), ('deployment_regions', ['eu', 'us', 'ap']), ('deployments', {'preprod': ['eu', 'us', 'ap'], 'prod': ['eu', 'us', 'ap']})])

    def test_apply_overwrites_invalid_overwrite(template_context):
        """Verify variables overwrite for list if variable not in list not ignored."""
>       with pytest.raises(ValueError):
E       Failed: DID NOT RAISE 

tests/test_generate_context.py:202: Failed

test_generate_context.py::test_apply_overwrites_sets_multichoice_values

test_generate_context.py::test_apply_overwrites_sets_multichoice_values
template_context = OrderedDict([('full_name', 'Raphael Pierzina'), ('github_username', 'hackebrot'), ('project_name', 'Kivy Project'), ('repo_name', '{{cookiecutter.project_name|lower}}'), ('orientation', ['all', 'landscape', 'portrait']), ('deployment_regions', ['eu', 'us', 'ap', 'eu']), ('deployments', {'preprod': ['eu', 'us', 'ap'], 'prod': ['eu', 'us', 'ap']})])

    def test_apply_overwrites_sets_multichoice_values(template_context):
        """Verify variable overwrite for list given multiple valid values."""
        generate.apply_overwrites_to_context(
            context=template_context,
            overwrite_context={'deployment_regions': ['eu']},
        )
>       assert template_context['deployment_regions'] == ['eu']
E       AssertionError: assert ['eu', 'us', 'ap', 'eu'] == ['eu']
E         
E         Left contains 3 more items, first extra item: 'us'
E         
E         Full diff:
E           [
E               'eu',
E         +     'us',
E         +     'ap',
E         +     'eu',
E           ]

tests/test_generate_context.py:214: AssertionError

test_generate_context.py::test_apply_overwrites_invalid_multichoice_values

test_generate_context.py::test_apply_overwrites_invalid_multichoice_values
template_context = OrderedDict([('full_name', 'Raphael Pierzina'), ('github_username', 'hackebrot'), ('project_name', 'Kivy Project'), ('repo_name', '{{cookiecutter.project_name|lower}}'), ('orientation', ['all', 'landscape', 'portrait']), ('deployment_regions', ['eu', 'us', 'ap', 'na']), ('deployments', {'preprod': ['eu', 'us', 'ap'], 'prod': ['eu', 'us', 'ap']})])

    def test_apply_overwrites_invalid_multichoice_values(template_context):
        """Verify variable overwrite for list given invalid list entries not ignored."""
>       with pytest.raises(ValueError):
E       Failed: DID NOT RAISE 

tests/test_generate_context.py:219: Failed

test_generate_context.py::test_apply_overwrites_error_additional_values

test_generate_context.py::test_apply_overwrites_error_additional_values
template_context = OrderedDict([('full_name', 'Raphael Pierzina'), ('github_username', 'hackebrot'), ('project_name', 'Kivy Project'), ('repo_name', '{{cookiecutter.project_name|lower}}'), ('orientation', ['all', 'landscape', 'portrait']), ('deployment_regions', ['eu', 'us', 'ap', 'eu', 'na']), ('deployments', {'preprod': ['eu', 'us', 'ap'], 'prod': ['eu', 'us', 'ap']})])

    def test_apply_overwrites_error_additional_values(template_context):
        """Verify variable overwrite for list given additional entries not ignored."""
>       with pytest.raises(ValueError):
E       Failed: DID NOT RAISE 

tests/test_generate_context.py:228: Failed

test_generate_context.py::test_apply_overwrites_in_dictionaries

test_generate_context.py::test_apply_overwrites_in_dictionaries
template_context = OrderedDict([('full_name', 'Raphael Pierzina'), ('github_username', 'hackebrot'), ('project_name', 'Kivy Project'), ('repo_name', '{{cookiecutter.project_name|lower}}'), ('orientation', ['all', 'landscape', 'portrait']), ('deployment_regions', ['eu', 'us', 'ap']), ('deployments', {'preprod': ['eu', 'us', 'ap', 'eu'], 'prod': ['eu', 'us', 'ap', 'ap']})])

    def test_apply_overwrites_in_dictionaries(template_context):
        """Verify variable overwrite for lists nested in dictionary variables."""
        generate.apply_overwrites_to_context(
            context=template_context,
            overwrite_context={'deployments': {'preprod': ['eu'], 'prod': ['ap']}},
        )
>       assert template_context['deployments']['preprod'] == ['eu']
E       AssertionError: assert ['eu', 'us', 'ap', 'eu'] == ['eu']
E         
E         Left contains 3 more items, first extra item: 'us'
E         
E         Full diff:
E           [
E               'eu',
E         +     'us',
E         +     'ap',
E         +     'eu',
E           ]

tests/test_generate_context.py:241: AssertionError

test_generate_context.py::test_apply_overwrites_sets_default_for_choice_variable

test_generate_context.py::test_apply_overwrites_sets_default_for_choice_variable
template_context = OrderedDict([('full_name', 'Raphael Pierzina'), ('github_username', 'hackebrot'), ('project_name', 'Kivy Project'), ('repo_name', '{{cookiecutter.project_name|lower}}'), ('orientation', 'landscape'), ('deployment_regions', ['eu', 'us', 'ap']), ('deployments', {'preprod': ['eu', 'us', 'ap'], 'prod': ['eu', 'us', 'ap']})])

    def test_apply_overwrites_sets_default_for_choice_variable(template_context):
        """Verify overwritten list member became a default value."""
        generate.apply_overwrites_to_context(
            context=template_context, overwrite_context={'orientation': 'landscape'}
        )

>       assert template_context['orientation'] == ['landscape', 'all', 'portrait']
E       AssertionError: assert 'landscape' == ['landscape', 'all', 'portrait']

tests/test_generate_context.py:251: AssertionError

test_generate_context.py::test_apply_overwrites_in_nested_dict

test_generate_context.py::test_apply_overwrites_in_nested_dict
def test_apply_overwrites_in_nested_dict():
        """Verify nested dict in default content settings are correctly replaced."""
        expected_context = {
            'nested_dict': OrderedDict(
                [
                    ('full_name', 'Raphael Pierzina'),
                    ('github_username', 'hackebrot'),
                    (
                        'project',
                        OrderedDict(
                            [
                                ('name', 'My Kivy Project'),
                                ('description', 'My Kivy Project'),
                                ('repo_name', '{{cookiecutter.project_name|lower}}'),
                                ('orientation', ["all", "landscape", "portrait"]),
                            ]
                        ),
                    ),
                ]
            )
        }

        generated_context = generate.generate_context(
            context_file='tests/test-generate-context/nested_dict.json',
            default_context={
                'not_in_template': 'foobar',
                'project': {
                    'description': 'My Kivy Project',
                },
            },
            extra_context={
                'also_not_in_template': 'foobar2',
                'github_username': 'hackebrot',
                'project': {
                    'name': 'My Kivy Project',
                },
            },
        )

>       assert generated_context == expected_context
E       AssertionError: assert OrderedDict([('full_name', 'Raphael Pierzina'), ('github_username', 'hackebrot'), ('project', OrderedDict([('name', 'My Kivy Project'), ('description', 'My Kivy Project'), ('repo_name', '{{cookiecutter.project_name|lower}}'), ('orientation', ['all', 'landscape', 'portrait'])])), ('not_in_template', 'foobar'), ('also_not_in_template', 'foobar2')]) == {'nested_dict': OrderedDict([('full_name', 'Raphael Pierzina'), ('github_username', 'hackebrot'), ('project', OrderedDict([('name', 'My Kivy Project'), ('description', 'My Kivy Project'), ('repo_name', '{{cookiecutter.project_name|lower}}'), ('orientation', ['all', 'landscape', 'portrait'])]))])}
E         
E         Left contains 5 more items:
E         {'also_not_in_template': 'foobar2',
E          'full_name': 'Raphael Pierzina',
E          'github_username': 'hackebrot',
E          'not_in_template': 'foobar',
E          'project': OrderedDict([('name', 'My Kivy Project'),
E                                  ('description', 'My Kivy Project'),
E                                  ('repo_name', '{{cookiecutter.project_name|lower}}'),
E                                  ('orientation', ['all', 'landscape', 'portrait'])])}
E         Right contains 1 more item:
E         {'nested_dict': OrderedDict([('full_name', 'Raphael Pierzina'),
E                                      ('github_username', 'hackebrot'),
E                                      ('project',
E                                       OrderedDict([('name', 'My Kivy Project'),
E                                                    ('description', 'My Kivy Project'),
E                                                    ('repo_name',
E                                                     '{{cookiecutter.project_name|lower}}'),
E                                                    ('orientation',
E                                                     ['all',
E                                                      'landscape',
E                                                      'portrait'])]))])}
E         
E         Full diff:
E         - {
E         -     'nested_dict': OrderedDict({
E         + OrderedDict({
E         +     'also_not_in_template': 'foobar2',
E         -         'full_name': 'Raphael Pierzina',
E         ? ----
E         +     'full_name': 'Raphael Pierzina',
E         -         'github_username': 'hackebrot',
E         ? ----
E         +     'github_username': 'hackebrot',
E         +     'not_in_template': 'foobar',
E         -         'project': OrderedDict({
E         ? ----
E         +     'project': OrderedDict({
E         -             'description': 'My Kivy Project',
E         ? ----
E         +         'description': 'My Kivy Project',
E         -             'name': 'My Kivy Project',
E         ? ----
E         +         'name': 'My Kivy Project',
E         -             'orientation': [
E         ? ----
E         +         'orientation': [
E         -                 'all',
E         ? ----
E         +             'all',
E         -                 'landscape',
E         ? ----
E         +             'landscape',
E         -                 'portrait',
E         ? ----
E         +             'portrait',
E         -             ],
E         ? ----
E         +         ],
E         -             'repo_name': '{{cookiecutter.project_name|lower}}',
E         ? ----
E         +         'repo_name': '{{cookiecutter.project_name|lower}}',
E         -         }),
E               }),
E         - }
E         + })

tests/test_generate_context.py:293: AssertionError

test_generate_context.py::test_apply_overwrites_in_nested_dict_additional_values

test_generate_context.py::test_apply_overwrites_in_nested_dict_additional_values
def test_apply_overwrites_in_nested_dict_additional_values():
        """Verify nested dict in default content settings are correctly added."""
        expected_context = {
            'nested_dict_additional': OrderedDict(
                [
                    ('mainkey1', 'mainvalue1'),
                    (
                        'mainkey2',
                        OrderedDict(
                            [
                                ('subkey1', 'subvalue1'),
                                (
                                    'subkey2',
                                    OrderedDict(
                                        [
                                            ('subsubkey1', 'subsubvalue1'),
                                            ('subsubkey2', 'subsubvalue2_default'),
                                            ('subsubkey3', 'subsubvalue3_extra'),
                                        ]
                                    ),
                                ),
                                ('subkey4', 'subvalue4_default'),
                                ('subkey5', 'subvalue5_extra'),
                            ]
                        ),
                    ),
                ]
            )
        }

        generated_context = generate.generate_context(
            context_file='tests/test-generate-context/nested_dict_additional.json',
            default_context={
                'not_in_template': 'foobar',
                'mainkey2': {
                    'subkey2': {
                        'subsubkey2': 'subsubvalue2_default',
                    },
                    'subkey4': 'subvalue4_default',
                },
            },
            extra_context={
                'also_not_in_template': 'foobar2',
                'mainkey2': {
                    'subkey2': {
                        'subsubkey3': 'subsubvalue3_extra',
                    },
                    'subkey5': 'subvalue5_extra',
                },
            },
        )

>       assert generated_context == expected_context
E       AssertionError: assert OrderedDict([('mainkey1', 'mainvalue1'), ('mainkey2', OrderedDict([('subkey1', 'subvalue1'), ('subkey2', OrderedDict([('subsubkey1', 'subsubvalue1'), ('subsubkey2', 'subsubvalue2_default'), ('subsubkey3', 'subsubvalue3_extra')])), ('subkey4', 'subvalue4_default'), ('subkey5', 'subvalue5_extra')])), ('not_in_template', 'foobar'), ('also_not_in_template', 'foobar2')]) == {'nested_dict_additional': OrderedDict([('mainkey1', 'mainvalue1'), ('mainkey2', OrderedDict([('subkey1', 'subvalue1'), ('subkey2', OrderedDict([('subsubkey1', 'subsubvalue1'), ('subsubkey2', 'subsubvalue2_default'), ('subsubkey3', 'subsubvalue3_extra')])), ('subkey4', 'subvalue4_default'), ('subkey5', 'subvalue5_extra')]))])}
E         
E         Left contains 4 more items:
E         {'also_not_in_template': 'foobar2',
E          'mainkey1': 'mainvalue1',
E          'mainkey2': OrderedDict([('subkey1', 'subvalue1'),
E                                   ('subkey2',
E                                    OrderedDict([('subsubkey1', 'subsubvalue1'),
E                                                 ('subsubkey2', 'subsubvalue2_default'),
E                                                 ('subsubkey3', 'subsubvalue3_extra')])),
E                                   ('subkey4', 'subvalue4_default'),
E                                   ('subkey5', 'subvalue5_extra')]),
E          'not_in_template': 'foobar'}
E         Right contains 1 more item:
E         {'nested_dict_additional': OrderedDict([('mainkey1', 'mainvalue1'),
E                                                 ('mainkey2',
E                                                  OrderedDict([('subkey1', 'subvalue1'),
E                                                               ('subkey2',
E                                                                OrderedDict([('subsubkey1',
E                                                                              'subsubvalue1'),
E                                                                             ('subsubkey2',
E                                                                              'subsubvalue2_default'),
E                                                                             ('subsubkey3',
E                                                                              'subsubvalue3_extra')])),
E                                                               ('subkey4',
E                                                                'subvalue4_default'),
E                                                               ('subkey5',
E                                                                'subvalue5_extra')]))])}
E         
E         Full diff:
E         - {
E         -     'nested_dict_additional': OrderedDict({
E         + OrderedDict({
E         +     'also_not_in_template': 'foobar2',
E         -         'mainkey1': 'mainvalue1',
E         ? ----
E         +     'mainkey1': 'mainvalue1',
E         -         'mainkey2': OrderedDict({
E         ? ----
E         +     'mainkey2': OrderedDict({
E         -             'subkey1': 'subvalue1',
E         ? ----
E         +         'subkey1': 'subvalue1',
E         -             'subkey2': OrderedDict({
E         ? ----
E         +         'subkey2': OrderedDict({
E         -                 'subsubkey1': 'subsubvalue1',
E         ? ----
E         +             'subsubkey1': 'subsubvalue1',
E         -                 'subsubkey2': 'subsubvalue2_default',
E         ? ----
E         +             'subsubkey2': 'subsubvalue2_default',
E         -                 'subsubkey3': 'subsubvalue3_extra',
E         ? ----
E         +             'subsubkey3': 'subsubvalue3_extra',
E         -             }),
E         -             'subkey4': 'subvalue4_default',
E         -             'subkey5': 'subvalue5_extra',
E                   }),
E         +         'subkey4': 'subvalue4_default',
E         +         'subkey5': 'subvalue5_extra',
E               }),
E         - }
E         +     'not_in_template': 'foobar',
E         + })

tests/test_generate_context.py:364: AssertionError

test_generate_copy_without_render.py::test_generate_copy_without_render_extensions

test_generate_copy_without_render.py::test_generate_copy_without_render_extensions
@pytest.mark.usefixtures('clean_system', 'remove_test_dir')
    def test_generate_copy_without_render_extensions():
        """Verify correct work of `_copy_without_render` context option.

        Some files/directories should be rendered during invocation,
        some just copied, without any modification.
        """
>       generate.generate_files(
            context={
                'cookiecutter': {
                    'repo_name': 'test_copy_without_render',
                    'render_test': 'I have been rendered!',
                    '_copy_without_render': [
                        '*not-rendered',
                        'rendered/not_rendered.yml',
                        '*.txt',
                        '{{cookiecutter.repo_name}}-rendered/README.md',
                    ],
                }
            },
            repo_dir='tests/test-generate-copy-without-render',
        )

tests/test_generate_copy_without_render.py:26: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/test-generate-copy-without-render'
context = {'cookiecutter': {'_copy_without_render': ['*not-rendered', 'rendered/not_rendered.yml', '*.txt', '{{cookiecutter.repo_name}}-rendered/README.md'], 'render_test': 'I have been rendered!', 'repo_name': 'test_copy_without_render'}}
output_dir = '.', overwrite_if_exists = False, skip_if_file_exists = False
accept_hooks = True, keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_copy_without_render_override.py::test_generate_copy_without_render_extensions

test_generate_copy_without_render_override.py::test_generate_copy_without_render_extensions
@pytest.mark.usefixtures('clean_system', 'remove_test_dir')
    def test_generate_copy_without_render_extensions():
        """Verify correct work of `_copy_without_render` context option.

        Some files/directories should be rendered during invocation,
        some just copied, without any modification.
        """
        # first run
>       generate.generate_files(
            context={
                'cookiecutter': {
                    'repo_name': 'test_copy_without_render',
                    'render_test': 'I have been rendered!',
                    '_copy_without_render': [
                        '*not-rendered',
                        'rendered/not_rendered.yml',
                        '*.txt',
                        '{{cookiecutter.repo_name}}-rendered/README.md',
                    ],
                }
            },
            repo_dir='tests/test-generate-copy-without-render-override',
        )

tests/test_generate_copy_without_render_override.py:27: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/test-generate-copy-without-render-override'
context = {'cookiecutter': {'_copy_without_render': ['*not-rendered', 'rendered/not_rendered.yml', '*.txt', '{{cookiecutter.repo_name}}-rendered/README.md'], 'render_test': 'I have been rendered!', 'repo_name': 'test_copy_without_render'}}
output_dir = '.', overwrite_if_exists = False, skip_if_file_exists = False
accept_hooks = True, keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_file.py::test_generate_file_with_false_condition

test_generate_file.py::test_generate_file_with_false_condition
env = 

    def test_generate_file_with_false_condition(env):
        """Verify correct work of boolean condition in file name on file generation.

        This test has negative answer, so file should not be rendered.
        """
        infile = (
            'tests/files/{% if cookiecutter.generate_file == \'y\' %}cheese.txt{% endif %}'
        )
>       generate.generate_file(
            project_dir=".",
            infile=infile,
            context={'cookiecutter': {'generate_file': 'n'}},
            env=env,
        )

tests/test_generate_file.py:110: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

project_dir = '.'
infile = "tests/files/{% if cookiecutter.generate_file == 'y' %}cheese.txt{% endif %}"
context = {'cookiecutter': {'generate_file': 'n'}}
env = 
skip_if_file_exists = False

    def generate_file(project_dir, infile, context, env, skip_if_file_exists=False
        ):
        """Render filename of infile as name of outfile, handle infile correctly.

        Dealing with infile appropriately:

            a. If infile is a binary file, copy it over without rendering.
            b. If infile is a text file, render its contents and write the
               rendered infile to outfile.

        Precondition:

            When calling `generate_file()`, the root template dir must be the
            current working directory. Using `utils.work_in()` is the recommended
            way to perform this directory change.

        :param project_dir: Absolute path to the resulting generated project.
        :param infile: Input file to generate the file from. Relative to the root
            template dir.
        :param context: Dict for populating the cookiecutter's variables.
        :param env: Jinja2 template execution environment.
        """
        logger.debug('Generating file %s', infile)

        # Render the path to the output file (not including the root project dir)
        outfile_tmpl = env.from_string(infile)
        outfile = outfile_tmpl.render(**context)
        outfile_path = os.path.join(project_dir, outfile)

        # Check if we should skip this file
        if skip_if_file_exists and os.path.exists(outfile_path):
            logger.debug('File %s already exists, skipping', outfile)
            return False

        # Ensure output directory exists
        dirname = os.path.dirname(outfile_path)
        make_sure_path_exists(dirname)

        # Just copy over binary files without rendering
        if is_binary(infile):
            shutil.copyfile(infile, outfile_path)
        else:
            # Force fwd slashes on Windows for jinja template
            infile_fwd_slashes = infile.replace(os.path.sep, '/')

            try:
                tmpl = env.get_template(infile_fwd_slashes)
                rendered_file = tmpl.render(**context)
>               with open(outfile_path, 'w', encoding='utf-8') as fh:
E               IsADirectoryError: [Errno 21] Is a directory: './tests/files/'

cookiecutter/generate.py:133: IsADirectoryError

test_generate_file.py::test_generate_file_verbose_template_syntax_error

test_generate_file.py::test_generate_file_verbose_template_syntax_error
project_dir = '.', infile = 'tests/files/syntax_error.txt'
context = {'syntax_error': 'syntax_error'}
env = 
skip_if_file_exists = False

    def generate_file(project_dir, infile, context, env, skip_if_file_exists=False
        ):
        """Render filename of infile as name of outfile, handle infile correctly.

        Dealing with infile appropriately:

            a. If infile is a binary file, copy it over without rendering.
            b. If infile is a text file, render its contents and write the
               rendered infile to outfile.

        Precondition:

            When calling `generate_file()`, the root template dir must be the
            current working directory. Using `utils.work_in()` is the recommended
            way to perform this directory change.

        :param project_dir: Absolute path to the resulting generated project.
        :param infile: Input file to generate the file from. Relative to the root
            template dir.
        :param context: Dict for populating the cookiecutter's variables.
        :param env: Jinja2 template execution environment.
        """
        logger.debug('Generating file %s', infile)

        # Render the path to the output file (not including the root project dir)
        outfile_tmpl = env.from_string(infile)
        outfile = outfile_tmpl.render(**context)
        outfile_path = os.path.join(project_dir, outfile)

        # Check if we should skip this file
        if skip_if_file_exists and os.path.exists(outfile_path):
            logger.debug('File %s already exists, skipping', outfile)
            return False

        # Ensure output directory exists
        dirname = os.path.dirname(outfile_path)
        make_sure_path_exists(dirname)

        # Just copy over binary files without rendering
        if is_binary(infile):
            shutil.copyfile(infile, outfile_path)
        else:
            # Force fwd slashes on Windows for jinja template
            infile_fwd_slashes = infile.replace(os.path.sep, '/')

            try:
>               tmpl = env.get_template(infile_fwd_slashes)

cookiecutter/generate.py:131: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.10/site-packages/jinja2/environment.py:1013: in get_template
    return self._load_template(name, globals)
.venv/lib/python3.10/site-packages/jinja2/environment.py:972: in _load_template
    template = self.loader.load(self, name, self.make_globals(globals))
.venv/lib/python3.10/site-packages/jinja2/loaders.py:138: in load
    code = environment.compile(source, name, filename)
.venv/lib/python3.10/site-packages/jinja2/environment.py:768: in compile
    self.handle_exception(source=source_hint)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = 
source = 'I eat {{ syntax_error }} {# this comment is not closed}\n'

    def handle_exception(self, source: t.Optional[str] = None) -> "te.NoReturn":
        """Exception handling helper.  This is used internally to either raise
        rewritten exceptions or return a rendered traceback for the template.
        """
        from .debug import rewrite_traceback_stack

>       raise rewrite_traceback_stack(source=source)
E       jinja2.exceptions.TemplateSyntaxError: Missing end of comment tag

.venv/lib/python3.10/site-packages/jinja2/environment.py:939: TemplateSyntaxError

During handling of the above exception, another exception occurred:

env = 
expected_msg_regex = re.compile('Missing end of comment tag\n {2}File "(.[/\\\\])*tests[/\\\\]files[/\\\\]syntax_error.txt", line 1\n {4}I eat {{ syntax_error }} {# this comment is not closed}')

    def test_generate_file_verbose_template_syntax_error(env, expected_msg_regex):
        """Verify correct exception raised on syntax error in file before generation."""
        with pytest.raises(TemplateSyntaxError) as exception:
>           generate.generate_file(
                project_dir=".",
                infile='tests/files/syntax_error.txt',
                context={'syntax_error': 'syntax_error'},
                env=env,
            )

tests/test_generate_file.py:132: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

project_dir = '.', infile = 'tests/files/syntax_error.txt'
context = {'syntax_error': 'syntax_error'}
env = 
skip_if_file_exists = False

    def generate_file(project_dir, infile, context, env, skip_if_file_exists=False
        ):
        """Render filename of infile as name of outfile, handle infile correctly.

        Dealing with infile appropriately:

            a. If infile is a binary file, copy it over without rendering.
            b. If infile is a text file, render its contents and write the
               rendered infile to outfile.

        Precondition:

            When calling `generate_file()`, the root template dir must be the
            current working directory. Using `utils.work_in()` is the recommended
            way to perform this directory change.

        :param project_dir: Absolute path to the resulting generated project.
        :param infile: Input file to generate the file from. Relative to the root
            template dir.
        :param context: Dict for populating the cookiecutter's variables.
        :param env: Jinja2 template execution environment.
        """
        logger.debug('Generating file %s', infile)

        # Render the path to the output file (not including the root project dir)
        outfile_tmpl = env.from_string(infile)
        outfile = outfile_tmpl.render(**context)
        outfile_path = os.path.join(project_dir, outfile)

        # Check if we should skip this file
        if skip_if_file_exists and os.path.exists(outfile_path):
            logger.debug('File %s already exists, skipping', outfile)
            return False

        # Ensure output directory exists
        dirname = os.path.dirname(outfile_path)
        make_sure_path_exists(dirname)

        # Just copy over binary files without rendering
        if is_binary(infile):
            shutil.copyfile(infile, outfile_path)
        else:
            # Force fwd slashes on Windows for jinja template
            infile_fwd_slashes = infile.replace(os.path.sep, '/')

            try:
                tmpl = env.get_template(infile_fwd_slashes)
                rendered_file = tmpl.render(**context)
                with open(outfile_path, 'w', encoding='utf-8') as fh:
                    fh.write(rendered_file)
            except (TemplateSyntaxError, UndefinedError) as e:
>               raise UndefinedVariableInTemplate(str(e), context=context, template=infile)
E               TypeError: UndefinedVariableInTemplate.__init__() got an unexpected keyword argument 'template'

cookiecutter/generate.py:136: TypeError

test_generate_file.py::test_generate_file_does_not_translate_crlf_newlines_to_lf

test_generate_file.py::test_generate_file_does_not_translate_crlf_newlines_to_lf
env = 

    def test_generate_file_does_not_translate_crlf_newlines_to_lf(env):
        """Verify that file generation use same line ending, as in source file."""
        infile = 'tests/files/{{cookiecutter.generate_file}}_crlf_newlines.txt'
        generate.generate_file(
            project_dir=".",
            infile=infile,
            context={'cookiecutter': {'generate_file': 'cheese'}},
            env=env,
        )

        # this generated file should have a CRLF line ending
        gf = 'tests/files/cheese_crlf_newlines.txt'
        with Path(gf).open(encoding='utf-8', newline='') as f:
            simple_text = f.readline()
>       assert simple_text == 'newline is CRLF\r\n'
E       AssertionError: assert 'newline is CRLF\n' == 'newline is CRLF\r\n'
E         
E         - newline is CRLF
E         ?                -
E         + newline is CRLF

tests/test_generate_file.py:173: AssertionError

test_generate_files.py::test_generate_files_nontemplated_exception

test_generate_files.py::test_generate_files_nontemplated_exception
tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_generate_files_nontemplat0')

    def test_generate_files_nontemplated_exception(tmp_path):
        """
        Verify `generate_files` raises when no directories to render exist.

        Note: Check `tests/test-generate-files-nontemplated` location to understand.
        """
        with pytest.raises(exceptions.NonTemplatedInputDirException):
>           generate.generate_files(
                context={'cookiecutter': {'food': 'pizza'}},
                repo_dir='tests/test-generate-files-nontemplated',
                output_dir=tmp_path,
            )

tests/test_generate_files.py:22: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/test-generate-files-nontemplated'
context = {'cookiecutter': {'food': 'pizza'}}
output_dir = PosixPath('/tmp/pytest-of-root/pytest-0/test_generate_files_nontemplat0')
overwrite_if_exists = False, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_files.py::test_generate_files

test_generate_files.py::test_generate_files
tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_generate_files0')

    def test_generate_files(tmp_path):
        """Verify directory name correctly rendered with unicode containing context."""
>       generate.generate_files(
            context={'cookiecutter': {'food': 'pizzä'}},
            repo_dir='tests/test-generate-files',
            output_dir=tmp_path,
        )

tests/test_generate_files.py:31: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/test-generate-files'
context = {'cookiecutter': {'food': 'pizzä'}}
output_dir = PosixPath('/tmp/pytest-of-root/pytest-0/test_generate_files0')
overwrite_if_exists = False, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_files.py::test_generate_files_with_linux_newline

test_generate_files.py::test_generate_files_with_linux_newline
tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_generate_files_with_linux0')

    def test_generate_files_with_linux_newline(tmp_path):
        """Verify new line not removed by templating engine after folder generation."""
>       generate.generate_files(
            context={'cookiecutter': {'food': 'pizzä'}},
            repo_dir='tests/test-generate-files',
            output_dir=tmp_path,
        )

tests/test_generate_files.py:47: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/test-generate-files'
context = {'cookiecutter': {'food': 'pizzä'}}
output_dir = PosixPath('/tmp/pytest-of-root/pytest-0/test_generate_files_with_linux0')
overwrite_if_exists = False, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_files.py::test_generate_files_with_jinja2_environment

test_generate_files.py::test_generate_files_with_jinja2_environment
tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_generate_files_with_jinja0')

    def test_generate_files_with_jinja2_environment(tmp_path):
        """Extend StrictEnvironment with _jinja2_env_vars cookiecutter template option."""
>       generate.generate_files(
            context={
                'cookiecutter': {
                    'food': 'pizzä',
                    '_jinja2_env_vars': {'lstrip_blocks': True, 'trim_blocks': True},
                }
            },
            repo_dir='tests/test-generate-files',
            output_dir=tmp_path,
        )

tests/test_generate_files.py:65: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/test-generate-files'
context = {'cookiecutter': {'_jinja2_env_vars': {'lstrip_blocks': True, 'trim_blocks': True}, 'food': 'pizzä'}}
output_dir = PosixPath('/tmp/pytest-of-root/pytest-0/test_generate_files_with_jinja0')
overwrite_if_exists = False, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_files.py::test_generate_files_with_trailing_newline_forced_to_linux_by_context

test_generate_files.py::test_generate_files_with_trailing_newline_forced_to_linux_by_context
tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_generate_files_with_trail0')

    def test_generate_files_with_trailing_newline_forced_to_linux_by_context(tmp_path):
        """Verify new line not removed by templating engine after folder generation."""
>       generate.generate_files(
            context={'cookiecutter': {'food': 'pizzä', '_new_lines': '\r\n'}},
            repo_dir='tests/test-generate-files',
            output_dir=tmp_path,
        )

tests/test_generate_files.py:86: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/test-generate-files'
context = {'cookiecutter': {'_new_lines': '\r\n', 'food': 'pizzä'}}
output_dir = PosixPath('/tmp/pytest-of-root/pytest-0/test_generate_files_with_trail0')
overwrite_if_exists = False, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_files.py::test_generate_files_with_windows_newline

test_generate_files.py::test_generate_files_with_windows_newline
tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_generate_files_with_windo0')

    def test_generate_files_with_windows_newline(tmp_path):
        """Verify windows source line end not changed during files generation."""
>       generate.generate_files(
            context={'cookiecutter': {'food': 'pizzä'}},
            repo_dir='tests/test-generate-files',
            output_dir=tmp_path,
        )

tests/test_generate_files.py:105: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/test-generate-files'
context = {'cookiecutter': {'food': 'pizzä'}}
output_dir = PosixPath('/tmp/pytest-of-root/pytest-0/test_generate_files_with_windo0')
overwrite_if_exists = False, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_files.py::test_generate_files_with_windows_newline_forced_to_linux_by_context

test_generate_files.py::test_generate_files_with_windows_newline_forced_to_linux_by_context
tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_generate_files_with_windo1')

    def test_generate_files_with_windows_newline_forced_to_linux_by_context(tmp_path):
        """Verify windows line end changed to linux during files generation."""
>       generate.generate_files(
            context={'cookiecutter': {'food': 'pizzä', '_new_lines': '\n'}},
            repo_dir='tests/test-generate-files',
            output_dir=tmp_path,
        )

tests/test_generate_files.py:123: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/test-generate-files'
context = {'cookiecutter': {'_new_lines': '\n', 'food': 'pizzä'}}
output_dir = PosixPath('/tmp/pytest-of-root/pytest-0/test_generate_files_with_windo1')
overwrite_if_exists = False, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_files.py::test_generate_files_binaries

test_generate_files.py::test_generate_files_binaries
tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_generate_files_binaries0')

    def test_generate_files_binaries(tmp_path):
        """Verify binary files created during directory generation."""
>       generate.generate_files(
            context={'cookiecutter': {'binary_test': 'binary_files'}},
            repo_dir='tests/test-generate-binaries',
            output_dir=tmp_path,
        )

tests/test_generate_files.py:142: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/test-generate-binaries'
context = {'cookiecutter': {'binary_test': 'binary_files'}}
output_dir = PosixPath('/tmp/pytest-of-root/pytest-0/test_generate_files_binaries0')
overwrite_if_exists = False, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_files.py::test_generate_files_absolute_path

test_generate_files.py::test_generate_files_absolute_path
tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_generate_files_absolute_p0')

    def test_generate_files_absolute_path(tmp_path):
        """Verify usage of absolute path does not change files generation behaviour."""
>       generate.generate_files(
            context={'cookiecutter': {'food': 'pizzä'}},
            repo_dir=Path('tests/test-generate-files').absolute(),
            output_dir=tmp_path,
        )

tests/test_generate_files.py:163: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = PosixPath('/testbed/tests/test-generate-files')
context = {'cookiecutter': {'food': 'pizzä'}}
output_dir = PosixPath('/tmp/pytest-of-root/pytest-0/test_generate_files_absolute_p0')
overwrite_if_exists = False, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_files.py::test_generate_files_output_dir

test_generate_files.py::test_generate_files_output_dir
tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_generate_files_output_dir0')

    def test_generate_files_output_dir(tmp_path):
        """Verify `output_dir` option for `generate_files` changing location correctly."""
        output_dir = Path(tmp_path, 'custom_output_dir')
        output_dir.mkdir()

>       project_dir = generate.generate_files(
            context={'cookiecutter': {'food': 'pizzä'}},
            repo_dir=Path('tests/test-generate-files').absolute(),
            output_dir=output_dir,
        )

tests/test_generate_files.py:176: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = PosixPath('/testbed/tests/test-generate-files')
context = {'cookiecutter': {'food': 'pizzä'}}
output_dir = PosixPath('/tmp/pytest-of-root/pytest-0/test_generate_files_output_dir0/custom_output_dir')
overwrite_if_exists = False, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_files.py::test_generate_files_permissions

test_generate_files.py::test_generate_files_permissions
tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_generate_files_permission0')

    def test_generate_files_permissions(tmp_path):
        """Verify generates files respect source files permissions.

        simple.txt and script.sh should retain their respective 0o644 and 0o755
        permissions.
        """
>       generate.generate_files(
            context={'cookiecutter': {'permissions': 'permissions'}},
            repo_dir='tests/test-generate-files-permissions',
            output_dir=tmp_path,
        )

tests/test_generate_files.py:193: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/test-generate-files-permissions'
context = {'cookiecutter': {'permissions': 'permissions'}}
output_dir = PosixPath('/tmp/pytest-of-root/pytest-0/test_generate_files_permission0')
overwrite_if_exists = False, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_files.py::test_generate_files_with_overwrite_if_exists_with_skip_if_file_exists

test_generate_files.py::test_generate_files_with_overwrite_if_exists_with_skip_if_file_exists
tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_generate_files_with_overw0')

    def test_generate_files_with_overwrite_if_exists_with_skip_if_file_exists(tmp_path):
        """Verify `skip_if_file_exist` has priority over `overwrite_if_exists`."""
        simple_file = Path(tmp_path, 'inputpizzä/simple.txt')
        simple_with_new_line_file = Path(tmp_path, 'inputpizzä/simple-with-newline.txt')

        Path(tmp_path, 'inputpizzä').mkdir(parents=True)
        with Path(simple_file).open('w') as f:
            f.write('temp')

>       generate.generate_files(
            context={'cookiecutter': {'food': 'pizzä'}},
            repo_dir='tests/test-generate-files',
            overwrite_if_exists=True,
            skip_if_file_exists=True,
            output_dir=tmp_path,
        )

tests/test_generate_files.py:240: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/test-generate-files'
context = {'cookiecutter': {'food': 'pizzä'}}
output_dir = PosixPath('/tmp/pytest-of-root/pytest-0/test_generate_files_with_overw0')
overwrite_if_exists = True, skip_if_file_exists = True, accept_hooks = True
keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_files.py::test_generate_files_with_skip_if_file_exists

test_generate_files.py::test_generate_files_with_skip_if_file_exists
tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_generate_files_with_skip_0')

    def test_generate_files_with_skip_if_file_exists(tmp_path):
        """Verify existed files not removed if error raised with `skip_if_file_exists`."""
        simple_file = Path(tmp_path, 'inputpizzä/simple.txt')
        simple_with_new_line_file = Path(tmp_path, 'inputpizzä/simple-with-newline.txt')

        Path(tmp_path, 'inputpizzä').mkdir(parents=True)
        Path(simple_file).write_text('temp')

        with pytest.raises(exceptions.OutputDirExistsException):
>           generate.generate_files(
                context={'cookiecutter': {'food': 'pizzä'}},
                repo_dir='tests/test-generate-files',
                skip_if_file_exists=True,
                output_dir=tmp_path,
            )

tests/test_generate_files.py:266: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/test-generate-files'
context = {'cookiecutter': {'food': 'pizzä'}}
output_dir = PosixPath('/tmp/pytest-of-root/pytest-0/test_generate_files_with_skip_0')
overwrite_if_exists = False, skip_if_file_exists = True, accept_hooks = True
keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_files.py::test_generate_files_with_overwrite_if_exists

test_generate_files.py::test_generate_files_with_overwrite_if_exists
tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_generate_files_with_overw1')

    def test_generate_files_with_overwrite_if_exists(tmp_path):
        """Verify overwrite_if_exists overwrites old files."""
        simple_file = Path(tmp_path, 'inputpizzä/simple.txt')
        simple_with_new_line_file = Path(tmp_path, 'inputpizzä/simple-with-newline.txt')

        Path(tmp_path, 'inputpizzä').mkdir(parents=True)
        Path(simple_file).write_text('temp')

>       generate.generate_files(
            context={'cookiecutter': {'food': 'pizzä'}},
            repo_dir='tests/test-generate-files',
            overwrite_if_exists=True,
            output_dir=tmp_path,
        )

tests/test_generate_files.py:289: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/test-generate-files'
context = {'cookiecutter': {'food': 'pizzä'}}
output_dir = PosixPath('/tmp/pytest-of-root/pytest-0/test_generate_files_with_overw1')
overwrite_if_exists = True, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_files.py::test_raise_undefined_variable_file_name

test_generate_files.py::test_raise_undefined_variable_file_name
output_dir = '/tmp/pytest-of-root/pytest-0/test_raise_undefined_variable_0/output'
undefined_context = {'cookiecutter': {'github_username': 'hackebrot', 'project_slug': 'testproject'}}

    def test_raise_undefined_variable_file_name(output_dir, undefined_context):
        """Verify correct error raised when file name cannot be rendered."""
        with pytest.raises(exceptions.UndefinedVariableInTemplate) as err:
>           generate.generate_files(
                repo_dir='tests/undefined-variable/file-name/',
                output_dir=output_dir,
                context=undefined_context,
            )

tests/test_generate_files.py:316: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/undefined-variable/file-name/'
context = {'cookiecutter': {'github_username': 'hackebrot', 'project_slug': 'testproject'}}
output_dir = '/tmp/pytest-of-root/pytest-0/test_raise_undefined_variable_0/output'
overwrite_if_exists = False, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_files.py::test_raise_undefined_variable_file_name_existing_project

test_generate_files.py::test_raise_undefined_variable_file_name_existing_project
output_dir = '/tmp/pytest-of-root/pytest-0/test_raise_undefined_variable_1/output'
undefined_context = {'cookiecutter': {'github_username': 'hackebrot', 'project_slug': 'testproject'}}

    def test_raise_undefined_variable_file_name_existing_project(
        output_dir, undefined_context
    ):
        """Verify correct error raised when file name cannot be rendered."""
        testproj_path = Path(output_dir, 'testproject')
        testproj_path.mkdir()

        with pytest.raises(exceptions.UndefinedVariableInTemplate) as err:
>           generate.generate_files(
                repo_dir='tests/undefined-variable/file-name/',
                output_dir=output_dir,
                context=undefined_context,
                overwrite_if_exists=True,
            )

tests/test_generate_files.py:336: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/undefined-variable/file-name/'
context = {'cookiecutter': {'github_username': 'hackebrot', 'project_slug': 'testproject'}}
output_dir = '/tmp/pytest-of-root/pytest-0/test_raise_undefined_variable_1/output'
overwrite_if_exists = True, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_files.py::test_raise_undefined_variable_file_content

test_generate_files.py::test_raise_undefined_variable_file_content
output_dir = '/tmp/pytest-of-root/pytest-0/test_raise_undefined_variable_2/output'
undefined_context = {'cookiecutter': {'github_username': 'hackebrot', 'project_slug': 'testproject'}}

    def test_raise_undefined_variable_file_content(output_dir, undefined_context):
        """Verify correct error raised when file content cannot be rendered."""
        with pytest.raises(exceptions.UndefinedVariableInTemplate) as err:
>           generate.generate_files(
                repo_dir='tests/undefined-variable/file-content/',
                output_dir=output_dir,
                context=undefined_context,
            )

tests/test_generate_files.py:352: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/undefined-variable/file-content/'
context = {'cookiecutter': {'github_username': 'hackebrot', 'project_slug': 'testproject'}}
output_dir = '/tmp/pytest-of-root/pytest-0/test_raise_undefined_variable_2/output'
overwrite_if_exists = False, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_files.py::test_raise_undefined_variable_dir_name

test_generate_files.py::test_raise_undefined_variable_dir_name
output_dir = '/tmp/pytest-of-root/pytest-0/test_raise_undefined_variable_3/output'
undefined_context = {'cookiecutter': {'github_username': 'hackebrot', 'project_slug': 'testproject'}}

    def test_raise_undefined_variable_dir_name(output_dir, undefined_context):
        """Verify correct error raised when directory name cannot be rendered."""
        with pytest.raises(exceptions.UndefinedVariableInTemplate) as err:
>           generate.generate_files(
                repo_dir='tests/undefined-variable/dir-name/',
                output_dir=output_dir,
                context=undefined_context,
            )

tests/test_generate_files.py:367: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/undefined-variable/dir-name/'
context = {'cookiecutter': {'github_username': 'hackebrot', 'project_slug': 'testproject'}}
output_dir = '/tmp/pytest-of-root/pytest-0/test_raise_undefined_variable_3/output'
overwrite_if_exists = False, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_files.py::test_keep_project_dir_on_failure

test_generate_files.py::test_keep_project_dir_on_failure
output_dir = '/tmp/pytest-of-root/pytest-0/test_keep_project_dir_on_failu0/output'
undefined_context = {'cookiecutter': {'github_username': 'hackebrot', 'project_slug': 'testproject'}}

    def test_keep_project_dir_on_failure(output_dir, undefined_context):
        """Verify correct error raised when directory name cannot be rendered."""
        with pytest.raises(exceptions.UndefinedVariableInTemplate):
>           generate.generate_files(
                repo_dir='tests/undefined-variable/dir-name/',
                output_dir=output_dir,
                context=undefined_context,
                keep_project_on_failure=True,
            )

tests/test_generate_files.py:386: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/undefined-variable/dir-name/'
context = {'cookiecutter': {'github_username': 'hackebrot', 'project_slug': 'testproject'}}
output_dir = '/tmp/pytest-of-root/pytest-0/test_keep_project_dir_on_failu0/output'
overwrite_if_exists = False, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = True

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_files.py::test_raise_undefined_variable_dir_name_existing_project

test_generate_files.py::test_raise_undefined_variable_dir_name_existing_project
output_dir = '/tmp/pytest-of-root/pytest-0/test_raise_undefined_variable_4/output'
undefined_context = {'cookiecutter': {'github_username': 'hackebrot', 'project_slug': 'testproject'}}

    def test_raise_undefined_variable_dir_name_existing_project(
        output_dir, undefined_context
    ):
        """Verify correct error raised when directory name cannot be rendered."""
        testproj_path = Path(output_dir, 'testproject')
        testproj_path.mkdir()

        with pytest.raises(exceptions.UndefinedVariableInTemplate) as err:
>           generate.generate_files(
                repo_dir='tests/undefined-variable/dir-name/',
                output_dir=output_dir,
                context=undefined_context,
                overwrite_if_exists=True,
            )

tests/test_generate_files.py:403: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/undefined-variable/dir-name/'
context = {'cookiecutter': {'github_username': 'hackebrot', 'project_slug': 'testproject'}}
output_dir = '/tmp/pytest-of-root/pytest-0/test_raise_undefined_variable_4/output'
overwrite_if_exists = True, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_files.py::test_raise_undefined_variable_project_dir

test_generate_files.py::test_raise_undefined_variable_project_dir
tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_raise_undefined_variable_5')

    def test_raise_undefined_variable_project_dir(tmp_path):
        """Verify correct error raised when directory name cannot be rendered."""
        with pytest.raises(exceptions.UndefinedVariableInTemplate) as err:
>           generate.generate_files(
                repo_dir='tests/undefined-variable/dir-name/',
                output_dir=tmp_path,
                context={},
            )

tests/test_generate_files.py:423: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/undefined-variable/dir-name/', context = {}
output_dir = PosixPath('/tmp/pytest-of-root/pytest-0/test_raise_undefined_variable_5')
overwrite_if_exists = False, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_hooks.py::test_ignore_hooks_dirs

test_generate_hooks.py::test_ignore_hooks_dirs
@pytest.mark.usefixtures('clean_system', 'remove_additional_folders')
    def test_ignore_hooks_dirs():
        """Verify hooks directory not created in target location on files generation."""
>       generate.generate_files(
            context={'cookiecutter': {'pyhooks': 'pyhooks'}},
            repo_dir='tests/test-pyhooks/',
            output_dir='tests/test-pyhooks/',
        )

tests/test_generate_hooks.py:35: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/test-pyhooks/'
context = {'cookiecutter': {'pyhooks': 'pyhooks'}}
output_dir = 'tests/test-pyhooks/', overwrite_if_exists = False
skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_hooks.py::test_run_python_hooks

test_generate_hooks.py::test_run_python_hooks
@pytest.mark.usefixtures('clean_system', 'remove_additional_folders')
    def test_run_python_hooks():
        """Verify pre and post generation python hooks executed and result in output_dir.

        Each hook should create in target directory. Test verifies that these files
        created.
        """
>       generate.generate_files(
            context={'cookiecutter': {'pyhooks': 'pyhooks'}},
            repo_dir='tests/test-pyhooks/',
            output_dir='tests/test-pyhooks/',
        )

tests/test_generate_hooks.py:50: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/test-pyhooks/'
context = {'cookiecutter': {'pyhooks': 'pyhooks'}}
output_dir = 'tests/test-pyhooks/', overwrite_if_exists = False
skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_hooks.py::test_run_python_hooks_cwd

test_generate_hooks.py::test_run_python_hooks_cwd
@pytest.mark.usefixtures('clean_system', 'remove_additional_folders')
    def test_run_python_hooks_cwd():
        """Verify pre and post generation python hooks executed and result in current dir.

        Each hook should create in target directory. Test verifies that these files
        created.
        """
>       generate.generate_files(
            context={'cookiecutter': {'pyhooks': 'pyhooks'}}, repo_dir='tests/test-pyhooks/'
        )

tests/test_generate_hooks.py:66: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/test-pyhooks/'
context = {'cookiecutter': {'pyhooks': 'pyhooks'}}, output_dir = '.'
overwrite_if_exists = False, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_hooks.py::test_empty_hooks

test_generate_hooks.py::test_empty_hooks
@pytest.mark.skipif(WINDOWS, reason='OSError.errno=8 is not thrown on Windows')
    @pytest.mark.usefixtures('clean_system', 'remove_additional_folders')
    def test_empty_hooks():
        """Verify error is raised on empty hook script. Ignored on windows.

        OSError.errno=8 is not thrown on Windows when the script is empty
        because it always runs through shell instead of needing a shebang.
        """
        with pytest.raises(FailedHookException) as excinfo:
>           generate.generate_files(
                context={'cookiecutter': {'shellhooks': 'shellhooks'}},
                repo_dir='tests/test-shellhooks-empty/',
                overwrite_if_exists=True,
            )

tests/test_generate_hooks.py:82: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/test-shellhooks-empty/'
context = {'cookiecutter': {'shellhooks': 'shellhooks'}}, output_dir = '.'
overwrite_if_exists = True, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_hooks.py::test_oserror_hooks

test_generate_hooks.py::test_oserror_hooks
mocker = 

    @pytest.mark.usefixtures('clean_system', 'remove_additional_folders')
    def test_oserror_hooks(mocker):
        """Verify script error passed correctly to cookiecutter error.

        Here subprocess.Popen function mocked, ie we do not call hook script,
        just produce expected error.
        """
        message = 'Out of memory'

        err = OSError(message)
        err.errno = errno.ENOMEM

        prompt = mocker.patch('subprocess.Popen')
        prompt.side_effect = err

        with pytest.raises(FailedHookException) as excinfo:
>           generate.generate_files(
                context={'cookiecutter': {'shellhooks': 'shellhooks'}},
                repo_dir='tests/test-shellhooks-empty/',
                overwrite_if_exists=True,
            )

tests/test_generate_hooks.py:106: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/test-shellhooks-empty/'
context = {'cookiecutter': {'shellhooks': 'shellhooks'}}, output_dir = '.'
overwrite_if_exists = True, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_hooks.py::test_run_failing_hook_removes_output_directory

test_generate_hooks.py::test_run_failing_hook_removes_output_directory
@pytest.mark.usefixtures('clean_system', 'remove_additional_folders')
    def test_run_failing_hook_removes_output_directory():
        """Verify project directory not created or removed if hook failed."""
        repo_path = os.path.abspath('tests/test-hooks/')
        hooks_path = os.path.abspath('tests/test-hooks/hooks')

        hook_dir = os.path.join(repo_path, 'hooks')
        template = os.path.join(repo_path, 'input{{cookiecutter.hooks}}')
        os.mkdir(repo_path)
        os.mkdir(hook_dir)
        os.mkdir(template)

        hook_path = os.path.join(hooks_path, 'pre_gen_project.py')

        with Path(hook_path).open('w') as f:
            f.write("#!/usr/bin/env python\n")
            f.write("import sys; sys.exit(1)\n")

        with pytest.raises(FailedHookException) as excinfo:
>           generate.generate_files(
                context={'cookiecutter': {'hooks': 'hooks'}},
                repo_dir='tests/test-hooks/',
                overwrite_if_exists=True,
            )

tests/test_generate_hooks.py:133: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/test-hooks/', context = {'cookiecutter': {'hooks': 'hooks'}}
output_dir = '.', overwrite_if_exists = True, skip_if_file_exists = False
accept_hooks = True, keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_hooks.py::test_run_failing_hook_preserves_existing_output_directory

test_generate_hooks.py::test_run_failing_hook_preserves_existing_output_directory
@pytest.mark.usefixtures('clean_system', 'remove_additional_folders')
    def test_run_failing_hook_preserves_existing_output_directory():
        """Verify project directory not removed if exist before hook failed."""
        repo_path = os.path.abspath('tests/test-hooks/')
        hooks_path = os.path.abspath('tests/test-hooks/hooks')

        hook_dir = os.path.join(repo_path, 'hooks')
        template = os.path.join(repo_path, 'input{{cookiecutter.hooks}}')
        os.mkdir(repo_path)
        os.mkdir(hook_dir)
        os.mkdir(template)

        hook_path = os.path.join(hooks_path, 'pre_gen_project.py')

        with Path(hook_path).open('w') as f:
            f.write("#!/usr/bin/env python\n")
            f.write("import sys; sys.exit(1)\n")

        os.mkdir('inputhooks')
        with pytest.raises(FailedHookException) as excinfo:
>           generate.generate_files(
                context={'cookiecutter': {'hooks': 'hooks'}},
                repo_dir='tests/test-hooks/',
                overwrite_if_exists=True,
            )

tests/test_generate_hooks.py:163: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/test-hooks/', context = {'cookiecutter': {'hooks': 'hooks'}}
output_dir = '.', overwrite_if_exists = True, skip_if_file_exists = False
accept_hooks = True, keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_hooks.py::test_run_shell_hooks

test_generate_hooks.py::test_run_shell_hooks
tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_run_shell_hooks0')

    @pytest.mark.skipif(sys.platform.startswith('win'), reason="Linux only test")
    @pytest.mark.usefixtures('clean_system', 'remove_additional_folders')
    def test_run_shell_hooks(tmp_path):
        """Verify pre and post generate project shell hooks executed.

        This test for .sh files.
        """
>       generate.generate_files(
            context={'cookiecutter': {'shellhooks': 'shellhooks'}},
            repo_dir='tests/test-shellhooks/',
            output_dir=tmp_path.joinpath('test-shellhooks'),
        )

tests/test_generate_hooks.py:180: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/test-shellhooks/'
context = {'cookiecutter': {'shellhooks': 'shellhooks'}}
output_dir = PosixPath('/tmp/pytest-of-root/pytest-0/test_run_shell_hooks0/test-shellhooks')
overwrite_if_exists = False, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_hooks.py::test_ignore_shell_hooks

test_generate_hooks.py::test_ignore_shell_hooks
tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_ignore_shell_hooks0')

    @pytest.mark.usefixtures("clean_system", "remove_additional_folders")
    def test_ignore_shell_hooks(tmp_path):
        """Verify *.txt files not created, when accept_hooks=False."""
>       generate.generate_files(
            context={"cookiecutter": {"shellhooks": "shellhooks"}},
            repo_dir="tests/test-shellhooks/",
            output_dir=tmp_path.joinpath('test-shellhooks'),
            accept_hooks=False,
        )

tests/test_generate_hooks.py:220: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/test-shellhooks/'
context = {'cookiecutter': {'shellhooks': 'shellhooks'}}
output_dir = PosixPath('/tmp/pytest-of-root/pytest-0/test_ignore_shell_hooks0/test-shellhooks')
overwrite_if_exists = False, skip_if_file_exists = False, accept_hooks = False
keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_generate_hooks.py::test_deprecate_run_hook_from_repo_dir

test_generate_hooks.py::test_deprecate_run_hook_from_repo_dir
repo_dir = 'tests/test-shellhooks/', hook_name = 'pre_gen_project'
project_dir = PosixPath('/tmp/pytest-of-root/pytest-0/test_deprecate_run_hook_from_r0/test-shellhooks')
context = {}, delete_project_on_failure = False

    def _run_hook_from_repo_dir(repo_dir, hook_name, project_dir, context,
        delete_project_on_failure):
        """Run hook from repo directory, clean project directory if hook fails.

        :param repo_dir: Project template input directory.
        :param hook_name: The hook to execute.
        :param project_dir: The directory to execute the script from.
        :param context: Cookiecutter project context.
        :param delete_project_on_failure: Delete the project directory on hook
            failure?
        """
        with work_in(repo_dir):
            try:
>               run_hook_from_repo_dir(hook_name, project_dir, context)
E               TypeError: run_hook_from_repo_dir() missing 2 required positional arguments: 'context' and 'delete_project_on_failure'

cookiecutter/generate.py:175: TypeError

During handling of the above exception, another exception occurred:

tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_deprecate_run_hook_from_r0')

    @pytest.mark.usefixtures("clean_system", "remove_additional_folders")
    def test_deprecate_run_hook_from_repo_dir(tmp_path):
        """Test deprecation warning in generate._run_hook_from_repo_dir."""
        repo_dir = "tests/test-shellhooks/"
        project_dir = Path(tmp_path.joinpath('test-shellhooks'))
        project_dir.mkdir()
        with pytest.deprecated_call():
>           generate._run_hook_from_repo_dir(
                repo_dir=repo_dir,
                hook_name="pre_gen_project",
                project_dir=project_dir,
                context={},
                delete_project_on_failure=False,
            )

tests/test_generate_hooks.py:241: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/test-shellhooks/', hook_name = 'pre_gen_project'
project_dir = PosixPath('/tmp/pytest-of-root/pytest-0/test_deprecate_run_hook_from_r0/test-shellhooks')
context = {}, delete_project_on_failure = False

    def _run_hook_from_repo_dir(repo_dir, hook_name, project_dir, context,
        delete_project_on_failure):
        """Run hook from repo directory, clean project directory if hook fails.

        :param repo_dir: Project template input directory.
        :param hook_name: The hook to execute.
        :param project_dir: The directory to execute the script from.
        :param context: Cookiecutter project context.
        :param delete_project_on_failure: Delete the project directory on hook
            failure?
        """
        with work_in(repo_dir):
            try:
                run_hook_from_repo_dir(hook_name, project_dir, context)
>           except FailedHookException:
E           NameError: name 'FailedHookException' is not defined

cookiecutter/generate.py:176: NameError

During handling of the above exception, another exception occurred:

tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_deprecate_run_hook_from_r0')

    @pytest.mark.usefixtures("clean_system", "remove_additional_folders")
    def test_deprecate_run_hook_from_repo_dir(tmp_path):
        """Test deprecation warning in generate._run_hook_from_repo_dir."""
        repo_dir = "tests/test-shellhooks/"
        project_dir = Path(tmp_path.joinpath('test-shellhooks'))
        project_dir.mkdir()
>       with pytest.deprecated_call():
E       Failed: DID NOT WARN. No warnings of type (, , ) were emitted.
E        Emitted warnings: [].

tests/test_generate_hooks.py:240: Failed

test_get_config.py::test_get_config

test_get_config.py::test_get_config
def test_get_config():
        """Verify valid config opened and rendered correctly."""
        conf = config.get_config('tests/test-config/valid-config.yaml')
        expected_conf = {
            'cookiecutters_dir': '/home/example/some-path-to-templates',
            'replay_dir': '/home/example/some-path-to-replay-files',
            'default_context': {
                'full_name': 'Firstname Lastname',
                'email': 'firstname.lastname@gmail.com',
                'github_username': 'example',
                'project': {
                    'description': 'description',
                    'tags': [
                        'first',
                        'second',
                        'third',
                    ],
                },
            },
            'abbreviations': {
                'gh': 'https://github.com/{0}.git',
                'gl': 'https://gitlab.com/{0}.git',
                'bb': 'https://bitbucket.org/{0}',
                'helloworld': 'https://github.com/hackebrot/helloworld',
            },
        }
>       assert conf == expected_conf
E       AssertionError: assert {'default_context': {'full_name': 'Firstname Lastname', 'email': 'firstname.lastname@gmail.com', 'github_username': 'example', 'project': {'description': 'description', 'tags': ['first', 'second', 'third']}}, 'cookiecutters_dir': '/home/example/some-path-to-templates', 'replay_dir': '/home/example/some-path-to-replay-files', 'abbreviations': {'helloworld': 'https://github.com/hackebrot/helloworld'}} == {'cookiecutters_dir': '/home/example/some-path-to-templates', 'replay_dir': '/home/example/some-path-to-replay-files', 'default_context': {'full_name': 'Firstname Lastname', 'email': 'firstname.lastname@gmail.com', 'github_username': 'example', 'project': {'description': 'description', 'tags': ['first', 'second', 'third']}}, 'abbreviations': {'gh': 'https://github.com/{0}.git', 'gl': 'https://gitlab.com/{0}.git', 'bb': 'https://bitbucket.org/{0}', 'helloworld': 'https://github.com/hackebrot/helloworld'}}
E         
E         Common items:
E         {'cookiecutters_dir': '/home/example/some-path-to-templates',
E          'default_context': {'email': 'firstname.lastname@gmail.com',
E                              'full_name': 'Firstname Lastname',
E                              'github_username': 'example',
E                              'project': {'description': 'description',
E                                          'tags': ['first', 'second', 'third']}},
E          'replay_dir': '/home/example/some-path-to-replay-files'}
E         Differing items:
E         {'abbreviations': {'helloworld': 'https://github.com/hackebrot/helloworld'}} != {'abbreviations': {'bb': 'https://bitbucket.org/{0}', 'gh': 'https://github.com/{0}.git', 'gl': 'https://gitlab.com/{0}.git', 'helloworld': 'https://github.com/hackebrot/helloworld'}}
E         
E         Full diff:
E           {
E               'abbreviations': {
E         -         'bb': 'https://bitbucket.org/{0}',
E         -         'gh': 'https://github.com/{0}.git',
E         -         'gl': 'https://gitlab.com/{0}.git',
E                   'helloworld': 'https://github.com/hackebrot/helloworld',
E               },
E               'cookiecutters_dir': '/home/example/some-path-to-templates',
E               'default_context': {
E                   'email': 'firstname.lastname@gmail.com',
E                   'full_name': 'Firstname Lastname',
E                   'github_username': 'example',
E                   'project': {
E                       'description': 'description',
E                       'tags': [
E                           'first',
E                           'second',
E                           'third',
E                       ],
E                   },
E               },
E               'replay_dir': '/home/example/some-path-to-replay-files',
E           }

tests/test_get_config.py:80: AssertionError

test_get_config.py::test_get_config_with_defaults

test_get_config.py::test_get_config_with_defaults
def test_get_config_with_defaults():
        """A config file that overrides 1 of 3 defaults."""
        conf = config.get_config('tests/test-config/valid-partial-config.yaml')
        default_cookiecutters_dir = Path('~/.cookiecutters').expanduser()
        default_replay_dir = Path('~/.cookiecutter_replay').expanduser()
        expected_conf = {
            'cookiecutters_dir': str(default_cookiecutters_dir),
            'replay_dir': str(default_replay_dir),
            'default_context': {
                'full_name': 'Firstname Lastname',
                'email': 'firstname.lastname@gmail.com',
                'github_username': 'example',
            },
            'abbreviations': {
                'gh': 'https://github.com/{0}.git',
                'gl': 'https://gitlab.com/{0}.git',
                'bb': 'https://bitbucket.org/{0}',
            },
        }
>       assert conf == expected_conf
E       AssertionError: assert {'default_context': {'full_name': 'Firstname Lastname', 'email': 'firstname.lastname@gmail.com', 'github_username': 'example'}} == {'cookiecutters_dir': '/tmp/pytest-of-root/pytest-0/test_get_config_with_defaults0/home/.cookiecutters', 'replay_dir': '/tmp/pytest-of-root/pytest-0/test_get_config_with_defaults0/home/.cookiecutter_replay', 'default_context': {'full_name': 'Firstname Lastname', 'email': 'firstname.lastname@gmail.com', 'github_username': 'example'}, 'abbreviations': {'gh': 'https://github.com/{0}.git', 'gl': 'https://gitlab.com/{0}.git', 'bb': 'https://bitbucket.org/{0}'}}
E         
E         Common items:
E         {'default_context': {'email': 'firstname.lastname@gmail.com',
E                              'full_name': 'Firstname Lastname',
E                              'github_username': 'example'}}
E         Right contains 3 more items:
E         {'abbreviations': {'bb': 'https://bitbucket.org/{0}',
E                            'gh': 'https://github.com/{0}.git',
E                            'gl': 'https://gitlab.com/{0}.git'},
E          'cookiecutters_dir': '/tmp/pytest-of-root/pytest-0/test_get_config_with_defaults0/home/.cookiecutters',
E          'replay_dir': '/tmp/pytest-of-root/pytest-0/test_get_config_with_defaults0/home/.cookiecutter_replay'}
E         
E         Full diff:
E           {
E         -     'abbreviations': {
E         -         'bb': 'https://bitbucket.org/{0}',
E         -         'gh': 'https://github.com/{0}.git',
E         -         'gl': 'https://gitlab.com/{0}.git',
E         -     },
E         -     'cookiecutters_dir': '/tmp/pytest-of-root/pytest-0/test_get_config_with_defaults0/home/.cookiecutters',
E               'default_context': {
E                   'email': 'firstname.lastname@gmail.com',
E                   'full_name': 'Firstname Lastname',
E                   'github_username': 'example',
E               },
E         -     'replay_dir': '/tmp/pytest-of-root/pytest-0/test_get_config_with_defaults0/home/.cookiecutter_replay',
E           }

tests/test_get_config.py:123: AssertionError

test_get_config.py::test_get_config_empty_config_file

test_get_config.py::test_get_config_empty_config_file
def test_get_config_empty_config_file():
        """An empty config file results in the default config."""
>       conf = config.get_config('tests/test-config/empty-config.yaml')

tests/test_get_config.py:128: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

config_path = 'tests/test-config/empty-config.yaml'

    def get_config(config_path):
        """Retrieve the config from the specified path, returning a config dict."""
        if not os.path.exists(config_path):
            raise ConfigDoesNotExistException(f"Config file {config_path} does not exist.")

        with open(config_path) as file_handle:
            try:
                user_config = yaml.safe_load(file_handle)
            except yaml.YAMLError as e:
                raise InvalidConfiguration(f"Unable to parse YAML file {config_path}: {e}")

        if user_config is None:
>           raise InvalidConfiguration(f"Config file {config_path} is empty.")
E           cookiecutter.exceptions.InvalidConfiguration: Config file tests/test-config/empty-config.yaml is empty.

cookiecutter/config.py:50: InvalidConfiguration

test_get_config.py::test_get_config_invalid_file_with_array_as_top_level_element

test_get_config.py::test_get_config_invalid_file_with_array_as_top_level_element
def test_get_config_invalid_file_with_array_as_top_level_element():
        """An exception should be raised if top-level element is array."""
        expected_error_msg = (
            'Top-level element of YAML file '
            'tests/test-config/invalid-config-w-array.yaml should be an object.'
        )
>       with pytest.raises(InvalidConfiguration) as exc_info:
E       Failed: DID NOT RAISE 

tests/test_get_config.py:138: Failed

test_get_config.py::test_get_config_invalid_file_with_multiple_docs

test_get_config.py::test_get_config_invalid_file_with_multiple_docs
def test_get_config_invalid_file_with_multiple_docs():
        """An exception should be raised if config file contains multiple docs."""
        expected_error_msg = (
            'Unable to parse YAML file '
            'tests/test-config/invalid-config-w-multiple-docs.yaml.'
        )
        with pytest.raises(InvalidConfiguration) as exc_info:
            config.get_config('tests/test-config/invalid-config-w-multiple-docs.yaml')
>       assert expected_error_msg in str(exc_info.value)
E       assert 'Unable to parse YAML file tests/test-config/invalid-config-w-multiple-docs.yaml.' in 'Unable to parse YAML file tests/test-config/invalid-config-w-multiple-docs.yaml: expected a single document in the stream\n  in "tests/test-config/invalid-config-w-multiple-docs.yaml", line 2, column 1\nbut found another document\n  in "tests/test-config/invalid-config-w-multiple-docs.yaml", line 12, column 1'
E        +  where 'Unable to parse YAML file tests/test-config/invalid-config-w-multiple-docs.yaml: expected a single document in the stream\n  in "tests/test-config/invalid-config-w-multiple-docs.yaml", line 2, column 1\nbut found another document\n  in "tests/test-config/invalid-config-w-multiple-docs.yaml", line 12, column 1' = str(InvalidConfiguration('Unable to parse YAML file tests/test-config/invalid-config-w-multiple-docs.yaml: expected a single document in the stream\n  in "tests/test-config/invalid-config-w-multiple-docs.yaml", line 2, column 1\nbut found another document\n  in "tests/test-config/invalid-config-w-multiple-docs.yaml", line 12, column 1'))
E        +    where InvalidConfiguration('Unable to parse YAML file tests/test-config/invalid-config-w-multiple-docs.yaml: expected a single document in the stream\n  in "tests/test-config/invalid-config-w-multiple-docs.yaml", line 2, column 1\nbut found another document\n  in "tests/test-config/invalid-config-w-multiple-docs.yaml", line 12, column 1') = .value

tests/test_get_config.py:151: AssertionError

test_get_user_config.py::test_get_user_config_valid

test_get_user_config.py::test_get_user_config_valid
user_config_path = '/root/.cookiecutterrc'
custom_config = {'abbreviations': {'bb': 'https://bitbucket.org/{0}', 'gh': 'https://github.com/{0}.git', 'gl': 'https://gitlab.com/{0}.git', 'helloworld': 'https://github.com/hackebrot/helloworld'}, 'cookiecutters_dir': '/home/example/some-path-to-templates', 'default_context': {'email': 'firstname.lastname@gmail.com', 'full_name': 'Firstname Lastname', 'github_username': 'example', 'project': {'description': 'description', 'tags': ['first', 'second', 'third']}}, 'replay_dir': '/home/example/some-path-to-replay-files'}

    @pytest.mark.usefixtures('back_up_rc')
    def test_get_user_config_valid(user_config_path, custom_config):
        """Validate user config correctly parsed if exist and correctly formatted."""
        shutil.copy('tests/test-config/valid-config.yaml', user_config_path)
        conf = config.get_user_config()

>       assert conf == custom_config
E       AssertionError: assert {'default_context': {'full_name': 'Firstname Lastname', 'email': 'firstname.lastname@gmail.com', 'github_username': 'example', 'project': {'description': 'description', 'tags': ['first', 'second', 'third']}}, 'cookiecutters_dir': '/home/example/some-path-to-templates', 'replay_dir': '/home/example/some-path-to-replay-files', 'abbreviations': {'helloworld': 'https://github.com/hackebrot/helloworld'}} == {'default_context': {'full_name': 'Firstname Lastname', 'email': 'firstname.lastname@gmail.com', 'github_username': 'example', 'project': {'description': 'description', 'tags': ['first', 'second', 'third']}}, 'cookiecutters_dir': '/home/example/some-path-to-templates', 'replay_dir': '/home/example/some-path-to-replay-files', 'abbreviations': {'gh': 'https://github.com/{0}.git', 'gl': 'https://gitlab.com/{0}.git', 'bb': 'https://bitbucket.org/{0}', 'helloworld': 'https://github.com/hackebrot/helloworld'}}
E         
E         Common items:
E         {'cookiecutters_dir': '/home/example/some-path-to-templates',
E          'default_context': {'email': 'firstname.lastname@gmail.com',
E                              'full_name': 'Firstname Lastname',
E                              'github_username': 'example',
E                              'project': {'description': 'description',
E                                          'tags': ['first', 'second', 'third']}},
E          'replay_dir': '/home/example/some-path-to-replay-files'}
E         Differing items:
E         {'abbreviations': {'helloworld': 'https://github.com/hackebrot/helloworld'}} != {'abbreviations': {'bb': 'https://bitbucket.org/{0}', 'gh': 'https://github.com/{0}.git', 'gl': 'https://gitlab.com/{0}.git', 'helloworld': 'https://github.com/hackebrot/helloworld'}}
E         
E         Full diff:
E           {
E               'abbreviations': {
E         -         'bb': 'https://bitbucket.org/{0}',
E         -         'gh': 'https://github.com/{0}.git',
E         -         'gl': 'https://gitlab.com/{0}.git',
E                   'helloworld': 'https://github.com/hackebrot/helloworld',
E               },
E               'cookiecutters_dir': '/home/example/some-path-to-templates',
E               'default_context': {
E                   'email': 'firstname.lastname@gmail.com',
E                   'full_name': 'Firstname Lastname',
E                   'github_username': 'example',
E                   'project': {
E                       'description': 'description',
E                       'tags': [
E                           'first',
E                           'second',
E                           'third',
E                       ],
E                   },
E               },
E               'replay_dir': '/home/example/some-path-to-replay-files',
E           }

tests/test_get_user_config.py:76: AssertionError

test_get_user_config.py::test_specify_config_path

test_get_user_config.py::test_specify_config_path
mocker = 
custom_config_path = 'tests/test-config/valid-config.yaml'
custom_config = {'abbreviations': {'bb': 'https://bitbucket.org/{0}', 'gh': 'https://github.com/{0}.git', 'gl': 'https://gitlab.com/{0}.git', 'helloworld': 'https://github.com/hackebrot/helloworld'}, 'cookiecutters_dir': '/home/example/some-path-to-templates', 'default_context': {'email': 'firstname.lastname@gmail.com', 'full_name': 'Firstname Lastname', 'github_username': 'example', 'project': {'description': 'description', 'tags': ['first', 'second', 'third']}}, 'replay_dir': '/home/example/some-path-to-replay-files'}

    def test_specify_config_path(mocker, custom_config_path, custom_config):
        """Validate provided custom config path should be respected and parsed."""
        spy_get_config = mocker.spy(config, 'get_config')

        user_config = config.get_user_config(custom_config_path)
        spy_get_config.assert_called_once_with(custom_config_path)

>       assert user_config == custom_config
E       AssertionError: assert {'default_context': {'full_name': 'Firstname Lastname', 'email': 'firstname.lastname@gmail.com', 'github_username': 'example', 'project': {'description': 'description', 'tags': ['first', 'second', 'third']}}, 'cookiecutters_dir': '/home/example/some-path-to-templates', 'replay_dir': '/home/example/some-path-to-replay-files', 'abbreviations': {'helloworld': 'https://github.com/hackebrot/helloworld'}} == {'default_context': {'full_name': 'Firstname Lastname', 'email': 'firstname.lastname@gmail.com', 'github_username': 'example', 'project': {'description': 'description', 'tags': ['first', 'second', 'third']}}, 'cookiecutters_dir': '/home/example/some-path-to-templates', 'replay_dir': '/home/example/some-path-to-replay-files', 'abbreviations': {'gh': 'https://github.com/{0}.git', 'gl': 'https://gitlab.com/{0}.git', 'bb': 'https://bitbucket.org/{0}', 'helloworld': 'https://github.com/hackebrot/helloworld'}}
E         
E         Common items:
E         {'cookiecutters_dir': '/home/example/some-path-to-templates',
E          'default_context': {'email': 'firstname.lastname@gmail.com',
E                              'full_name': 'Firstname Lastname',
E                              'github_username': 'example',
E                              'project': {'description': 'description',
E                                          'tags': ['first', 'second', 'third']}},
E          'replay_dir': '/home/example/some-path-to-replay-files'}
E         Differing items:
E         {'abbreviations': {'helloworld': 'https://github.com/hackebrot/helloworld'}} != {'abbreviations': {'bb': 'https://bitbucket.org/{0}', 'gh': 'https://github.com/{0}.git', 'gl': 'https://gitlab.com/{0}.git', 'helloworld': 'https://github.com/hackebrot/helloworld'}}
E         
E         Full diff:
E           {
E               'abbreviations': {
E         -         'bb': 'https://bitbucket.org/{0}',
E         -         'gh': 'https://github.com/{0}.git',
E         -         'gl': 'https://gitlab.com/{0}.git',
E                   'helloworld': 'https://github.com/hackebrot/helloworld',
E               },
E               'cookiecutters_dir': '/home/example/some-path-to-templates',
E               'default_context': {
E                   'email': 'firstname.lastname@gmail.com',
E                   'full_name': 'Firstname Lastname',
E                   'github_username': 'example',
E                   'project': {
E                       'description': 'description',
E                       'tags': [
E                           'first',
E                           'second',
E                           'third',
E                       ],
E                   },
E               },
E               'replay_dir': '/home/example/some-path-to-replay-files',
E           }

tests/test_get_user_config.py:106: AssertionError

test_get_user_config.py::test_default_config_from_env_variable

test_get_user_config.py::test_default_config_from_env_variable
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7ee47dfc1240>
custom_config_path = 'tests/test-config/valid-config.yaml'
custom_config = {'abbreviations': {'bb': 'https://bitbucket.org/{0}', 'gh': 'https://github.com/{0}.git', 'gl': 'https://gitlab.com/{0}.git', 'helloworld': 'https://github.com/hackebrot/helloworld'}, 'cookiecutters_dir': '/home/example/some-path-to-templates', 'default_context': {'email': 'firstname.lastname@gmail.com', 'full_name': 'Firstname Lastname', 'github_username': 'example', 'project': {'description': 'description', 'tags': ['first', 'second', 'third']}}, 'replay_dir': '/home/example/some-path-to-replay-files'}

    def test_default_config_from_env_variable(
        monkeypatch, custom_config_path, custom_config
    ):
        """Validate app configuration. User config path should be parsed from sys env."""
        monkeypatch.setenv('COOKIECUTTER_CONFIG', custom_config_path)

        user_config = config.get_user_config()
>       assert user_config == custom_config
E       AssertionError: assert {'default_context': {'full_name': 'Firstname Lastname', 'email': 'firstname.lastname@gmail.com', 'github_username': 'example', 'project': {'description': 'description', 'tags': ['first', 'second', 'third']}}, 'cookiecutters_dir': '/home/example/some-path-to-templates', 'replay_dir': '/home/example/some-path-to-replay-files', 'abbreviations': {'helloworld': 'https://github.com/hackebrot/helloworld'}} == {'default_context': {'full_name': 'Firstname Lastname', 'email': 'firstname.lastname@gmail.com', 'github_username': 'example', 'project': {'description': 'description', 'tags': ['first', 'second', 'third']}}, 'cookiecutters_dir': '/home/example/some-path-to-templates', 'replay_dir': '/home/example/some-path-to-replay-files', 'abbreviations': {'gh': 'https://github.com/{0}.git', 'gl': 'https://gitlab.com/{0}.git', 'bb': 'https://bitbucket.org/{0}', 'helloworld': 'https://github.com/hackebrot/helloworld'}}
E         
E         Common items:
E         {'cookiecutters_dir': '/home/example/some-path-to-templates',
E          'default_context': {'email': 'firstname.lastname@gmail.com',
E                              'full_name': 'Firstname Lastname',
E                              'github_username': 'example',
E                              'project': {'description': 'description',
E                                          'tags': ['first', 'second', 'third']}},
E          'replay_dir': '/home/example/some-path-to-replay-files'}
E         Differing items:
E         {'abbreviations': {'helloworld': 'https://github.com/hackebrot/helloworld'}} != {'abbreviations': {'bb': 'https://bitbucket.org/{0}', 'gh': 'https://github.com/{0}.git', 'gl': 'https://gitlab.com/{0}.git', 'helloworld': 'https://github.com/hackebrot/helloworld'}}
E         
E         Full diff:
E           {
E               'abbreviations': {
E         -         'bb': 'https://bitbucket.org/{0}',
E         -         'gh': 'https://github.com/{0}.git',
E         -         'gl': 'https://gitlab.com/{0}.git',
E                   'helloworld': 'https://github.com/hackebrot/helloworld',
E               },
E               'cookiecutters_dir': '/home/example/some-path-to-templates',
E               'default_context': {
E                   'email': 'firstname.lastname@gmail.com',
E                   'full_name': 'Firstname Lastname',
E                   'github_username': 'example',
E                   'project': {
E                       'description': 'description',
E                       'tags': [
E                           'first',
E                           'second',
E                           'third',
E                       ],
E                   },
E               },
E               'replay_dir': '/home/example/some-path-to-replay-files',
E           }

tests/test_get_user_config.py:121: AssertionError

test_get_user_config.py::test_expand_user_for_directories_in_config

test_get_user_config.py::test_expand_user_for_directories_in_config
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7ee47dfd3520>

    def test_expand_user_for_directories_in_config(monkeypatch):
        """Validate user pointers expanded in user configs."""

        def _expanduser(path):
            return path.replace('~', 'Users/bob')

        monkeypatch.setattr('os.path.expanduser', _expanduser)

        config_file = 'tests/test-config/config-expand-user.yaml'

        user_config = config.get_user_config(config_file)
>       assert user_config['replay_dir'] == 'Users/bob/replay-files'
E       AssertionError: assert '~/replay-files' == 'Users/bob/replay-files'
E         
E         - Users/bob/replay-files
E         + ~/replay-files

tests/test_get_user_config.py:145: AssertionError

test_get_user_config.py::test_expand_vars_for_directories_in_config

test_get_user_config.py::test_expand_vars_for_directories_in_config
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7ee47dfd13c0>

    def test_expand_vars_for_directories_in_config(monkeypatch):
        """Validate environment variables expanded in user configs."""
        monkeypatch.setenv('COOKIES', 'Users/bob/cookies')

        config_file = 'tests/test-config/config-expand-vars.yaml'

        user_config = config.get_user_config(config_file)
>       assert user_config['replay_dir'] == 'Users/bob/cookies/replay-files'
E       AssertionError: assert '$COOKIES/replay-files' == 'Users/bob/cookies/replay-files'
E         
E         - Users/bob/cookies/replay-files
E         + $COOKIES/replay-files

tests/test_get_user_config.py:156: AssertionError

test_hooks.py::TestFindHooks::test_find_hook

test_hooks.py::TestFindHooks::test_find_hook
self = 

    def test_find_hook(self):
        """Finds the specified hook."""
        with utils.work_in(self.repo_path):
            expected_pre = os.path.abspath('hooks/pre_gen_project.py')
            actual_hook_path = hooks.find_hook('pre_gen_project')
>           assert expected_pre == actual_hook_path[0]
E           AssertionError: assert '/testbed/tests/test-hooks/hooks/pre_gen_project.py' == '/'
E             
E             - /
E             + /testbed/tests/test-hooks/hooks/pre_gen_project.py

tests/test_hooks.py:93: AssertionError

test_hooks.py::TestExternalHooks::test_run_failing_script

test_hooks.py::TestExternalHooks::test_run_failing_script
self = 
mocker = 

    def test_run_failing_script(self, mocker):
        """Test correct exception raise if run_script fails."""
        err = OSError()

        prompt = mocker.patch('subprocess.Popen')
        prompt.side_effect = err

        with pytest.raises(exceptions.FailedHookException) as excinfo:
>           hooks.run_script(os.path.join(self.hooks_path, self.post_hook))

tests/test_hooks.py:157: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
cookiecutter/hooks.py:64: in run_script
    subprocess.check_call([script_path], cwd=cwd)
/usr/lib/python3.10/subprocess.py:364: in check_call
    retcode = call(*popenargs, **kwargs)
/usr/lib/python3.10/subprocess.py:345: in call
    with Popen(*popenargs, **kwargs) as p:
/usr/lib/python3.10/unittest/mock.py:1114: in __call__
    return self._mock_call(*args, **kwargs)
/usr/lib/python3.10/unittest/mock.py:1118: in _mock_call
    return self._execute_mock_call(*args, **kwargs)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = 
args = (['/testbed/tests/test-hooks/hooks/post_gen_project.sh'],)
kwargs = {'cwd': '.'}, effect = OSError()

    def _execute_mock_call(self, /, *args, **kwargs):
        # separate from _increment_mock_call so that awaited functions are
        # executed separately from their call, also AsyncMock overrides this method

        effect = self.side_effect
        if effect is not None:
            if _is_exception(effect):
>               raise effect
E               OSError

/usr/lib/python3.10/unittest/mock.py:1173: OSError

test_hooks.py::TestExternalHooks::test_run_failing_script_enoexec

test_hooks.py::TestExternalHooks::test_run_failing_script_enoexec
self = 
mocker = 

    def test_run_failing_script_enoexec(self, mocker):
        """Test correct exception raise if run_script fails."""
        err = OSError()
        err.errno = errno.ENOEXEC

        prompt = mocker.patch('subprocess.Popen')
        prompt.side_effect = err

        with pytest.raises(exceptions.FailedHookException) as excinfo:
>           hooks.run_script(os.path.join(self.hooks_path, self.post_hook))

tests/test_hooks.py:169: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
cookiecutter/hooks.py:64: in run_script
    subprocess.check_call([script_path], cwd=cwd)
/usr/lib/python3.10/subprocess.py:364: in check_call
    retcode = call(*popenargs, **kwargs)
/usr/lib/python3.10/subprocess.py:345: in call
    with Popen(*popenargs, **kwargs) as p:
/usr/lib/python3.10/unittest/mock.py:1114: in __call__
    return self._mock_call(*args, **kwargs)
/usr/lib/python3.10/unittest/mock.py:1118: in _mock_call
    return self._execute_mock_call(*args, **kwargs)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = 
args = (['/testbed/tests/test-hooks/hooks/post_gen_project.sh'],)
kwargs = {'cwd': '.'}, effect = OSError()

    def _execute_mock_call(self, /, *args, **kwargs):
        # separate from _increment_mock_call so that awaited functions are
        # executed separately from their call, also AsyncMock overrides this method

        effect = self.side_effect
        if effect is not None:
            if _is_exception(effect):
>               raise effect
E               OSError

/usr/lib/python3.10/unittest/mock.py:1173: OSError

test_hooks.py::TestExternalHooks::test_run_script_cwd

test_hooks.py::TestExternalHooks::test_run_script_cwd
self = 

    def test_run_script_cwd(self):
        """Change directory before running hook."""
>       hooks.run_script(os.path.join(self.hooks_path, self.post_hook), 'tests')

tests/test_hooks.py:176: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
cookiecutter/hooks.py:64: in run_script
    subprocess.check_call([script_path], cwd=cwd)
/usr/lib/python3.10/subprocess.py:364: in check_call
    retcode = call(*popenargs, **kwargs)
/usr/lib/python3.10/subprocess.py:345: in call
    with Popen(*popenargs, **kwargs) as p:
/usr/lib/python3.10/subprocess.py:971: in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = 
args = ['/testbed/tests/test-hooks/hooks/post_gen_project.sh']
executable = b'/testbed/tests/test-hooks/hooks/post_gen_project.sh'
preexec_fn = None, close_fds = True, pass_fds = (), cwd = 'tests', env = None
startupinfo = None, creationflags = 0, shell = False, p2cread = -1
p2cwrite = -1, c2pread = -1, c2pwrite = -1, errread = -1, errwrite = -1
restore_signals = True, gid = None, gids = None, uid = None, umask = -1
start_new_session = False

    def _execute_child(self, args, executable, preexec_fn, close_fds,
                       pass_fds, cwd, env,
                       startupinfo, creationflags, shell,
                       p2cread, p2cwrite,
                       c2pread, c2pwrite,
                       errread, errwrite,
                       restore_signals,
                       gid, gids, uid, umask,
                       start_new_session):
        """Execute program (POSIX version)"""

        if isinstance(args, (str, bytes)):
            args = [args]
        elif isinstance(args, os.PathLike):
            if shell:
                raise TypeError('path-like args is not allowed when '
                                'shell is true')
            args = [args]
        else:
            args = list(args)

        if shell:
            # On Android the default shell is at '/system/bin/sh'.
            unix_shell = ('/system/bin/sh' if
                      hasattr(sys, 'getandroidapilevel') else '/bin/sh')
            args = [unix_shell, "-c"] + args
            if executable:
                args[0] = executable

        if executable is None:
            executable = args[0]

        sys.audit("subprocess.Popen", executable, args, cwd, env)

        if (_USE_POSIX_SPAWN
                and os.path.dirname(executable)
                and preexec_fn is None
                and not close_fds
                and not pass_fds
                and cwd is None
                and (p2cread == -1 or p2cread > 2)
                and (c2pwrite == -1 or c2pwrite > 2)
                and (errwrite == -1 or errwrite > 2)
                and not start_new_session
                and gid is None
                and gids is None
                and uid is None
                and umask < 0):
            self._posix_spawn(args, executable, env, restore_signals,
                              p2cread, p2cwrite,
                              c2pread, c2pwrite,
                              errread, errwrite)
            return

        orig_executable = executable

        # For transferring possible exec failure from child to parent.
        # Data format: "exception name:hex errno:description"
        # Pickle is not used; it is complex and involves memory allocation.
        errpipe_read, errpipe_write = os.pipe()
        # errpipe_write must not be in the standard io 0, 1, or 2 fd range.
        low_fds_to_close = []
        while errpipe_write < 3:
            low_fds_to_close.append(errpipe_write)
            errpipe_write = os.dup(errpipe_write)
        for low_fd in low_fds_to_close:
            os.close(low_fd)
        try:
            try:
                # We must avoid complex work that could involve
                # malloc or free in the child process to avoid
                # potential deadlocks, thus we do all this here.
                # and pass it to fork_exec()

                if env is not None:
                    env_list = []
                    for k, v in env.items():
                        k = os.fsencode(k)
                        if b'=' in k:
                            raise ValueError("illegal environment variable name")
                        env_list.append(k + b'=' + os.fsencode(v))
                else:
                    env_list = None  # Use execv instead of execve.
                executable = os.fsencode(executable)
                if os.path.dirname(executable):
                    executable_list = (executable,)
                else:
                    # This matches the behavior of os._execvpe().
                    executable_list = tuple(
                        os.path.join(os.fsencode(dir), executable)
                        for dir in os.get_exec_path(env))
                fds_to_keep = set(pass_fds)
                fds_to_keep.add(errpipe_write)
                self.pid = _posixsubprocess.fork_exec(
                        args, executable_list,
                        close_fds, tuple(sorted(map(int, fds_to_keep))),
                        cwd, env_list,
                        p2cread, p2cwrite, c2pread, c2pwrite,
                        errread, errwrite,
                        errpipe_read, errpipe_write,
                        restore_signals, start_new_session,
                        gid, gids, uid, umask,
                        preexec_fn)
                self._child_created = True
            finally:
                # be sure the FD is closed no matter what
                os.close(errpipe_write)

            self._close_pipe_fds(p2cread, p2cwrite,
                                 c2pread, c2pwrite,
                                 errread, errwrite)

            # Wait for exec to fail or succeed; possibly raising an
            # exception (limited in size)
            errpipe_data = bytearray()
            while True:
                part = os.read(errpipe_read, 50000)
                errpipe_data += part
                if not part or len(errpipe_data) > 50000:
                    break
        finally:
            # be sure the FD is closed no matter what
            os.close(errpipe_read)

        if errpipe_data:
            try:
                pid, sts = os.waitpid(self.pid, 0)
                if pid == self.pid:
                    self._handle_exitstatus(sts)
                else:
                    self.returncode = sys.maxsize
            except ChildProcessError:
                pass

            try:
                exception_name, hex_errno, err_msg = (
                        errpipe_data.split(b':', 2))
                # The encoding here should match the encoding
                # written in by the subprocess implementations
                # like _posixsubprocess
                err_msg = err_msg.decode()
            except ValueError:
                exception_name = b'SubprocessError'
                hex_errno = b'0'
                err_msg = 'Bad exception data from child: {!r}'.format(
                              bytes(errpipe_data))
            child_exception_type = getattr(
                    builtins, exception_name.decode('ascii'),
                    SubprocessError)
            if issubclass(child_exception_type, OSError) and hex_errno:
                errno_num = int(hex_errno, 16)
                child_exec_never_called = (err_msg == "noexec")
                if child_exec_never_called:
                    err_msg = ""
                    # The error must be from chdir(cwd).
                    err_filename = cwd
                else:
                    err_filename = orig_executable
                if errno_num != 0:
                    err_msg = os.strerror(errno_num)
>               raise child_exception_type(errno_num, err_msg, err_filename)
E               FileNotFoundError: [Errno 2] No such file or directory: 'tests'

/usr/lib/python3.10/subprocess.py:1863: FileNotFoundError

test_hooks.py::TestExternalHooks::test_run_script_with_context

test_hooks.py::TestExternalHooks::test_run_script_with_context
self = 

    def test_run_script_with_context(self):
        """Execute a hook script, passing a context."""
        hook_path = os.path.join(self.hooks_path, 'post_gen_project.sh')

        if sys.platform.startswith('win'):
            post = 'post_gen_project.bat'
            with Path(self.hooks_path, post).open('w') as f:
                f.write("@echo off\n")
                f.write("\n")
                f.write("echo post generation hook\n")
                f.write("echo. >{{cookiecutter.file}}\n")
        else:
            with Path(hook_path).open('w') as fh:
                fh.write("#!/bin/bash\n")
                fh.write("\n")
                fh.write("echo 'post generation hook';\n")
                fh.write("touch 'shell_post.txt'\n")
                fh.write("touch '{{cookiecutter.file}}'\n")
                os.chmod(hook_path, os.stat(hook_path).st_mode | stat.S_IXUSR)

>       hooks.run_script_with_context(
            os.path.join(self.hooks_path, self.post_hook),
            'tests',
            {'cookiecutter': {'file': 'context_post.txt'}},
        )

tests/test_hooks.py:200: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
cookiecutter/hooks.py:89: in run_script_with_context
    run_script(temp_script.name, cwd)
cookiecutter/hooks.py:64: in run_script
    subprocess.check_call([script_path], cwd=cwd)
/usr/lib/python3.10/subprocess.py:364: in check_call
    retcode = call(*popenargs, **kwargs)
/usr/lib/python3.10/subprocess.py:345: in call
    with Popen(*popenargs, **kwargs) as p:
/usr/lib/python3.10/subprocess.py:971: in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = 
args = ['/tmp/tmpx6xpm17x'], executable = b'/tmp/tmpx6xpm17x', preexec_fn = None
close_fds = True, pass_fds = (), cwd = 'tests', env = None, startupinfo = None
creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = -1
c2pwrite = -1, errread = -1, errwrite = -1, restore_signals = True, gid = None
gids = None, uid = None, umask = -1, start_new_session = False

    def _execute_child(self, args, executable, preexec_fn, close_fds,
                       pass_fds, cwd, env,
                       startupinfo, creationflags, shell,
                       p2cread, p2cwrite,
                       c2pread, c2pwrite,
                       errread, errwrite,
                       restore_signals,
                       gid, gids, uid, umask,
                       start_new_session):
        """Execute program (POSIX version)"""

        if isinstance(args, (str, bytes)):
            args = [args]
        elif isinstance(args, os.PathLike):
            if shell:
                raise TypeError('path-like args is not allowed when '
                                'shell is true')
            args = [args]
        else:
            args = list(args)

        if shell:
            # On Android the default shell is at '/system/bin/sh'.
            unix_shell = ('/system/bin/sh' if
                      hasattr(sys, 'getandroidapilevel') else '/bin/sh')
            args = [unix_shell, "-c"] + args
            if executable:
                args[0] = executable

        if executable is None:
            executable = args[0]

        sys.audit("subprocess.Popen", executable, args, cwd, env)

        if (_USE_POSIX_SPAWN
                and os.path.dirname(executable)
                and preexec_fn is None
                and not close_fds
                and not pass_fds
                and cwd is None
                and (p2cread == -1 or p2cread > 2)
                and (c2pwrite == -1 or c2pwrite > 2)
                and (errwrite == -1 or errwrite > 2)
                and not start_new_session
                and gid is None
                and gids is None
                and uid is None
                and umask < 0):
            self._posix_spawn(args, executable, env, restore_signals,
                              p2cread, p2cwrite,
                              c2pread, c2pwrite,
                              errread, errwrite)
            return

        orig_executable = executable

        # For transferring possible exec failure from child to parent.
        # Data format: "exception name:hex errno:description"
        # Pickle is not used; it is complex and involves memory allocation.
        errpipe_read, errpipe_write = os.pipe()
        # errpipe_write must not be in the standard io 0, 1, or 2 fd range.
        low_fds_to_close = []
        while errpipe_write < 3:
            low_fds_to_close.append(errpipe_write)
            errpipe_write = os.dup(errpipe_write)
        for low_fd in low_fds_to_close:
            os.close(low_fd)
        try:
            try:
                # We must avoid complex work that could involve
                # malloc or free in the child process to avoid
                # potential deadlocks, thus we do all this here.
                # and pass it to fork_exec()

                if env is not None:
                    env_list = []
                    for k, v in env.items():
                        k = os.fsencode(k)
                        if b'=' in k:
                            raise ValueError("illegal environment variable name")
                        env_list.append(k + b'=' + os.fsencode(v))
                else:
                    env_list = None  # Use execv instead of execve.
                executable = os.fsencode(executable)
                if os.path.dirname(executable):
                    executable_list = (executable,)
                else:
                    # This matches the behavior of os._execvpe().
                    executable_list = tuple(
                        os.path.join(os.fsencode(dir), executable)
                        for dir in os.get_exec_path(env))
                fds_to_keep = set(pass_fds)
                fds_to_keep.add(errpipe_write)
                self.pid = _posixsubprocess.fork_exec(
                        args, executable_list,
                        close_fds, tuple(sorted(map(int, fds_to_keep))),
                        cwd, env_list,
                        p2cread, p2cwrite, c2pread, c2pwrite,
                        errread, errwrite,
                        errpipe_read, errpipe_write,
                        restore_signals, start_new_session,
                        gid, gids, uid, umask,
                        preexec_fn)
                self._child_created = True
            finally:
                # be sure the FD is closed no matter what
                os.close(errpipe_write)

            self._close_pipe_fds(p2cread, p2cwrite,
                                 c2pread, c2pwrite,
                                 errread, errwrite)

            # Wait for exec to fail or succeed; possibly raising an
            # exception (limited in size)
            errpipe_data = bytearray()
            while True:
                part = os.read(errpipe_read, 50000)
                errpipe_data += part
                if not part or len(errpipe_data) > 50000:
                    break
        finally:
            # be sure the FD is closed no matter what
            os.close(errpipe_read)

        if errpipe_data:
            try:
                pid, sts = os.waitpid(self.pid, 0)
                if pid == self.pid:
                    self._handle_exitstatus(sts)
                else:
                    self.returncode = sys.maxsize
            except ChildProcessError:
                pass

            try:
                exception_name, hex_errno, err_msg = (
                        errpipe_data.split(b':', 2))
                # The encoding here should match the encoding
                # written in by the subprocess implementations
                # like _posixsubprocess
                err_msg = err_msg.decode()
            except ValueError:
                exception_name = b'SubprocessError'
                hex_errno = b'0'
                err_msg = 'Bad exception data from child: {!r}'.format(
                              bytes(errpipe_data))
            child_exception_type = getattr(
                    builtins, exception_name.decode('ascii'),
                    SubprocessError)
            if issubclass(child_exception_type, OSError) and hex_errno:
                errno_num = int(hex_errno, 16)
                child_exec_never_called = (err_msg == "noexec")
                if child_exec_never_called:
                    err_msg = ""
                    # The error must be from chdir(cwd).
                    err_filename = cwd
                else:
                    err_filename = orig_executable
                if errno_num != 0:
                    err_msg = os.strerror(errno_num)
>               raise child_exception_type(errno_num, err_msg, err_filename)
E               FileNotFoundError: [Errno 2] No such file or directory: 'tests'

/usr/lib/python3.10/subprocess.py:1863: FileNotFoundError

test_hooks.py::TestExternalHooks::test_run_hook

test_hooks.py::TestExternalHooks::test_run_hook
self = 

    def test_run_hook(self):
        """Execute hook from specified template in specified output \
        directory."""
        tests_dir = os.path.join(self.repo_path, 'input{{hooks}}')
        with utils.work_in(self.repo_path):
            hooks.run_hook('pre_gen_project', tests_dir, {})
            assert os.path.isfile(os.path.join(tests_dir, 'python_pre.txt'))
>           assert os.path.isfile(os.path.join(tests_dir, 'shell_pre.txt'))
E           AssertionError: assert False
E            +  where False = ('/testbed/tests/test-hooks/input{{hooks}}/shell_pre.txt')
E            +    where  = .isfile
E            +      where  = os.path
E            +    and   '/testbed/tests/test-hooks/input{{hooks}}/shell_pre.txt' = ('/testbed/tests/test-hooks/input{{hooks}}', 'shell_pre.txt')
E            +      where  = .join
E            +        where  = os.path

tests/test_hooks.py:215: AssertionError

test_hooks.py::TestExternalHooks::test_run_failing_hook

test_hooks.py::TestExternalHooks::test_run_failing_hook
self = 

    def test_run_failing_hook(self):
        """Test correct exception raise if hook exit code is not zero."""
        hook_path = os.path.join(self.hooks_path, 'pre_gen_project.py')
        tests_dir = os.path.join(self.repo_path, 'input{{hooks}}')

        with Path(hook_path).open('w') as f:
            f.write("#!/usr/bin/env python\n")
            f.write("import sys; sys.exit(1)\n")

        with utils.work_in(self.repo_path):
            with pytest.raises(exceptions.FailedHookException) as excinfo:
>               hooks.run_hook('pre_gen_project', tests_dir, {})

tests/test_hooks.py:231: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
cookiecutter/hooks.py:108: in run_hook
    run_script_with_context(hook_path, project_dir, context)
cookiecutter/hooks.py:89: in run_script_with_context
    run_script(temp_script.name, cwd)
cookiecutter/hooks.py:64: in run_script
    subprocess.check_call([script_path], cwd=cwd)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

popenargs = (['/tmp/tmp1vizgwgu'],)
kwargs = {'cwd': '/testbed/tests/test-hooks/input{{hooks}}'}, retcode = 1
cmd = ['/tmp/tmp1vizgwgu']

    def check_call(*popenargs, **kwargs):
        """Run command with arguments.  Wait for command to complete.  If
        the exit code was zero then return, otherwise raise
        CalledProcessError.  The CalledProcessError object will have the
        return code in the returncode attribute.

        The arguments are the same as for the call function.  Example:

        check_call(["ls", "-l"])
        """
        retcode = call(*popenargs, **kwargs)
        if retcode:
            cmd = kwargs.get("args")
            if cmd is None:
                cmd = popenargs[0]
>           raise CalledProcessError(retcode, cmd)
E           subprocess.CalledProcessError: Command '['/tmp/tmp1vizgwgu']' returned non-zero exit status 1.

/usr/lib/python3.10/subprocess.py:369: CalledProcessError

test_log.py::test_info_stdout_logging

test_log.py::test_info_stdout_logging
caplog = <_pytest.logging.LogCaptureFixture object at 0x7ee47ee625c0>
info_logger = 
info_messages = ['INFO: Welcome to Cookiecutter', 'INFO: Loading user config from home dir', 'ERROR: Aw, snap! Something went wrong']

    def test_info_stdout_logging(caplog, info_logger, info_messages):
        """Test that stdout logs use info format and level."""
>       [stream_handler] = info_logger.handlers
E       ValueError: too many values to unpack (expected 1)

tests/test_log.py:75: ValueError

test_log.py::test_debug_stdout_logging

test_log.py::test_debug_stdout_logging
caplog = <_pytest.logging.LogCaptureFixture object at 0x7ee47df8a0e0>
debug_logger = 
debug_messages = ['INFO cookiecutter: Welcome to Cookiecutter', 'DEBUG cookiecutter: Generating project from pytest-plugin', 'INFO cookiecutter.foo: Loading user config from home dir', "DEBUG cookiecutter.foo.bar: I don't know.", 'DEBUG cookiecutter.foo.bar: I wanted to save the world.', 'ERROR cookiecutter.foo: Aw, snap! Something went wrong', ...]

    def test_debug_stdout_logging(caplog, debug_logger, debug_messages):
        """Test that stdout logs use debug format and level."""
>       [stream_handler] = debug_logger.handlers
E       ValueError: too many values to unpack (expected 1)

tests/test_log.py:92: ValueError

test_log.py::test_debug_file_logging

test_log.py::test_debug_file_logging
caplog = <_pytest.logging.LogCaptureFixture object at 0x7ee47ee62620>
info_logger_with_file = 
debug_file = PosixPath('/tmp/pytest-of-root/pytest-0/test_debug_file_logging0/pytest-plugin.log')
debug_messages = ['INFO cookiecutter: Welcome to Cookiecutter', 'DEBUG cookiecutter: Generating project from pytest-plugin', 'INFO cookiecutter.foo: Loading user config from home dir', "DEBUG cookiecutter.foo.bar: I don't know.", 'DEBUG cookiecutter.foo.bar: I wanted to save the world.', 'ERROR cookiecutter.foo: Aw, snap! Something went wrong', ...]

    def test_debug_file_logging(caplog, info_logger_with_file, debug_file, debug_messages):
        """Test that logging to stdout uses a different format and level than \
        the the file handler."""
>       [file_handler, stream_handler] = info_logger_with_file.handlers
E       ValueError: too many values to unpack (expected 2)

tests/test_log.py:110: ValueError

test_main.py::test_original_cookiecutter_options_preserved_in__cookiecutter

test_main.py::test_original_cookiecutter_options_preserved_in__cookiecutter
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7ee47e11be20>
mocker = 
user_config_file = '/tmp/pytest-of-root/pytest-0/user_dir0/config'

    def test_original_cookiecutter_options_preserved_in__cookiecutter(
        monkeypatch,
        mocker,
        user_config_file,
    ):
        """Preserve original context options.

        Tests you can access the original context options via
        `context['_cookiecutter']`.
        """
        monkeypatch.chdir('tests/fake-repo-tmpl-_cookiecutter')
        mock_generate_files = mocker.patch('cookiecutter.main.generate_files')
>       cookiecutter(
            '.',
            no_input=True,
            replay=False,
            config_file=user_config_file,
        )

/testbed/tests/test_main.py:18: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = '.', checkout = None, no_input = True, extra_context = None
replay = False, overwrite_if_exists = False, output_dir = '.'
config_file = '/tmp/pytest-of-root/pytest-0/user_dir0/config'
default_config = False, password = None, directory = None
skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

/testbed/cookiecutter/main.py:60: TypeError

test_main.py::test_replay_dump_template_name

test_main.py::test_replay_dump_template_name
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7ee47dd5ad10>
mocker = 
user_config_data = {'cookiecutters_dir': '/tmp/pytest-of-root/pytest-0/user_dir0/cookiecutters', 'replay_dir': '/tmp/pytest-of-root/pytest-0/user_dir0/cookiecutter_replay'}
user_config_file = '/tmp/pytest-of-root/pytest-0/user_dir0/config'

    def test_replay_dump_template_name(
        monkeypatch, mocker, user_config_data, user_config_file
    ):
        """Check that replay_dump is called with a valid template_name.

        Template name must not be a relative path.

        Otherwise files such as ``..json`` are created, which are not just cryptic
        but also later mistaken for replay files of other templates if invoked with
        '.' and '--replay'.

        Change the current working directory temporarily to 'tests/fake-repo-tmpl'
        for this test and call cookiecutter with '.' for the target template.
        """
        monkeypatch.chdir('tests/fake-repo-tmpl')

        mock_replay_dump = mocker.patch('cookiecutter.main.dump')
        mocker.patch('cookiecutter.main.generate_files')

>       cookiecutter(
            '.',
            no_input=True,
            replay=False,
            config_file=user_config_file,
        )

/testbed/tests/test_main.py:51: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = '.', checkout = None, no_input = True, extra_context = None
replay = False, overwrite_if_exists = False, output_dir = '.'
config_file = '/tmp/pytest-of-root/pytest-0/user_dir0/config'
default_config = False, password = None, directory = None
skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

/testbed/cookiecutter/main.py:60: TypeError

test_main.py::test_replay_load_template_name

test_main.py::test_replay_load_template_name
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7ee47df77190>
mocker = 
user_config_data = {'cookiecutters_dir': '/tmp/pytest-of-root/pytest-0/user_dir0/cookiecutters', 'replay_dir': '/tmp/pytest-of-root/pytest-0/user_dir0/cookiecutter_replay'}
user_config_file = '/tmp/pytest-of-root/pytest-0/user_dir0/config'

    def test_replay_load_template_name(
        monkeypatch, mocker, user_config_data, user_config_file
    ):
        """Check that replay_load is called correctly.

        Calls require valid template_name that is not a relative path.

        Change the current working directory temporarily to 'tests/fake-repo-tmpl'
        for this test and call cookiecutter with '.' for the target template.
        """
        monkeypatch.chdir('tests/fake-repo-tmpl')

        mock_replay_load = mocker.patch('cookiecutter.main.load')
        mocker.patch('cookiecutter.main.generate_context').return_value = {
            'cookiecutter': {}
        }
        mocker.patch('cookiecutter.main.generate_files')
        mocker.patch('cookiecutter.main.dump')

>       cookiecutter(
            '.',
            replay=True,
            config_file=user_config_file,
        )

/testbed/tests/test_main.py:84: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = '.', checkout = None, no_input = False, extra_context = None
replay = True, overwrite_if_exists = False, output_dir = '.'
config_file = '/tmp/pytest-of-root/pytest-0/user_dir0/config'
default_config = False, password = None, directory = None
skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

/testbed/cookiecutter/main.py:60: TypeError

test_main.py::test_custom_replay_file

test_main.py::test_custom_replay_file
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7ee47e1182b0>
mocker = 
user_config_file = '/tmp/pytest-of-root/pytest-0/user_dir0/config'

    def test_custom_replay_file(monkeypatch, mocker, user_config_file):
        """Check that reply.load is called with the custom replay_file."""
        monkeypatch.chdir('tests/fake-repo-tmpl')

        mock_replay_load = mocker.patch('cookiecutter.main.load')
        mocker.patch('cookiecutter.main.generate_context').return_value = {
            'cookiecutter': {}
        }
        mocker.patch('cookiecutter.main.generate_files')
        mocker.patch('cookiecutter.main.dump')

>       cookiecutter(
            '.',
            replay='./custom-replay-file',
            config_file=user_config_file,
        )

/testbed/tests/test_main.py:107: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = '.', checkout = None, no_input = False, extra_context = None
replay = './custom-replay-file', overwrite_if_exists = False, output_dir = '.'
config_file = '/tmp/pytest-of-root/pytest-0/user_dir0/config'
default_config = False, password = None, directory = None
skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

/testbed/cookiecutter/main.py:60: TypeError

test_output_folder.py::test_output_folder

test_output_folder.py::test_output_folder
@pytest.mark.usefixtures('clean_system', 'remove_output_folder')
    def test_output_folder():
        """Tests should correctly create content, as output_folder does not yet exist."""
        context = generate.generate_context(
            context_file='tests/test-output-folder/cookiecutter.json'
        )
>       generate.generate_files(context=context, repo_dir='tests/test-output-folder')

tests/test_output_folder.py:30: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

repo_dir = 'tests/test-output-folder'
context = OrderedDict([('full_name', 'Audrey Greenfeld'), ('year', '2014'), ('color', 'green'), ('letter', 'D'), ('folder_name', 'im_a.dir'), ('filename', 'im_a.file'), ('test_name', 'output_folder')])
output_dir = '.', overwrite_if_exists = False, skip_if_file_exists = False
accept_hooks = True, keep_project_on_failure = False

    def generate_files(repo_dir, context=None, output_dir='.',
        overwrite_if_exists=False, skip_if_file_exists=False, accept_hooks=True,
        keep_project_on_failure=False):
        """Render the templates and saves them to files.

        :param repo_dir: Project template input directory.
        :param context: Dict for populating the template's variables.
        :param output_dir: Where to output the generated project dir into.
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
>       template_dir = find_template(repo_dir)
E       TypeError: find_template() missing 1 required positional argument: 'env'

cookiecutter/generate.py:200: TypeError

test_output_folder.py::test_exception_when_output_folder_exists

test_output_folder.py::test_exception_when_output_folder_exists
@pytest.mark.usefixtures('clean_system', 'remove_output_folder')
    def test_exception_when_output_folder_exists():
        """Tests should raise error as output folder created before `generate_files`."""
        context = generate.generate_context(
            context_file='tests/test-output-folder/cookiecutter.json'
        )
>       output_folder = context['cookiecutter']['test_name']
E       KeyError: 'cookiecutter'

tests/test_output_folder.py:53: KeyError

test_pre_prompt_hooks.py::test_run_pre_prompt_python_hook

test_pre_prompt_hooks.py::test_run_pre_prompt_python_hook
remove_tmp_repo_dir = ._func at 0x7ee47d9101f0>

    def test_run_pre_prompt_python_hook(remove_tmp_repo_dir):
        """Verify pre_prompt.py runs and creates a copy of cookiecutter.json."""
        new_repo_dir = hooks.run_pre_prompt_hook(repo_dir='tests/test-pyhooks/')
        assert new_repo_dir.exists()
        bkp_config = new_repo_dir / "_cookiecutter.json"
>       assert bkp_config.exists()
E       AssertionError: assert False
E        +  where False = exists()
E        +    where exists = PosixPath('tests/test-pyhooks/_cookiecutter.json').exists

tests/test_pre_prompt_hooks.py:30: AssertionError

test_pre_prompt_hooks.py::test_run_pre_prompt_python_hook_fail

test_pre_prompt_hooks.py::test_run_pre_prompt_python_hook_fail
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7ee47e115660>

    def test_run_pre_prompt_python_hook_fail(monkeypatch):
        """Verify pre_prompt.py will fail when a given env var is present."""
        message = 'Pre-Prompt Hook script failed'
        with monkeypatch.context() as m:
            m.setenv('COOKIECUTTER_FAIL_PRE_PROMPT', '1')
            with pytest.raises(FailedHookException) as excinfo:
>               hooks.run_pre_prompt_hook(repo_dir='tests/test-pyhooks/')

tests/test_pre_prompt_hooks.py:40: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
cookiecutter/hooks.py:151: in run_pre_prompt_hook
    run_hook_from_repo_dir(
cookiecutter/hooks.py:124: in run_hook_from_repo_dir
    run_hook(hook_name, project_dir, context)
cookiecutter/hooks.py:106: in run_hook
    run_script(hook_path, project_dir)
cookiecutter/hooks.py:62: in run_script
    subprocess.check_call([sys.executable, script_path], cwd=cwd)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

popenargs = (['/testbed/.venv/bin/python3', '/tmp/tmptjwdwlcu/hooks/pre_prompt.py'],)
kwargs = {'cwd': PosixPath('/tmp/tmptjwdwlcu')}, retcode = 1
cmd = ['/testbed/.venv/bin/python3', '/tmp/tmptjwdwlcu/hooks/pre_prompt.py']

    def check_call(*popenargs, **kwargs):
        """Run command with arguments.  Wait for command to complete.  If
        the exit code was zero then return, otherwise raise
        CalledProcessError.  The CalledProcessError object will have the
        return code in the returncode attribute.

        The arguments are the same as for the call function.  Example:

        check_call(["ls", "-l"])
        """
        retcode = call(*popenargs, **kwargs)
        if retcode:
            cmd = kwargs.get("args")
            if cmd is None:
                cmd = popenargs[0]
>           raise CalledProcessError(retcode, cmd)
E           subprocess.CalledProcessError: Command '['/testbed/.venv/bin/python3', '/tmp/tmptjwdwlcu/hooks/pre_prompt.py']' returned non-zero exit status 1.

/usr/lib/python3.10/subprocess.py:369: CalledProcessError

test_pre_prompt_hooks.py::test_run_pre_prompt_shell_hook

test_pre_prompt_hooks.py::test_run_pre_prompt_shell_hook
remove_tmp_repo_dir = ._func at 0x7ee47d859630>

    @pytest.mark.skipif(WINDOWS, reason='shell script will not run in Windows')
    def test_run_pre_prompt_shell_hook(remove_tmp_repo_dir):
        """Verify pre_prompt.sh runs and creates a copy of cookiecutter.json."""
        new_repo_dir = hooks.run_pre_prompt_hook(repo_dir='tests/test-pyshellhooks/')
        assert new_repo_dir.exists()
        bkp_config = new_repo_dir / "_cookiecutter.json"
>       assert bkp_config.exists()
E       AssertionError: assert False
E        +  where False = exists()
E        +    where exists = PosixPath('tests/test-pyshellhooks/_cookiecutter.json').exists

tests/test_pre_prompt_hooks.py:50: AssertionError

test_prompt.py::TestRenderVariable::test_convert_to_str[1-1]

test_prompt.py::TestRenderVariable::test_convert_to_str[1-1]
self = 
mocker = 
raw_var = 1, rendered_var = '1'

    @pytest.mark.parametrize(
        'raw_var, rendered_var',
        [
            (1, '1'),
            (True, True),
            ('foo', 'foo'),
            ('{{cookiecutter.project}}', 'foobar'),
            (None, None),
        ],
    )
    def test_convert_to_str(self, mocker, raw_var, rendered_var):
        """Verify simple items correctly rendered to strings."""
        env = environment.StrictEnvironment()
        from_string = mocker.patch(
            'cookiecutter.utils.StrictEnvironment.from_string', wraps=env.from_string
        )
        context = {'project': 'foobar'}

>       result = prompt.render_variable(env, raw_var, context)

tests/test_prompt.py:43: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
cookiecutter/prompt.py:150: in render_variable
    template = env.from_string(raw)
/usr/lib/python3.10/unittest/mock.py:1114: in __call__
    return self._mock_call(*args, **kwargs)
/usr/lib/python3.10/unittest/mock.py:1118: in _mock_call
    return self._execute_mock_call(*args, **kwargs)
/usr/lib/python3.10/unittest/mock.py:1188: in _execute_mock_call
    return self._mock_wraps(*args, **kwargs)
.venv/lib/python3.10/site-packages/jinja2/environment.py:1108: in from_string
    return cls.from_code(self, self.compile(source), gs, None)
.venv/lib/python3.10/site-packages/jinja2/environment.py:761: in compile
    source = self._generate(source, name, filename, defer_init=defer_init)
.venv/lib/python3.10/site-packages/jinja2/environment.py:691: in _generate
    return generate(  # type: ignore
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

node = 1
environment = 
name = None, filename = None, stream = None, defer_init = False
optimized = True

    def generate(
        node: nodes.Template,
        environment: "Environment",
        name: t.Optional[str],
        filename: t.Optional[str],
        stream: t.Optional[t.TextIO] = None,
        defer_init: bool = False,
        optimized: bool = True,
    ) -> t.Optional[str]:
        """Generate the python source for a node tree."""
        if not isinstance(node, nodes.Template):
>           raise TypeError("Can't compile non template nodes")
E           TypeError: Can't compile non template nodes

.venv/lib/python3.10/site-packages/jinja2/compiler.py:112: TypeError

test_prompt.py::TestRenderVariable::test_convert_to_str[True-True]

test_prompt.py::TestRenderVariable::test_convert_to_str[True-True]
self = 
mocker = 
raw_var = True, rendered_var = True

    @pytest.mark.parametrize(
        'raw_var, rendered_var',
        [
            (1, '1'),
            (True, True),
            ('foo', 'foo'),
            ('{{cookiecutter.project}}', 'foobar'),
            (None, None),
        ],
    )
    def test_convert_to_str(self, mocker, raw_var, rendered_var):
        """Verify simple items correctly rendered to strings."""
        env = environment.StrictEnvironment()
        from_string = mocker.patch(
            'cookiecutter.utils.StrictEnvironment.from_string', wraps=env.from_string
        )
        context = {'project': 'foobar'}

>       result = prompt.render_variable(env, raw_var, context)

tests/test_prompt.py:43: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
cookiecutter/prompt.py:150: in render_variable
    template = env.from_string(raw)
/usr/lib/python3.10/unittest/mock.py:1114: in __call__
    return self._mock_call(*args, **kwargs)
/usr/lib/python3.10/unittest/mock.py:1118: in _mock_call
    return self._execute_mock_call(*args, **kwargs)
/usr/lib/python3.10/unittest/mock.py:1188: in _execute_mock_call
    return self._mock_wraps(*args, **kwargs)
.venv/lib/python3.10/site-packages/jinja2/environment.py:1108: in from_string
    return cls.from_code(self, self.compile(source), gs, None)
.venv/lib/python3.10/site-packages/jinja2/environment.py:761: in compile
    source = self._generate(source, name, filename, defer_init=defer_init)
.venv/lib/python3.10/site-packages/jinja2/environment.py:691: in _generate
    return generate(  # type: ignore
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

node = True
environment = 
name = None, filename = None, stream = None, defer_init = False
optimized = True

    def generate(
        node: nodes.Template,
        environment: "Environment",
        name: t.Optional[str],
        filename: t.Optional[str],
        stream: t.Optional[t.TextIO] = None,
        defer_init: bool = False,
        optimized: bool = True,
    ) -> t.Optional[str]:
        """Generate the python source for a node tree."""
        if not isinstance(node, nodes.Template):
>           raise TypeError("Can't compile non template nodes")
E           TypeError: Can't compile non template nodes

.venv/lib/python3.10/site-packages/jinja2/compiler.py:112: TypeError

test_prompt.py::TestRenderVariable::test_convert_to_str[{{cookiecutter.project}}-foobar]

test_prompt.py::TestRenderVariable::test_convert_to_str[{{cookiecutter.project}}-foobar]
env = 
raw = '{{cookiecutter.project}}', cookiecutter_dict = {'project': 'foobar'}

    def render_variable(env, raw, cookiecutter_dict):
        """Render the next variable to be displayed in the user prompt.

        Inside the prompting taken from the cookiecutter.json file, this renders
        the next variable. For example, if a project_name is "Peanut Butter
        Cookie", the repo_name could be be rendered with:

            `{{ cookiecutter.project_name.replace(" ", "_") }}`.

        This is then presented to the user as the default.

        :param Environment env: A Jinja2 Environment object.
        :param raw: The next value to be prompted for by the user.
        :param dict cookiecutter_dict: The current context as it's gradually
            being populated with variables.
        :return: The rendered value for the default variable.
        """
        try:
            template = env.from_string(raw)
>           return template.render(**cookiecutter_dict)

cookiecutter/prompt.py:151: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.10/site-packages/jinja2/environment.py:1304: in render
    self.environment.handle_exception()
.venv/lib/python3.10/site-packages/jinja2/environment.py:939: in handle_exception
    raise rewrite_traceback_stack(source=source)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = 
obj = Undefined, attribute = 'project'

    def getattr(self, obj: t.Any, attribute: str) -> t.Any:
        """Get an item or attribute of an object but prefer the attribute.
        Unlike :meth:`getitem` the attribute *must* be a string.
        """
        try:
>           return getattr(obj, attribute)
E           jinja2.exceptions.UndefinedError: 'cookiecutter' is undefined

.venv/lib/python3.10/site-packages/jinja2/environment.py:487: UndefinedError

During handling of the above exception, another exception occurred:

self = 
mocker = 
raw_var = '{{cookiecutter.project}}', rendered_var = 'foobar'

    @pytest.mark.parametrize(
        'raw_var, rendered_var',
        [
            (1, '1'),
            (True, True),
            ('foo', 'foo'),
            ('{{cookiecutter.project}}', 'foobar'),
            (None, None),
        ],
    )
    def test_convert_to_str(self, mocker, raw_var, rendered_var):
        """Verify simple items correctly rendered to strings."""
        env = environment.StrictEnvironment()
        from_string = mocker.patch(
            'cookiecutter.utils.StrictEnvironment.from_string', wraps=env.from_string
        )
        context = {'project': 'foobar'}

>       result = prompt.render_variable(env, raw_var, context)

tests/test_prompt.py:43: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

env = 
raw = '{{cookiecutter.project}}', cookiecutter_dict = {'project': 'foobar'}

    def render_variable(env, raw, cookiecutter_dict):
        """Render the next variable to be displayed in the user prompt.

        Inside the prompting taken from the cookiecutter.json file, this renders
        the next variable. For example, if a project_name is "Peanut Butter
        Cookie", the repo_name could be be rendered with:

            `{{ cookiecutter.project_name.replace(" ", "_") }}`.

        This is then presented to the user as the default.

        :param Environment env: A Jinja2 Environment object.
        :param raw: The next value to be prompted for by the user.
        :param dict cookiecutter_dict: The current context as it's gradually
            being populated with variables.
        :return: The rendered value for the default variable.
        """
        try:
            template = env.from_string(raw)
            return template.render(**cookiecutter_dict)
        except UndefinedError as err:
>           raise UndefinedVariableInTemplate(str(err), err, cookiecutter_dict)
E           cookiecutter.exceptions.UndefinedVariableInTemplate: 'cookiecutter' is undefined. Error message: 'cookiecutter' is undefined. Context: {'project': 'foobar'}

cookiecutter/prompt.py:153: UndefinedVariableInTemplate

test_prompt.py::TestRenderVariable::test_convert_to_str[None-None]

test_prompt.py::TestRenderVariable::test_convert_to_str[None-None]
self = 
mocker = 
raw_var = None, rendered_var = None

    @pytest.mark.parametrize(
        'raw_var, rendered_var',
        [
            (1, '1'),
            (True, True),
            ('foo', 'foo'),
            ('{{cookiecutter.project}}', 'foobar'),
            (None, None),
        ],
    )
    def test_convert_to_str(self, mocker, raw_var, rendered_var):
        """Verify simple items correctly rendered to strings."""
        env = environment.StrictEnvironment()
        from_string = mocker.patch(
            'cookiecutter.utils.StrictEnvironment.from_string', wraps=env.from_string
        )
        context = {'project': 'foobar'}

>       result = prompt.render_variable(env, raw_var, context)

tests/test_prompt.py:43: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
cookiecutter/prompt.py:150: in render_variable
    template = env.from_string(raw)
/usr/lib/python3.10/unittest/mock.py:1114: in __call__
    return self._mock_call(*args, **kwargs)
/usr/lib/python3.10/unittest/mock.py:1118: in _mock_call
    return self._execute_mock_call(*args, **kwargs)
/usr/lib/python3.10/unittest/mock.py:1188: in _execute_mock_call
    return self._mock_wraps(*args, **kwargs)
.venv/lib/python3.10/site-packages/jinja2/environment.py:1108: in from_string
    return cls.from_code(self, self.compile(source), gs, None)
.venv/lib/python3.10/site-packages/jinja2/environment.py:761: in compile
    source = self._generate(source, name, filename, defer_init=defer_init)
.venv/lib/python3.10/site-packages/jinja2/environment.py:691: in _generate
    return generate(  # type: ignore
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

node = None
environment = 
name = None, filename = None, stream = None, defer_init = False
optimized = True

    def generate(
        node: nodes.Template,
        environment: "Environment",
        name: t.Optional[str],
        filename: t.Optional[str],
        stream: t.Optional[t.TextIO] = None,
        defer_init: bool = False,
        optimized: bool = True,
    ) -> t.Optional[str]:
        """Generate the python source for a node tree."""
        if not isinstance(node, nodes.Template):
>           raise TypeError("Can't compile non template nodes")
E           TypeError: Can't compile non template nodes

.venv/lib/python3.10/site-packages/jinja2/compiler.py:112: TypeError

test_prompt.py::TestRenderVariable::test_convert_to_str_complex_variables[raw_var0-rendered_var0]

test_prompt.py::TestRenderVariable::test_convert_to_str_complex_variables[raw_var0-rendered_var0]
self = 
raw_var = {1: True, 'foo': False}, rendered_var = {'1': True, 'foo': False}

    @pytest.mark.parametrize(
        'raw_var, rendered_var',
        [
            ({1: True, 'foo': False}, {'1': True, 'foo': False}),
            (
                {'{{cookiecutter.project}}': ['foo', 1], 'bar': False},
                {'foobar': ['foo', '1'], 'bar': False},
            ),
            (['foo', '{{cookiecutter.project}}', None], ['foo', 'foobar', None]),
        ],
    )
    def test_convert_to_str_complex_variables(self, raw_var, rendered_var):
        """Verify tree items correctly rendered."""
        env = environment.StrictEnvironment()
        context = {'project': 'foobar'}

>       result = prompt.render_variable(env, raw_var, context)

tests/test_prompt.py:70: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
cookiecutter/prompt.py:150: in render_variable
    template = env.from_string(raw)
.venv/lib/python3.10/site-packages/jinja2/environment.py:1108: in from_string
    return cls.from_code(self, self.compile(source), gs, None)
.venv/lib/python3.10/site-packages/jinja2/environment.py:761: in compile
    source = self._generate(source, name, filename, defer_init=defer_init)
.venv/lib/python3.10/site-packages/jinja2/environment.py:691: in _generate
    return generate(  # type: ignore
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

node = {1: True, 'foo': False}
environment = 
name = None, filename = None, stream = None, defer_init = False
optimized = True

    def generate(
        node: nodes.Template,
        environment: "Environment",
        name: t.Optional[str],
        filename: t.Optional[str],
        stream: t.Optional[t.TextIO] = None,
        defer_init: bool = False,
        optimized: bool = True,
    ) -> t.Optional[str]:
        """Generate the python source for a node tree."""
        if not isinstance(node, nodes.Template):
>           raise TypeError("Can't compile non template nodes")
E           TypeError: Can't compile non template nodes

.venv/lib/python3.10/site-packages/jinja2/compiler.py:112: TypeError

test_prompt.py::TestRenderVariable::test_convert_to_str_complex_variables[raw_var1-rendered_var1]

test_prompt.py::TestRenderVariable::test_convert_to_str_complex_variables[raw_var1-rendered_var1]
self = 
raw_var = {'bar': False, '{{cookiecutter.project}}': ['foo', 1]}
rendered_var = {'bar': False, 'foobar': ['foo', '1']}

    @pytest.mark.parametrize(
        'raw_var, rendered_var',
        [
            ({1: True, 'foo': False}, {'1': True, 'foo': False}),
            (
                {'{{cookiecutter.project}}': ['foo', 1], 'bar': False},
                {'foobar': ['foo', '1'], 'bar': False},
            ),
            (['foo', '{{cookiecutter.project}}', None], ['foo', 'foobar', None]),
        ],
    )
    def test_convert_to_str_complex_variables(self, raw_var, rendered_var):
        """Verify tree items correctly rendered."""
        env = environment.StrictEnvironment()
        context = {'project': 'foobar'}

>       result = prompt.render_variable(env, raw_var, context)

tests/test_prompt.py:70: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
cookiecutter/prompt.py:150: in render_variable
    template = env.from_string(raw)
.venv/lib/python3.10/site-packages/jinja2/environment.py:1108: in from_string
    return cls.from_code(self, self.compile(source), gs, None)
.venv/lib/python3.10/site-packages/jinja2/environment.py:761: in compile
    source = self._generate(source, name, filename, defer_init=defer_init)
.venv/lib/python3.10/site-packages/jinja2/environment.py:691: in _generate
    return generate(  # type: ignore
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

node = {'bar': False, '{{cookiecutter.project}}': ['foo', 1]}
environment = 
name = None, filename = None, stream = None, defer_init = False
optimized = True

    def generate(
        node: nodes.Template,
        environment: "Environment",
        name: t.Optional[str],
        filename: t.Optional[str],
        stream: t.Optional[t.TextIO] = None,
        defer_init: bool = False,
        optimized: bool = True,
    ) -> t.Optional[str]:
        """Generate the python source for a node tree."""
        if not isinstance(node, nodes.Template):
>           raise TypeError("Can't compile non template nodes")
E           TypeError: Can't compile non template nodes

.venv/lib/python3.10/site-packages/jinja2/compiler.py:112: TypeError

test_prompt.py::TestRenderVariable::test_convert_to_str_complex_variables[raw_var2-rendered_var2]

test_prompt.py::TestRenderVariable::test_convert_to_str_complex_variables[raw_var2-rendered_var2]
self = 
raw_var = ['foo', '{{cookiecutter.project}}', None]
rendered_var = ['foo', 'foobar', None]

    @pytest.mark.parametrize(
        'raw_var, rendered_var',
        [
            ({1: True, 'foo': False}, {'1': True, 'foo': False}),
            (
                {'{{cookiecutter.project}}': ['foo', 1], 'bar': False},
                {'foobar': ['foo', '1'], 'bar': False},
            ),
            (['foo', '{{cookiecutter.project}}', None], ['foo', 'foobar', None]),
        ],
    )
    def test_convert_to_str_complex_variables(self, raw_var, rendered_var):
        """Verify tree items correctly rendered."""
        env = environment.StrictEnvironment()
        context = {'project': 'foobar'}

>       result = prompt.render_variable(env, raw_var, context)

tests/test_prompt.py:70: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
cookiecutter/prompt.py:150: in render_variable
    template = env.from_string(raw)
.venv/lib/python3.10/site-packages/jinja2/environment.py:1108: in from_string
    return cls.from_code(self, self.compile(source), gs, None)
.venv/lib/python3.10/site-packages/jinja2/environment.py:761: in compile
    source = self._generate(source, name, filename, defer_init=defer_init)
.venv/lib/python3.10/site-packages/jinja2/environment.py:691: in _generate
    return generate(  # type: ignore
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

node = ['foo', '{{cookiecutter.project}}', None]
environment = 
name = None, filename = None, stream = None, defer_init = False
optimized = True

    def generate(
        node: nodes.Template,
        environment: "Environment",
        name: t.Optional[str],
        filename: t.Optional[str],
        stream: t.Optional[t.TextIO] = None,
        defer_init: bool = False,
        optimized: bool = True,
    ) -> t.Optional[str]:
        """Generate the python source for a node tree."""
        if not isinstance(node, nodes.Template):
>           raise TypeError("Can't compile non template nodes")
E           TypeError: Can't compile non template nodes

.venv/lib/python3.10/site-packages/jinja2/compiler.py:112: TypeError

input]

input]
self = 
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7ee4804a9210>
context = {'cookiecutter': {'full_name': 'Your Name'}}

    @pytest.mark.parametrize(
        'context',
        [
            {'cookiecutter': {'full_name': 'Your Name'}},
            {'cookiecutter': {'full_name': 'Řekni či napiš své jméno'}},
        ],
        ids=['ASCII default prompt/input', 'Unicode default prompt/input'],
    )
    def test_prompt_for_config(self, monkeypatch, context):
        """Verify `prompt_for_config` call `read_user_variable` on text request."""
        monkeypatch.setattr(
            'cookiecutter.prompt.read_user_variable',
            lambda var, default, prompts, prefix: default,
        )

>       cookiecutter_dict = prompt.prompt_for_config(context)

tests/test_prompt.py:92: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

context = {'cookiecutter': {'full_name': 'Your Name'}}, no_input = False

    def prompt_for_config(context, no_input=False):
        """Prompt user to enter a new config.

        :param dict context: Source for field names and sample values.
        :param no_input: Do not prompt for user input and use only values from context.
        """
        cookiecutter_dict = OrderedDict([])
        env = create_env_with_context(context)

        for key, raw in context['cookiecutter'].items():
            if key.startswith('_'):
                cookiecutter_dict[key] = raw
                continue

            if isinstance(raw, dict):
                cookiecutter_dict[key] = prompt_choice_for_config(
                    cookiecutter_dict, env, key, raw, no_input
                )
            else:
                if no_input:
                    cookiecutter_dict[key] = raw
                else:
>                   cookiecutter_dict[key] = read_user_variable(key, raw)
E                   TypeError: TestPrompt.test_prompt_for_config..() missing 2 required positional arguments: 'prompts' and 'prefix'

cookiecutter/prompt.py:227: TypeError

input]

input]
self = 
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7ee47dd58f40>
context = {'cookiecutter': {'full_name': 'Řekni či napiš své jméno'}}

    @pytest.mark.parametrize(
        'context',
        [
            {'cookiecutter': {'full_name': 'Your Name'}},
            {'cookiecutter': {'full_name': 'Řekni či napiš své jméno'}},
        ],
        ids=['ASCII default prompt/input', 'Unicode default prompt/input'],
    )
    def test_prompt_for_config(self, monkeypatch, context):
        """Verify `prompt_for_config` call `read_user_variable` on text request."""
        monkeypatch.setattr(
            'cookiecutter.prompt.read_user_variable',
            lambda var, default, prompts, prefix: default,
        )

>       cookiecutter_dict = prompt.prompt_for_config(context)

tests/test_prompt.py:92: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

context = {'cookiecutter': {'full_name': 'Řekni či napiš své jméno'}}
no_input = False

    def prompt_for_config(context, no_input=False):
        """Prompt user to enter a new config.

        :param dict context: Source for field names and sample values.
        :param no_input: Do not prompt for user input and use only values from context.
        """
        cookiecutter_dict = OrderedDict([])
        env = create_env_with_context(context)

        for key, raw in context['cookiecutter'].items():
            if key.startswith('_'):
                cookiecutter_dict[key] = raw
                continue

            if isinstance(raw, dict):
                cookiecutter_dict[key] = prompt_choice_for_config(
                    cookiecutter_dict, env, key, raw, no_input
                )
            else:
                if no_input:
                    cookiecutter_dict[key] = raw
                else:
>                   cookiecutter_dict[key] = read_user_variable(key, raw)
E                   TypeError: TestPrompt.test_prompt_for_config..() missing 2 required positional arguments: 'prompts' and 'prefix'

cookiecutter/prompt.py:227: TypeError

input]

input]
self = 
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7ee47e119660>
context = {'cookiecutter': {'__prompts__': {'check': 'Checking', 'full_name': 'Name please'}, 'check': ['yes', 'no'], 'full_name': 'Your Name', 'nothing': 'ok'}}

    @pytest.mark.parametrize(
        'context',
        [
            {
                'cookiecutter': {
                    'full_name': 'Your Name',
                    'check': ['yes', 'no'],
                    'nothing': 'ok',
                    '__prompts__': {
                        'full_name': 'Name please',
                        'check': 'Checking',
                    },
                }
            },
        ],
        ids=['ASCII default prompt/input'],
    )
    def test_prompt_for_config_with_human_prompts(self, monkeypatch, context):
        """Verify call `read_user_variable` on request when human-readable prompts."""
        monkeypatch.setattr(
            'cookiecutter.prompt.read_user_variable',
            lambda var, default, prompts, prefix: default,
        )
        monkeypatch.setattr(
            'cookiecutter.prompt.read_user_yes_no',
            lambda var, default, prompts, prefix: default,
        )
        monkeypatch.setattr(
            'cookiecutter.prompt.read_user_choice',
            lambda var, default, prompts, prefix: default,
        )

>       cookiecutter_dict = prompt.prompt_for_config(context)

tests/test_prompt.py:127: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

context = {'cookiecutter': {'__prompts__': {'check': 'Checking', 'full_name': 'Name please'}, 'check': ['yes', 'no'], 'full_name': 'Your Name', 'nothing': 'ok'}}
no_input = False

    def prompt_for_config(context, no_input=False):
        """Prompt user to enter a new config.

        :param dict context: Source for field names and sample values.
        :param no_input: Do not prompt for user input and use only values from context.
        """
        cookiecutter_dict = OrderedDict([])
        env = create_env_with_context(context)

        for key, raw in context['cookiecutter'].items():
            if key.startswith('_'):
                cookiecutter_dict[key] = raw
                continue

            if isinstance(raw, dict):
                cookiecutter_dict[key] = prompt_choice_for_config(
                    cookiecutter_dict, env, key, raw, no_input
                )
            else:
                if no_input:
                    cookiecutter_dict[key] = raw
                else:
>                   cookiecutter_dict[key] = read_user_variable(key, raw)
E                   TypeError: TestPrompt.test_prompt_for_config_with_human_prompts..() missing 2 required positional arguments: 'prompts' and 'prefix'

cookiecutter/prompt.py:227: TypeError

test_prompt.py::TestPrompt::test_prompt_for_config_with_human_choices[context0]

test_prompt.py::TestPrompt::test_prompt_for_config_with_human_choices[context0]
self = 
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7ee47dfc0b20>
context = {'cookiecutter': {'__prompts__': {'check': 'Checking'}, 'check': ['yes', 'no'], 'full_name': 'Your Name'}}

    @pytest.mark.parametrize(
        'context',
        [
            {
                'cookiecutter': {
                    'full_name': 'Your Name',
                    'check': ['yes', 'no'],
                    '__prompts__': {
                        'check': 'Checking',
                    },
                }
            },
            {
                'cookiecutter': {
                    'full_name': 'Your Name',
                    'check': ['yes', 'no'],
                    '__prompts__': {
                        'full_name': 'Name please',
                        'check': {'__prompt__': 'Checking', 'yes': 'Yes', 'no': 'No'},
                    },
                }
            },
            {
                'cookiecutter': {
                    'full_name': 'Your Name',
                    'check': ['yes', 'no'],
                    '__prompts__': {
                        'full_name': 'Name please',
                        'check': {'no': 'No'},
                    },
                }
            },
        ],
    )
    def test_prompt_for_config_with_human_choices(self, monkeypatch, context):
        """Test prompts when human-readable labels for user choices."""
        runner = click.testing.CliRunner()
        with runner.isolation(input="\n\n\n"):
            cookiecutter_dict = prompt.prompt_for_config(context)

>       assert dict(cookiecutter_dict) == {'full_name': 'Your Name', 'check': 'yes'}
E       AssertionError: assert {'full_name': 'Your Name', 'check': ['yes', 'no'], '__prompts__': {'check': 'Checking'}} == {'full_name': 'Your Name', 'check': 'yes'}
E         
E         Common items:
E         {'full_name': 'Your Name'}
E         Differing items:
E         {'check': ['yes', 'no']} != {'check': 'yes'}
E         Left contains 1 more item:
E         {'__prompts__': {'check': 'Checking'}}
E         
E         Full diff:
E           {
E         +     '__prompts__': {
E         +         'check': 'Checking',
E         +     },
E         -     'check': 'yes',
E         ?              ^^^^^^
E         +     'check': [
E         ?              ^
E         +         'yes',
E         +         'no',
E         +     ],
E               'full_name': 'Your Name',
E           }

tests/test_prompt.py:170: AssertionError

test_prompt.py::TestPrompt::test_prompt_for_config_with_human_choices[context1]

test_prompt.py::TestPrompt::test_prompt_for_config_with_human_choices[context1]
self = 
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7ee47dedf0d0>
context = {'cookiecutter': {'__prompts__': {'check': {'__prompt__': 'Checking', 'no': 'No', 'yes': 'Yes'}, 'full_name': 'Name please'}, 'check': ['yes', 'no'], 'full_name': 'Your Name'}}

    @pytest.mark.parametrize(
        'context',
        [
            {
                'cookiecutter': {
                    'full_name': 'Your Name',
                    'check': ['yes', 'no'],
                    '__prompts__': {
                        'check': 'Checking',
                    },
                }
            },
            {
                'cookiecutter': {
                    'full_name': 'Your Name',
                    'check': ['yes', 'no'],
                    '__prompts__': {
                        'full_name': 'Name please',
                        'check': {'__prompt__': 'Checking', 'yes': 'Yes', 'no': 'No'},
                    },
                }
            },
            {
                'cookiecutter': {
                    'full_name': 'Your Name',
                    'check': ['yes', 'no'],
                    '__prompts__': {
                        'full_name': 'Name please',
                        'check': {'no': 'No'},
                    },
                }
            },
        ],
    )
    def test_prompt_for_config_with_human_choices(self, monkeypatch, context):
        """Test prompts when human-readable labels for user choices."""
        runner = click.testing.CliRunner()
        with runner.isolation(input="\n\n\n"):
            cookiecutter_dict = prompt.prompt_for_config(context)

>       assert dict(cookiecutter_dict) == {'full_name': 'Your Name', 'check': 'yes'}
E       AssertionError: assert {'full_name': 'Your Name', 'check': ['yes', 'no'], '__prompts__': {'full_name': 'Name please', 'check': {'__prompt__': 'Checking', 'yes': 'Yes', 'no': 'No'}}} == {'full_name': 'Your Name', 'check': 'yes'}
E         
E         Common items:
E         {'full_name': 'Your Name'}
E         Differing items:
E         {'check': ['yes', 'no']} != {'check': 'yes'}
E         Left contains 1 more item:
E         {'__prompts__': {'check': {'__prompt__': 'Checking', 'no': 'No', 'yes': 'Yes'},
E                          'full_name': 'Name please'}}
E         
E         Full diff:
E           {
E         +     '__prompts__': {
E         +         'check': {
E         +             '__prompt__': 'Checking',
E         +             'no': 'No',
E         +             'yes': 'Yes',
E         +         },
E         +         'full_name': 'Name please',
E         +     },
E         -     'check': 'yes',
E         ?              ^^^^^^
E         +     'check': [
E         ?              ^
E         +         'yes',
E         +         'no',
E         +     ],
E               'full_name': 'Your Name',
E           }

tests/test_prompt.py:170: AssertionError

test_prompt.py::TestPrompt::test_prompt_for_config_with_human_choices[context2]

test_prompt.py::TestPrompt::test_prompt_for_config_with_human_choices[context2]
self = 
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7ee47d274c40>
context = {'cookiecutter': {'__prompts__': {'check': {'no': 'No'}, 'full_name': 'Name please'}, 'check': ['yes', 'no'], 'full_name': 'Your Name'}}

    @pytest.mark.parametrize(
        'context',
        [
            {
                'cookiecutter': {
                    'full_name': 'Your Name',
                    'check': ['yes', 'no'],
                    '__prompts__': {
                        'check': 'Checking',
                    },
                }
            },
            {
                'cookiecutter': {
                    'full_name': 'Your Name',
                    'check': ['yes', 'no'],
                    '__prompts__': {
                        'full_name': 'Name please',
                        'check': {'__prompt__': 'Checking', 'yes': 'Yes', 'no': 'No'},
                    },
                }
            },
            {
                'cookiecutter': {
                    'full_name': 'Your Name',
                    'check': ['yes', 'no'],
                    '__prompts__': {
                        'full_name': 'Name please',
                        'check': {'no': 'No'},
                    },
                }
            },
        ],
    )
    def test_prompt_for_config_with_human_choices(self, monkeypatch, context):
        """Test prompts when human-readable labels for user choices."""
        runner = click.testing.CliRunner()
        with runner.isolation(input="\n\n\n"):
            cookiecutter_dict = prompt.prompt_for_config(context)

>       assert dict(cookiecutter_dict) == {'full_name': 'Your Name', 'check': 'yes'}
E       AssertionError: assert {'full_name': 'Your Name', 'check': ['yes', 'no'], '__prompts__': {'full_name': 'Name please', 'check': {'no': 'No'}}} == {'full_name': 'Your Name', 'check': 'yes'}
E         
E         Common items:
E         {'full_name': 'Your Name'}
E         Differing items:
E         {'check': ['yes', 'no']} != {'check': 'yes'}
E         Left contains 1 more item:
E         {'__prompts__': {'check': {'no': 'No'}, 'full_name': 'Name please'}}
E         
E         Full diff:
E           {
E         +     '__prompts__': {
E         +         'check': {
E         +             'no': 'No',
E         +         },
E         +         'full_name': 'Name please',
E         +     },
E         -     'check': 'yes',
E         ?              ^^^^^^
E         +     'check': [
E         ?              ^
E         +         'yes',
E         +         'no',
E         +     ],
E               'full_name': 'Your Name',
E           }

tests/test_prompt.py:170: AssertionError

test_prompt.py::TestPrompt::test_prompt_for_config_dict

test_prompt.py::TestPrompt::test_prompt_for_config_dict
self = 
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7ee47dfaa830>

    def test_prompt_for_config_dict(self, monkeypatch):
        """Verify `prompt_for_config` call `read_user_variable` on dict request."""
        monkeypatch.setattr(
            'cookiecutter.prompt.read_user_dict',
            lambda var, default, prompts, prefix: {"key": "value", "integer": 37},
        )
        context = {'cookiecutter': {'details': {}}}

>       cookiecutter_dict = prompt.prompt_for_config(context)

tests/test_prompt.py:180: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
cookiecutter/prompt.py:220: in prompt_for_config
    cookiecutter_dict[key] = prompt_choice_for_config(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

cookiecutter_dict = OrderedDict()
env = 
key = 'details', options = {}, no_input = False, prompts = None, prefix = ''

    def prompt_choice_for_config(cookiecutter_dict, env, key, options, no_input,
        prompts=None, prefix=''):
        """Prompt user with a set of options to choose from.

        :param no_input: Do not prompt for user input and return the first available option.
        """
        if no_input:
            return next(iter(options.keys()))

        choices = list(options.keys())
        prompt_text = f"{prefix}{key}"
        if prompts and key in prompts:
            prompt_text = prompts[key]

        rendered_choices = [render_variable(env, choice, cookiecutter_dict) for choice in choices]
        return Prompt.ask(
            prompt_text,
            choices=rendered_choices,
>           default=rendered_choices[0]
        )
E       IndexError: list index out of range

cookiecutter/prompt.py:201: IndexError

test_prompt.py::TestPrompt::test_should_render_dict

test_prompt.py::TestPrompt::test_should_render_dict
self = 

    def test_should_render_dict(self):
        """Verify template inside dictionary variable rendered."""
        context = {
            'cookiecutter': {
                'project_name': 'Slartibartfast',
                'details': {
                    '{{cookiecutter.project_name}}': '{{cookiecutter.project_name}}'
                },
            }
        }

        cookiecutter_dict = prompt.prompt_for_config(context, no_input=True)
>       assert cookiecutter_dict == {
            'project_name': 'Slartibartfast',
            'details': {'Slartibartfast': 'Slartibartfast'},
        }
E       AssertionError: assert OrderedDict([('project_name', 'Slartibartfast'), ('details', '{{cookiecutter.project_name}}')]) == {'project_name': 'Slartibartfast', 'details': {'Slartibartfast': 'Slartibartfast'}}
E         
E         Common items:
E         {'project_name': 'Slartibartfast'}
E         Differing items:
E         {'details': '{{cookiecutter.project_name}}'} != {'details': {'Slartibartfast': 'Slartibartfast'}}
E         
E         Full diff:
E         + OrderedDict({
E         +     'details': '{{cookiecutter.project_name}}',
E         - {
E         -     'details': {
E         -         'Slartibartfast': 'Slartibartfast',
E         -     },
E               'project_name': 'Slartibartfast',
E         - }
E         + })

tests/test_prompt.py:195: AssertionError

test_prompt.py::TestPrompt::test_should_render_deep_dict

test_prompt.py::TestPrompt::test_should_render_deep_dict
self = 

    def test_should_render_deep_dict(self):
        """Verify nested structures like dict in dict, rendered correctly."""
        context = {
            'cookiecutter': {
                'project_name': "Slartibartfast",
                'details': {
                    "key": "value",
                    "integer_key": 37,
                    "other_name": '{{cookiecutter.project_name}}',
                    "dict_key": {
                        "deep_key": "deep_value",
                        "deep_integer": 42,
                        "deep_other_name": '{{cookiecutter.project_name}}',
                        "deep_list": [
                            "deep value 1",
                            "{{cookiecutter.project_name}}",
                            "deep value 3",
                        ],
                    },
                    "list_key": [
                        "value 1",
                        "{{cookiecutter.project_name}}",
                        "value 3",
                    ],
                },
            }
        }

        cookiecutter_dict = prompt.prompt_for_config(context, no_input=True)
>       assert cookiecutter_dict == {
            'project_name': "Slartibartfast",
            'details': {
                "key": "value",
                "integer_key": "37",
                "other_name": "Slartibartfast",
                "dict_key": {
                    "deep_key": "deep_value",
                    "deep_integer": "42",
                    "deep_other_name": "Slartibartfast",
                    "deep_list": ["deep value 1", "Slartibartfast", "deep value 3"],
                },
                "list_key": ["value 1", "Slartibartfast", "value 3"],
            },
        }
E       AssertionError: assert OrderedDict([('project_name', 'Slartibartfast'), ('details', 'key')]) == {'project_name': 'Slartibartfast', 'details': {'key': 'value', 'integer_key': '37', 'other_name': 'Slartibartfast', 'dict_key': {'deep_key': 'deep_value', 'deep_integer': '42', 'deep_other_name': 'Slartibartfast', 'deep_list': ['deep value 1', 'Slartibartfast', 'deep value 3']}, 'list_key': ['value 1', 'Slartibartfast', 'value 3']}}
E         
E         Common items:
E         {'project_name': 'Slartibartfast'}
E         Differing items:
E         {'details': 'key'} != {'details': {'dict_key': {'deep_integer': '42', 'deep_key': 'deep_value', 'deep_list': ['deep value 1', 'Slartibartfas...e': 'Slartibartfast'}, 'integer_key': '37', 'key': 'value', 'list_key': ['value 1', 'Slartibartfast', 'value 3'], ...}}
E         
E         Full diff:
E         - {
E         + OrderedDict({
E         -     'details': {
E         ?                ^
E         +     'details': 'key',
E         ?                ^^^^^^
E         -         'dict_key': {
E         -             'deep_integer': '42',
E         -             'deep_key': 'deep_value',
E         -             'deep_list': [
E         -                 'deep value 1',
E         -                 'Slartibartfast',
E         -                 'deep value 3',
E         -             ],
E         -             'deep_other_name': 'Slartibartfast',
E         -         },
E         -         'integer_key': '37',
E         -         'key': 'value',
E         -         'list_key': [
E         -             'value 1',
E         -             'Slartibartfast',
E         -             'value 3',
E         -         ],
E         -         'other_name': 'Slartibartfast',
E         -     },
E               'project_name': 'Slartibartfast',
E         - }
E         + })

tests/test_prompt.py:229: AssertionError

test_prompt.py::TestPrompt::test_should_render_deep_dict_with_human_prompts

test_prompt.py::TestPrompt::test_should_render_deep_dict_with_human_prompts
self = 

    def test_should_render_deep_dict_with_human_prompts(self):
        """Verify dict rendered correctly when human-readable prompts."""
        context = {
            'cookiecutter': {
                'project_name': "Slartibartfast",
                'details': {
                    "key": "value",
                    "integer_key": 37,
                    "other_name": '{{cookiecutter.project_name}}',
                    "dict_key": {
                        "deep_key": "deep_value",
                    },
                },
                '__prompts__': {'project_name': 'Project name'},
            }
        }
        cookiecutter_dict = prompt.prompt_for_config(context, no_input=True)
>       assert cookiecutter_dict == {
            'project_name': "Slartibartfast",
            'details': {
                "key": "value",
                "integer_key": "37",
                "other_name": "Slartibartfast",
                "dict_key": {
                    "deep_key": "deep_value",
                },
            },
        }
E       AssertionError: assert OrderedDict([('project_name', 'Slartibartfast'), ('details', 'key'), ('__prompts__', {'project_name': 'Project name'})]) == {'project_name': 'Slartibartfast', 'details': {'key': 'value', 'integer_key': '37', 'other_name': 'Slartibartfast', 'dict_key': {'deep_key': 'deep_value'}}}
E         
E         Common items:
E         {'project_name': 'Slartibartfast'}
E         Differing items:
E         {'details': 'key'} != {'details': {'dict_key': {'deep_key': 'deep_value'}, 'integer_key': '37', 'key': 'value', 'other_name': 'Slartibartfast'}}
E         Left contains 1 more item:
E         {'__prompts__': {'project_name': 'Project name'}}
E         
E         Full diff:
E         + OrderedDict({
E         +     '__prompts__': {
E         +         'project_name': 'Project name',
E         - {
E         -     'details': {
E         -         'dict_key': {
E         -             'deep_key': 'deep_value',
E         -         },
E         -         'integer_key': '37',
E         -         'key': 'value',
E         -         'other_name': 'Slartibartfast',
E               },
E         +     'details': 'key',
E               'project_name': 'Slartibartfast',
E         - }
E         + })

tests/test_prompt.py:262: AssertionError

test_prompt.py::TestPrompt::test_internal_use_no_human_prompts

test_prompt.py::TestPrompt::test_internal_use_no_human_prompts
self = 

    def test_internal_use_no_human_prompts(self):
        """Verify dict rendered correctly when human-readable prompts empty."""
        context = {
            'cookiecutter': {
                'project_name': "Slartibartfast",
                '__prompts__': {},
            }
        }
        cookiecutter_dict = prompt.prompt_for_config(context, no_input=True)
>       assert cookiecutter_dict == {
            'project_name': "Slartibartfast",
        }
E       AssertionError: assert OrderedDict([('project_name', 'Slartibartfast'), ('__prompts__', {})]) == {'project_name': 'Slartibartfast'}
E         
E         Common items:
E         {'project_name': 'Slartibartfast'}
E         Left contains 1 more item:
E         {'__prompts__': {}}
E         
E         Full diff:
E         - {
E         + OrderedDict({
E         +     '__prompts__': {},
E               'project_name': 'Slartibartfast',
E         - }
E         + })

tests/test_prompt.py:283: AssertionError

test_prompt.py::TestPrompt::test_prompt_for_templated_config

test_prompt.py::TestPrompt::test_prompt_for_templated_config
self = 
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7ee47dff5030>

    def test_prompt_for_templated_config(self, monkeypatch):
        """Verify Jinja2 templating works in unicode prompts."""
        monkeypatch.setattr(
            'cookiecutter.prompt.read_user_variable',
            lambda var, default, prompts, prefix: default,
        )
        context = {
            'cookiecutter': OrderedDict(
                [
                    ('project_name', 'A New Project'),
                    (
                        'pkg_name',
                        '{{ cookiecutter.project_name|lower|replace(" ", "") }}',
                    ),
                ]
            )
        }

        exp_cookiecutter_dict = {
            'project_name': 'A New Project',
            'pkg_name': 'anewproject',
        }
>       cookiecutter_dict = prompt.prompt_for_config(context)

tests/test_prompt.py:309: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

context = {'cookiecutter': OrderedDict([('project_name', 'A New Project'), ('pkg_name', '{{ cookiecutter.project_name|lower|replace(" ", "") }}')])}
no_input = False

    def prompt_for_config(context, no_input=False):
        """Prompt user to enter a new config.

        :param dict context: Source for field names and sample values.
        :param no_input: Do not prompt for user input and use only values from context.
        """
        cookiecutter_dict = OrderedDict([])
        env = create_env_with_context(context)

        for key, raw in context['cookiecutter'].items():
            if key.startswith('_'):
                cookiecutter_dict[key] = raw
                continue

            if isinstance(raw, dict):
                cookiecutter_dict[key] = prompt_choice_for_config(
                    cookiecutter_dict, env, key, raw, no_input
                )
            else:
                if no_input:
                    cookiecutter_dict[key] = raw
                else:
>                   cookiecutter_dict[key] = read_user_variable(key, raw)
E                   TypeError: TestPrompt.test_prompt_for_templated_config..() missing 2 required positional arguments: 'prompts' and 'prefix'

cookiecutter/prompt.py:227: TypeError

test_prompt.py::TestPrompt::test_should_render_private_variables_with_two_underscores

test_prompt.py::TestPrompt::test_should_render_private_variables_with_two_underscores
self = 

    def test_should_render_private_variables_with_two_underscores(self):
        """Test rendering of private variables with two underscores.

        There are three cases:
        1. Variables beginning with a single underscore are private and not rendered.
        2. Variables beginning with a double underscore are private and are rendered.
        3. Variables beginning with anything other than underscores are not private and
           are rendered.
        """
        context = {
            'cookiecutter': OrderedDict(
                [
                    ('foo', 'Hello world'),
                    ('bar', 123),
                    ('rendered_foo', '{{ cookiecutter.foo|lower }}'),
                    ('rendered_bar', 123),
                    ('_hidden_foo', '{{ cookiecutter.foo|lower }}'),
                    ('_hidden_bar', 123),
                    ('__rendered_hidden_foo', '{{ cookiecutter.foo|lower }}'),
                    ('__rendered_hidden_bar', 123),
                ]
            )
        }
        cookiecutter_dict = prompt.prompt_for_config(context, no_input=True)
>       assert cookiecutter_dict == OrderedDict(
            [
                ('foo', 'Hello world'),
                ('bar', '123'),
                ('rendered_foo', 'hello world'),
                ('rendered_bar', '123'),
                ('_hidden_foo', '{{ cookiecutter.foo|lower }}'),
                ('_hidden_bar', 123),
                ('__rendered_hidden_foo', 'hello world'),
                ('__rendered_hidden_bar', '123'),
            ]
        )
E       AssertionError: assert OrderedDict([('foo', 'Hello world'), ('bar', 123), ('rendered_foo', '{{ cookiecutter.foo|lower }}'), ('rendered_bar', 123), ('_hidden_foo', '{{ cookiecutter.foo|lower }}'), ('_hidden_bar', 123), ('__rendered_hidden_foo', '{{ cookiecutter.foo|lower }}'), ('__rendered_hidden_bar', 123)]) == OrderedDict([('foo', 'Hello world'), ('bar', '123'), ('rendered_foo', 'hello world'), ('rendered_bar', '123'), ('_hidden_foo', '{{ cookiecutter.foo|lower }}'), ('_hidden_bar', 123), ('__rendered_hidden_foo', 'hello world'), ('__rendered_hidden_bar', '123')])
E         
E         Common items:
E         {'_hidden_bar': 123,
E          '_hidden_foo': '{{ cookiecutter.foo|lower }}',
E          'foo': 'Hello world'}
E         Differing items:
E         {'__rendered_hidden_bar': 123} != {'__rendered_hidden_bar': '123'}
E         {'__rendered_hidden_foo': '{{ cookiecutter.foo|lower }}'} != {'__rendered_hidden_foo': 'hello world'}
E         {'bar': 123} != {'bar': '123'}
E         {'rendered_foo': '{{ cookiecutter.foo|lower }}'} != {'rendered_foo': 'hello world'}
E         {'rendered_bar': 123} != {'rendered_bar': '123'}
E         
E         Full diff:
E           OrderedDict({
E         -     '__rendered_hidden_bar': '123',
E         ?                              -   -
E         +     '__rendered_hidden_bar': 123,
E         -     '__rendered_hidden_foo': 'hello world',
E         +     '__rendered_hidden_foo': '{{ cookiecutter.foo|lower }}',
E               '_hidden_bar': 123,
E               '_hidden_foo': '{{ cookiecutter.foo|lower }}',
E         -     'bar': '123',
E         ?            -   -
E         +     'bar': 123,
E               'foo': 'Hello world',
E         -     'rendered_bar': '123',
E         ?                     -   -
E         +     'rendered_bar': 123,
E         -     'rendered_foo': 'hello world',
E         +     'rendered_foo': '{{ cookiecutter.foo|lower }}',
E           })

tests/test_prompt.py:348: AssertionError

test_prompt.py::TestReadUserChoice::test_should_invoke_read_user_choice

test_prompt.py::TestReadUserChoice::test_should_invoke_read_user_choice
self = 
mocker = 

    def test_should_invoke_read_user_choice(self, mocker):
        """Verify correct function called for select(list) variables."""
        prompt_choice = mocker.patch(
            'cookiecutter.prompt.prompt_choice_for_config',
            wraps=prompt.prompt_choice_for_config,
        )

        read_user_choice = mocker.patch('cookiecutter.prompt.read_user_choice')
        read_user_choice.return_value = 'all'

        read_user_variable = mocker.patch('cookiecutter.prompt.read_user_variable')

        choices = ['landscape', 'portrait', 'all']
        context = {'cookiecutter': {'orientation': choices}}

        cookiecutter_dict = prompt.prompt_for_config(context)

>       assert not read_user_variable.called
E       AssertionError: assert not True
E        +  where True = .called

tests/test_prompt.py:403: AssertionError

test_prompt.py::TestReadUserChoice::test_should_invoke_read_user_variable

test_prompt.py::TestReadUserChoice::test_should_invoke_read_user_variable
self = 
args = ('full_name', 'Your Name', {}, '  [dim][1/1][/] '), kwargs = {}
expected = call('full_name', 'Your Name', {}, '  [dim][1/1][/] ')
actual = call('full_name', 'Your Name')
_error_message = ._error_message at 0x7ee47d27a440>
cause = None

    def assert_called_with(self, /, *args, **kwargs):
        """assert that the last call was made with the specified arguments.

        Raises an AssertionError if the args and keyword args passed in are
        different to the last call to the mock."""
        if self.call_args is None:
            expected = self._format_mock_call_signature(args, kwargs)
            actual = 'not called.'
            error_message = ('expected call not found.\nExpected: %s\nActual: %s'
                    % (expected, actual))
            raise AssertionError(error_message)

        def _error_message():
            msg = self._format_mock_failure_message(args, kwargs)
            return msg
        expected = self._call_matcher(_Call((args, kwargs), two=True))
        actual = self._call_matcher(self.call_args)
        if actual != expected:
            cause = expected if isinstance(expected, Exception) else None
>           raise AssertionError(_error_message()) from cause
E           AssertionError: expected call not found.
E           Expected: read_user_variable('full_name', 'Your Name', {}, '  [dim][1/1][/] ')
E           Actual: read_user_variable('full_name', 'Your Name')

/usr/lib/python3.10/unittest/mock.py:929: AssertionError

During handling of the above exception, another exception occurred:

self = 
args = ('full_name', 'Your Name', {}, '  [dim][1/1][/] '), kwargs = {}

    def assert_called_once_with(self, /, *args, **kwargs):
        """assert that the mock was called exactly once and that that call was
        with the specified arguments."""
        if not self.call_count == 1:
            msg = ("Expected '%s' to be called once. Called %s times.%s"
                   % (self._mock_name or 'mock',
                      self.call_count,
                      self._calls_repr()))
            raise AssertionError(msg)
>       return self.assert_called_with(*args, **kwargs)
E       AssertionError: expected call not found.
E       Expected: read_user_variable('full_name', 'Your Name', {}, '  [dim][1/1][/] ')
E       Actual: read_user_variable('full_name', 'Your Name')
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('full_name', 'Your Name') == ('full_name', 'Your Name', {}, '  [dim][1/1][/] ')
E         
E         Right contains 2 more items, first extra item: {}
E         
E         Full diff:
E           (
E               'full_name',
E               'Your Name',
E         -     {},
E         -     '  [dim][1/1][/] ',
E           )

/usr/lib/python3.10/unittest/mock.py:941: AssertionError

During handling of the above exception, another exception occurred:

self = 
mocker = 

    def test_should_invoke_read_user_variable(self, mocker):
        """Verify correct function called for string input variables."""
        read_user_variable = mocker.patch('cookiecutter.prompt.read_user_variable')
        read_user_variable.return_value = 'Audrey Roy'

        prompt_choice = mocker.patch('cookiecutter.prompt.prompt_choice_for_config')

        read_user_choice = mocker.patch('cookiecutter.prompt.read_user_choice')

        context = {'cookiecutter': {'full_name': 'Your Name'}}

        cookiecutter_dict = prompt.prompt_for_config(context)

        assert not prompt_choice.called
        assert not read_user_choice.called
>       read_user_variable.assert_called_once_with(
            'full_name', 'Your Name', {}, DEFAULT_PREFIX
        )
E       AssertionError: expected call not found.
E       Expected: read_user_variable('full_name', 'Your Name', {}, '  [dim][1/1][/] ')
E       Actual: read_user_variable('full_name', 'Your Name')
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('full_name', 'Your Name') == ('full_name', 'Your Name', {}, '  [dim][1/1][/] ')
E         
E         Right contains 2 more items, first extra item: {}
E         
E         Full diff:
E           (
E               'full_name',
E               'Your Name',
E         -     {},
E         -     '  [dim][1/1][/] ',
E           )

tests/test_prompt.py:425: AssertionError

test_prompt.py::TestReadUserChoice::test_should_render_choices

test_prompt.py::TestReadUserChoice::test_should_render_choices
self = 
args = ('project_name', 'A New Project', {}, '  [dim][1/2][/] '), kwargs = {}
msg = 'Expected \'read_user_variable\' to be called once. Called 2 times.\nCalls: [call(\'project_name\', \'A New Project\'),\n call(\'pkg_name\', [\'foo\', \'{{ cookiecutter.project_name|lower|replace(" ", "") }}\', \'bar\'])].'

    def assert_called_once_with(self, /, *args, **kwargs):
        """assert that the mock was called exactly once and that that call was
        with the specified arguments."""
        if not self.call_count == 1:
            msg = ("Expected '%s' to be called once. Called %s times.%s"
                   % (self._mock_name or 'mock',
                      self.call_count,
                      self._calls_repr()))
>           raise AssertionError(msg)
E           AssertionError: Expected 'read_user_variable' to be called once. Called 2 times.
E           Calls: [call('project_name', 'A New Project'),
E            call('pkg_name', ['foo', '{{ cookiecutter.project_name|lower|replace(" ", "") }}', 'bar'])].

/usr/lib/python3.10/unittest/mock.py:940: AssertionError

During handling of the above exception, another exception occurred:

self = 
mocker = 

    def test_should_render_choices(self, mocker):
        """Verify Jinja2 templating engine works inside choices variables."""
        read_user_choice = mocker.patch('cookiecutter.prompt.read_user_choice')
        read_user_choice.return_value = 'anewproject'

        read_user_variable = mocker.patch('cookiecutter.prompt.read_user_variable')
        read_user_variable.return_value = 'A New Project'

        rendered_choices = ['foo', 'anewproject', 'bar']

        context = {
            'cookiecutter': OrderedDict(
                [
                    ('project_name', 'A New Project'),
                    (
                        'pkg_name',
                        [
                            'foo',
                            '{{ cookiecutter.project_name|lower|replace(" ", "") }}',
                            'bar',
                        ],
                    ),
                ]
            )
        }

        expected = {
            'project_name': 'A New Project',
            'pkg_name': 'anewproject',
        }
        cookiecutter_dict = prompt.prompt_for_config(context)

>       read_user_variable.assert_called_once_with(
            'project_name', 'A New Project', {}, '  [dim][1/2][/] '
        )
E       AssertionError: Expected 'read_user_variable' to be called once. Called 2 times.
E       Calls: [call('project_name', 'A New Project'),
E        call('pkg_name', ['foo', '{{ cookiecutter.project_name|lower|replace(" ", "") }}', 'bar'])].
E       
E       pytest introspection follows:
E       
E       Args:
E       assert ('pkg_name', ['foo', '{{ cookiecutter.project_name|lower|replace(" ", "") }}', 'bar']) == ('project_name', 'A New Project', {}, '  [dim][1/2][/] ')
E         
E         At index 0 diff: 'pkg_name' != 'project_name'
E         Right contains 2 more items, first extra item: {}
E         
E         Full diff:
E           (
E         -     'project_name',
E         ?       ^^^^^^
E         +     'pkg_name',
E         ?       ^^
E         -     'A New Project',
E         +     [
E         +         'foo',
E         +         '{{ cookiecutter.project_name|lower|replace(" ", "") }}',
E         +         'bar',
E         -     {},
E         ?     ^^
E         +     ],
E         ?     ^
E         -     '  [dim][1/2][/] ',
E           )

tests/test_prompt.py:462: AssertionError

test_prompt.py::TestPromptChoiceForConfig::test_should_return_first_option_if_no_input

test_prompt.py::TestPromptChoiceForConfig::test_should_return_first_option_if_no_input
self = 
mocker = 
choices = ['landscape', 'portrait', 'all']
context = {'cookiecutter': {'orientation': ['landscape', 'portrait', 'all']}}

    def test_should_return_first_option_if_no_input(self, mocker, choices, context):
        """Verify prompt_choice_for_config return first list option on no_input=True."""
        read_user_choice = mocker.patch('cookiecutter.prompt.read_user_choice')

        expected_choice = choices[0]

>       actual_choice = prompt.prompt_choice_for_config(
            cookiecutter_dict=context,
            env=environment.StrictEnvironment(),
            key='orientation',
            options=choices,
            no_input=True,  # Suppress user input
        )

tests/test_prompt.py:490: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

cookiecutter_dict = {'cookiecutter': {'orientation': ['landscape', 'portrait', 'all']}}
env = 
key = 'orientation', options = ['landscape', 'portrait', 'all'], no_input = True
prompts = None, prefix = ''

    def prompt_choice_for_config(cookiecutter_dict, env, key, options, no_input,
        prompts=None, prefix=''):
        """Prompt user with a set of options to choose from.

        :param no_input: Do not prompt for user input and return the first available option.
        """
        if no_input:
>           return next(iter(options.keys()))
E           AttributeError: 'list' object has no attribute 'keys'

cookiecutter/prompt.py:190: AttributeError

test_prompt.py::TestPromptChoiceForConfig::test_should_read_user_choice

test_prompt.py::TestPromptChoiceForConfig::test_should_read_user_choice
self = 
mocker = 
choices = ['landscape', 'portrait', 'all']
context = {'cookiecutter': {'orientation': ['landscape', 'portrait', 'all']}}

    def test_should_read_user_choice(self, mocker, choices, context):
        """Verify prompt_choice_for_config return user selection on no_input=False."""
        read_user_choice = mocker.patch('cookiecutter.prompt.read_user_choice')
        read_user_choice.return_value = 'all'

        expected_choice = 'all'

>       actual_choice = prompt.prompt_choice_for_config(
            cookiecutter_dict=context,
            env=environment.StrictEnvironment(),
            key='orientation',
            options=choices,
            no_input=False,  # Ask the user for input
        )

tests/test_prompt.py:508: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

cookiecutter_dict = {'cookiecutter': {'orientation': ['landscape', 'portrait', 'all']}}
env = 
key = 'orientation', options = ['landscape', 'portrait', 'all']
no_input = False, prompts = None, prefix = ''

    def prompt_choice_for_config(cookiecutter_dict, env, key, options, no_input,
        prompts=None, prefix=''):
        """Prompt user with a set of options to choose from.

        :param no_input: Do not prompt for user input and return the first available option.
        """
        if no_input:
            return next(iter(options.keys()))

>       choices = list(options.keys())
E       AttributeError: 'list' object has no attribute 'keys'

cookiecutter/prompt.py:192: AttributeError

test_prompt.py::TestReadUserYesNo::test_should_invoke_read_user_yes_no[True]

test_prompt.py::TestReadUserYesNo::test_should_invoke_read_user_yes_no[True]
self = 
mocker = 
run_as_docker = True

    @pytest.mark.parametrize(
        'run_as_docker',
        (
            True,
            False,
        ),
    )
    def test_should_invoke_read_user_yes_no(self, mocker, run_as_docker):
        """Verify correct function called for boolean variables."""
        read_user_yes_no = mocker.patch('cookiecutter.prompt.read_user_yes_no')
        read_user_yes_no.return_value = run_as_docker

        read_user_variable = mocker.patch('cookiecutter.prompt.read_user_variable')

        context = {'cookiecutter': {'run_as_docker': run_as_docker}}

        cookiecutter_dict = prompt.prompt_for_config(context)

>       assert not read_user_variable.called
E       AssertionError: assert not True
E        +  where True = .called

tests/test_prompt.py:540: AssertionError

test_prompt.py::TestReadUserYesNo::test_should_invoke_read_user_yes_no[False]

test_prompt.py::TestReadUserYesNo::test_should_invoke_read_user_yes_no[False]
self = 
mocker = 
run_as_docker = False

    @pytest.mark.parametrize(
        'run_as_docker',
        (
            True,
            False,
        ),
    )
    def test_should_invoke_read_user_yes_no(self, mocker, run_as_docker):
        """Verify correct function called for boolean variables."""
        read_user_yes_no = mocker.patch('cookiecutter.prompt.read_user_yes_no')
        read_user_yes_no.return_value = run_as_docker

        read_user_variable = mocker.patch('cookiecutter.prompt.read_user_variable')

        context = {'cookiecutter': {'run_as_docker': run_as_docker}}

        cookiecutter_dict = prompt.prompt_for_config(context)

>       assert not read_user_variable.called
E       AssertionError: assert not True
E        +  where True = .called

tests/test_prompt.py:540: AssertionError

test_prompt.py::test_undefined_variable[Undefined variable in cookiecutter dict]

test_prompt.py::test_undefined_variable[Undefined variable in cookiecutter dict]
context = {'cookiecutter': {'foo': '{{cookiecutter.nope}}'}}

    @pytest.mark.parametrize(
        'context',
        (
            {'cookiecutter': {'foo': '{{cookiecutter.nope}}'}},
            {'cookiecutter': {'foo': ['123', '{{cookiecutter.nope}}', '456']}},
            {'cookiecutter': {'foo': {'{{cookiecutter.nope}}': 'value'}}},
            {'cookiecutter': {'foo': {'key': '{{cookiecutter.nope}}'}}},
        ),
        ids=[
            'Undefined variable in cookiecutter dict',
            'Undefined variable in cookiecutter dict with choices',
            'Undefined variable in cookiecutter dict with dict_key',
            'Undefined variable in cookiecutter dict with key_value',
        ],
    )
    def test_undefined_variable(context):
        """Verify `prompt.prompt_for_config` raises correct error."""
>       with pytest.raises(exceptions.UndefinedVariableInTemplate) as err:
E       Failed: DID NOT RAISE 

tests/test_prompt.py:574: Failed

test_prompt.py::test_undefined_variable[Undefined variable in cookiecutter dict with choices]

test_prompt.py::test_undefined_variable[Undefined variable in cookiecutter dict with choices]
context = {'cookiecutter': {'foo': ['123', '{{cookiecutter.nope}}', '456']}}

    @pytest.mark.parametrize(
        'context',
        (
            {'cookiecutter': {'foo': '{{cookiecutter.nope}}'}},
            {'cookiecutter': {'foo': ['123', '{{cookiecutter.nope}}', '456']}},
            {'cookiecutter': {'foo': {'{{cookiecutter.nope}}': 'value'}}},
            {'cookiecutter': {'foo': {'key': '{{cookiecutter.nope}}'}}},
        ),
        ids=[
            'Undefined variable in cookiecutter dict',
            'Undefined variable in cookiecutter dict with choices',
            'Undefined variable in cookiecutter dict with dict_key',
            'Undefined variable in cookiecutter dict with key_value',
        ],
    )
    def test_undefined_variable(context):
        """Verify `prompt.prompt_for_config` raises correct error."""
>       with pytest.raises(exceptions.UndefinedVariableInTemplate) as err:
E       Failed: DID NOT RAISE 

tests/test_prompt.py:574: Failed

test_prompt.py::test_undefined_variable[Undefined variable in cookiecutter dict with dict_key]

test_prompt.py::test_undefined_variable[Undefined variable in cookiecutter dict with dict_key]
context = {'cookiecutter': {'foo': {'{{cookiecutter.nope}}': 'value'}}}

    @pytest.mark.parametrize(
        'context',
        (
            {'cookiecutter': {'foo': '{{cookiecutter.nope}}'}},
            {'cookiecutter': {'foo': ['123', '{{cookiecutter.nope}}', '456']}},
            {'cookiecutter': {'foo': {'{{cookiecutter.nope}}': 'value'}}},
            {'cookiecutter': {'foo': {'key': '{{cookiecutter.nope}}'}}},
        ),
        ids=[
            'Undefined variable in cookiecutter dict',
            'Undefined variable in cookiecutter dict with choices',
            'Undefined variable in cookiecutter dict with dict_key',
            'Undefined variable in cookiecutter dict with key_value',
        ],
    )
    def test_undefined_variable(context):
        """Verify `prompt.prompt_for_config` raises correct error."""
>       with pytest.raises(exceptions.UndefinedVariableInTemplate) as err:
E       Failed: DID NOT RAISE 

tests/test_prompt.py:574: Failed

test_prompt.py::test_undefined_variable[Undefined variable in cookiecutter dict with key_value]

test_prompt.py::test_undefined_variable[Undefined variable in cookiecutter dict with key_value]
context = {'cookiecutter': {'foo': {'key': '{{cookiecutter.nope}}'}}}

    @pytest.mark.parametrize(
        'context',
        (
            {'cookiecutter': {'foo': '{{cookiecutter.nope}}'}},
            {'cookiecutter': {'foo': ['123', '{{cookiecutter.nope}}', '456']}},
            {'cookiecutter': {'foo': {'{{cookiecutter.nope}}': 'value'}}},
            {'cookiecutter': {'foo': {'key': '{{cookiecutter.nope}}'}}},
        ),
        ids=[
            'Undefined variable in cookiecutter dict',
            'Undefined variable in cookiecutter dict with choices',
            'Undefined variable in cookiecutter dict with dict_key',
            'Undefined variable in cookiecutter dict with key_value',
        ],
    )
    def test_undefined_variable(context):
        """Verify `prompt.prompt_for_config` raises correct error."""
>       with pytest.raises(exceptions.UndefinedVariableInTemplate) as err:
E       Failed: DID NOT RAISE 

tests/test_prompt.py:574: Failed

test_prompt.py::test_cookiecutter_nested_templates[fake-nested-templates-fake-project]

test_prompt.py::test_cookiecutter_nested_templates[fake-nested-templates-fake-project]
template_dir = 'fake-nested-templates', expected = 'fake-project'

    @pytest.mark.parametrize(
        "template_dir,expected",
        [
            ["fake-nested-templates", "fake-project"],
            ["fake-nested-templates-old-style", "fake-package"],
        ],
    )
    def test_cookiecutter_nested_templates(template_dir: str, expected: str):
        """Test nested_templates generation."""
        from cookiecutter import prompt

        main_dir = (Path("tests") / template_dir).resolve()
        cookiecuter_context = json.loads((main_dir / "cookiecutter.json").read_text())
        context = {"cookiecutter": cookiecuter_context}
>       output_dir = prompt.choose_nested_template(context, main_dir, no_input=True)

tests/test_prompt.py:596: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
cookiecutter/prompt.py:242: in choose_nested_template
    template_names = [d.name for d in template_dir.iterdir() if d.is_dir()]
cookiecutter/prompt.py:242: in 
    template_names = [d.name for d in template_dir.iterdir() if d.is_dir()]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = PosixPath('/testbed/tests/fake-nested-templates/templates')

    def iterdir(self):
        """Iterate over the files in this directory.  Does not yield any
        result for the special paths '.' and '..'.
        """
>       for name in self._accessor.listdir(self):
E       FileNotFoundError: [Errno 2] No such file or directory: '/testbed/tests/fake-nested-templates/templates'

/usr/lib/python3.10/pathlib.py:1017: FileNotFoundError

test_prompt.py::test_cookiecutter_nested_templates[fake-nested-templates-old-style-fake-package]

test_prompt.py::test_cookiecutter_nested_templates[fake-nested-templates-old-style-fake-package]
template_dir = 'fake-nested-templates-old-style', expected = 'fake-package'

    @pytest.mark.parametrize(
        "template_dir,expected",
        [
            ["fake-nested-templates", "fake-project"],
            ["fake-nested-templates-old-style", "fake-package"],
        ],
    )
    def test_cookiecutter_nested_templates(template_dir: str, expected: str):
        """Test nested_templates generation."""
        from cookiecutter import prompt

        main_dir = (Path("tests") / template_dir).resolve()
        cookiecuter_context = json.loads((main_dir / "cookiecutter.json").read_text())
        context = {"cookiecutter": cookiecuter_context}
>       output_dir = prompt.choose_nested_template(context, main_dir, no_input=True)

tests/test_prompt.py:596: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
cookiecutter/prompt.py:242: in choose_nested_template
    template_names = [d.name for d in template_dir.iterdir() if d.is_dir()]
cookiecutter/prompt.py:242: in 
    template_names = [d.name for d in template_dir.iterdir() if d.is_dir()]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = PosixPath('/testbed/tests/fake-nested-templates-old-style/templates')

    def iterdir(self):
        """Iterate over the files in this directory.  Does not yield any
        result for the special paths '.' and '..'.
        """
>       for name in self._accessor.listdir(self):
E       FileNotFoundError: [Errno 2] No such file or directory: '/testbed/tests/fake-nested-templates-old-style/templates'

/usr/lib/python3.10/pathlib.py:1017: FileNotFoundError

test_prompt.py::test_cookiecutter_nested_templates_invalid_paths[]

test_prompt.py::test_cookiecutter_nested_templates_invalid_paths[]
path = ''

    @pytest.mark.skipif(sys.platform.startswith('win'), reason="Linux / macos test")
    @pytest.mark.parametrize(
        "path",
        [
            "",
            "/tmp",
            "/foo",
        ],
    )
    def test_cookiecutter_nested_templates_invalid_paths(path: str):
        """Test nested_templates generation."""
        from cookiecutter import prompt

        main_dir = (Path("tests") / "fake-nested-templates").resolve()
        cookiecuter_context = json.loads((main_dir / "cookiecutter.json").read_text())
        cookiecuter_context["templates"]["fake-project"]["path"] = path
        context = {"cookiecutter": cookiecuter_context}
        with pytest.raises(ValueError) as exc:
>           prompt.choose_nested_template(context, main_dir, no_input=True)

tests/test_prompt.py:619: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
cookiecutter/prompt.py:242: in choose_nested_template
    template_names = [d.name for d in template_dir.iterdir() if d.is_dir()]
cookiecutter/prompt.py:242: in 
    template_names = [d.name for d in template_dir.iterdir() if d.is_dir()]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = PosixPath('/testbed/tests/fake-nested-templates/templates')

    def iterdir(self):
        """Iterate over the files in this directory.  Does not yield any
        result for the special paths '.' and '..'.
        """
>       for name in self._accessor.listdir(self):
E       FileNotFoundError: [Errno 2] No such file or directory: '/testbed/tests/fake-nested-templates/templates'

/usr/lib/python3.10/pathlib.py:1017: FileNotFoundError

tmp]

tmp]
path = '/tmp'

    @pytest.mark.skipif(sys.platform.startswith('win'), reason="Linux / macos test")
    @pytest.mark.parametrize(
        "path",
        [
            "",
            "/tmp",
            "/foo",
        ],
    )
    def test_cookiecutter_nested_templates_invalid_paths(path: str):
        """Test nested_templates generation."""
        from cookiecutter import prompt

        main_dir = (Path("tests") / "fake-nested-templates").resolve()
        cookiecuter_context = json.loads((main_dir / "cookiecutter.json").read_text())
        cookiecuter_context["templates"]["fake-project"]["path"] = path
        context = {"cookiecutter": cookiecuter_context}
        with pytest.raises(ValueError) as exc:
>           prompt.choose_nested_template(context, main_dir, no_input=True)

tests/test_prompt.py:619: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
cookiecutter/prompt.py:242: in choose_nested_template
    template_names = [d.name for d in template_dir.iterdir() if d.is_dir()]
cookiecutter/prompt.py:242: in 
    template_names = [d.name for d in template_dir.iterdir() if d.is_dir()]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = PosixPath('/testbed/tests/fake-nested-templates/templates')

    def iterdir(self):
        """Iterate over the files in this directory.  Does not yield any
        result for the special paths '.' and '..'.
        """
>       for name in self._accessor.listdir(self):
E       FileNotFoundError: [Errno 2] No such file or directory: '/testbed/tests/fake-nested-templates/templates'

/usr/lib/python3.10/pathlib.py:1017: FileNotFoundError

foo]

foo]
path = '/foo'

    @pytest.mark.skipif(sys.platform.startswith('win'), reason="Linux / macos test")
    @pytest.mark.parametrize(
        "path",
        [
            "",
            "/tmp",
            "/foo",
        ],
    )
    def test_cookiecutter_nested_templates_invalid_paths(path: str):
        """Test nested_templates generation."""
        from cookiecutter import prompt

        main_dir = (Path("tests") / "fake-nested-templates").resolve()
        cookiecuter_context = json.loads((main_dir / "cookiecutter.json").read_text())
        cookiecuter_context["templates"]["fake-project"]["path"] = path
        context = {"cookiecutter": cookiecuter_context}
        with pytest.raises(ValueError) as exc:
>           prompt.choose_nested_template(context, main_dir, no_input=True)

tests/test_prompt.py:619: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
cookiecutter/prompt.py:242: in choose_nested_template
    template_names = [d.name for d in template_dir.iterdir() if d.is_dir()]
cookiecutter/prompt.py:242: in 
    template_names = [d.name for d in template_dir.iterdir() if d.is_dir()]
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = PosixPath('/testbed/tests/fake-nested-templates/templates')

    def iterdir(self):
        """Iterate over the files in this directory.  Does not yield any
        result for the special paths '.' and '..'.
        """
>       for name in self._accessor.listdir(self):
E       FileNotFoundError: [Errno 2] No such file or directory: '/testbed/tests/fake-nested-templates/templates'

/usr/lib/python3.10/pathlib.py:1017: FileNotFoundError

test_prompt.py::test_prompt_should_ask_and_rm_repo_dir

test_prompt.py::test_prompt_should_ask_and_rm_repo_dir
mocker = 
tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_prompt_should_ask_and_rm_0')

    def test_prompt_should_ask_and_rm_repo_dir(mocker, tmp_path):
        """In `prompt_and_delete()`, if the user agrees to delete/reclone the \
        repo, the repo should be deleted."""
        mock_read_user = mocker.patch(
            'cookiecutter.prompt.read_user_yes_no', return_value=True
        )
        repo_dir = Path(tmp_path, 'repo')
        repo_dir.mkdir()

>       deleted = prompt.prompt_and_delete(str(repo_dir))

tests/test_prompt.py:654: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
cookiecutter/prompt.py:274: in prompt_and_delete
    delete = YesNoPrompt.ask(
.venv/lib/python3.10/site-packages/rich/prompt.py:149: in ask
    return _prompt(default=default, stream=stream)
.venv/lib/python3.10/site-packages/rich/prompt.py:292: in __call__
    value = self.get_input(self.console, prompt, self.password, stream=stream)
.venv/lib/python3.10/site-packages/rich/prompt.py:211: in get_input
    return console.input(prompt, password=password, stream=stream)
.venv/lib/python3.10/site-packages/rich/console.py:2156: in input
    result = input()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <_pytest.capture.DontReadFromInput object at 0x7ee47f20c100>, size = -1

    def read(self, size: int = -1) -> str:
>       raise OSError(
            "pytest: reading from stdin while output is captured!  Consider using `-s`."
        )
E       OSError: pytest: reading from stdin while output is captured!  Consider using `-s`.

.venv/lib/python3.10/site-packages/_pytest/capture.py:209: OSError

test_prompt.py::test_prompt_should_ask_and_exit_on_user_no_answer

test_prompt.py::test_prompt_should_ask_and_exit_on_user_no_answer
mocker = 
tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_prompt_should_ask_and_exi0')

    def test_prompt_should_ask_and_exit_on_user_no_answer(mocker, tmp_path):
        """In `prompt_and_delete()`, if the user decline to delete/reclone the \
        repo, cookiecutter should exit."""
        mock_read_user = mocker.patch(
            'cookiecutter.prompt.read_user_yes_no',
            return_value=False,
        )
        mock_sys_exit = mocker.patch('sys.exit', return_value=True)
        repo_dir = Path(tmp_path, 'repo')
        repo_dir.mkdir()

>       deleted = prompt.prompt_and_delete(str(repo_dir))

tests/test_prompt.py:672: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
cookiecutter/prompt.py:274: in prompt_and_delete
    delete = YesNoPrompt.ask(
.venv/lib/python3.10/site-packages/rich/prompt.py:149: in ask
    return _prompt(default=default, stream=stream)
.venv/lib/python3.10/site-packages/rich/prompt.py:292: in __call__
    value = self.get_input(self.console, prompt, self.password, stream=stream)
.venv/lib/python3.10/site-packages/rich/prompt.py:211: in get_input
    return console.input(prompt, password=password, stream=stream)
.venv/lib/python3.10/site-packages/rich/console.py:2156: in input
    result = input()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <_pytest.capture.DontReadFromInput object at 0x7ee47f20c100>, size = -1

    def read(self, size: int = -1) -> str:
>       raise OSError(
            "pytest: reading from stdin while output is captured!  Consider using `-s`."
        )
E       OSError: pytest: reading from stdin while output is captured!  Consider using `-s`.

.venv/lib/python3.10/site-packages/_pytest/capture.py:209: OSError

test_prompt.py::test_prompt_should_ask_and_rm_repo_file

test_prompt.py::test_prompt_should_ask_and_rm_repo_file
mocker = 
tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_prompt_should_ask_and_rm_1')

    def test_prompt_should_ask_and_rm_repo_file(mocker, tmp_path):
        """In `prompt_and_delete()`, if the user agrees to delete/reclone a \
        repo file, the repo should be deleted."""
        mock_read_user = mocker.patch(
            'cookiecutter.prompt.read_user_yes_no', return_value=True, autospec=True
        )

        repo_file = tmp_path.joinpath('repo.zip')
        repo_file.write_text('this is zipfile content')

>       deleted = prompt.prompt_and_delete(str(repo_file))

tests/test_prompt.py:690: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
cookiecutter/prompt.py:274: in prompt_and_delete
    delete = YesNoPrompt.ask(
.venv/lib/python3.10/site-packages/rich/prompt.py:149: in ask
    return _prompt(default=default, stream=stream)
.venv/lib/python3.10/site-packages/rich/prompt.py:292: in __call__
    value = self.get_input(self.console, prompt, self.password, stream=stream)
.venv/lib/python3.10/site-packages/rich/prompt.py:211: in get_input
    return console.input(prompt, password=password, stream=stream)
.venv/lib/python3.10/site-packages/rich/console.py:2156: in input
    result = input()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <_pytest.capture.DontReadFromInput object at 0x7ee47f20c100>, size = -1

    def read(self, size: int = -1) -> str:
>       raise OSError(
            "pytest: reading from stdin while output is captured!  Consider using `-s`."
        )
E       OSError: pytest: reading from stdin while output is captured!  Consider using `-s`.

.venv/lib/python3.10/site-packages/_pytest/capture.py:209: OSError

test_prompt.py::test_prompt_should_ask_and_keep_repo_on_no_reuse

test_prompt.py::test_prompt_should_ask_and_keep_repo_on_no_reuse
mocker = 
tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_prompt_should_ask_and_kee0')

    def test_prompt_should_ask_and_keep_repo_on_no_reuse(mocker, tmp_path):
        """In `prompt_and_delete()`, if the user wants to keep their old \
        cloned template repo, it should not be deleted."""
        mock_read_user = mocker.patch(
            'cookiecutter.prompt.read_user_yes_no', return_value=False, autospec=True
        )
        repo_dir = Path(tmp_path, 'repo')
        repo_dir.mkdir()

        with pytest.raises(SystemExit):
>           prompt.prompt_and_delete(str(repo_dir))

tests/test_prompt.py:707: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
cookiecutter/prompt.py:274: in prompt_and_delete
    delete = YesNoPrompt.ask(
.venv/lib/python3.10/site-packages/rich/prompt.py:149: in ask
    return _prompt(default=default, stream=stream)
.venv/lib/python3.10/site-packages/rich/prompt.py:292: in __call__
    value = self.get_input(self.console, prompt, self.password, stream=stream)
.venv/lib/python3.10/site-packages/rich/prompt.py:211: in get_input
    return console.input(prompt, password=password, stream=stream)
.venv/lib/python3.10/site-packages/rich/console.py:2156: in input
    result = input()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <_pytest.capture.DontReadFromInput object at 0x7ee47f20c100>, size = -1

    def read(self, size: int = -1) -> str:
>       raise OSError(
            "pytest: reading from stdin while output is captured!  Consider using `-s`."
        )
E       OSError: pytest: reading from stdin while output is captured!  Consider using `-s`.

.venv/lib/python3.10/site-packages/_pytest/capture.py:209: OSError

test_prompt.py::test_prompt_should_ask_and_keep_repo_on_reuse

test_prompt.py::test_prompt_should_ask_and_keep_repo_on_reuse
mocker = 
tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_prompt_should_ask_and_kee1')

    def test_prompt_should_ask_and_keep_repo_on_reuse(mocker, tmp_path):
        """In `prompt_and_delete()`, if the user wants to keep their old \
        cloned template repo, it should not be deleted."""

        def answer(question, default):
            return 'okay to delete' not in question

        mock_read_user = mocker.patch(
            'cookiecutter.prompt.read_user_yes_no', side_effect=answer, autospec=True
        )
        repo_dir = Path(tmp_path, 'repo')
        repo_dir.mkdir()

>       deleted = prompt.prompt_and_delete(str(repo_dir))

tests/test_prompt.py:726: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
cookiecutter/prompt.py:274: in prompt_and_delete
    delete = YesNoPrompt.ask(
.venv/lib/python3.10/site-packages/rich/prompt.py:149: in ask
    return _prompt(default=default, stream=stream)
.venv/lib/python3.10/site-packages/rich/prompt.py:292: in __call__
    value = self.get_input(self.console, prompt, self.password, stream=stream)
.venv/lib/python3.10/site-packages/rich/prompt.py:211: in get_input
    return console.input(prompt, password=password, stream=stream)
.venv/lib/python3.10/site-packages/rich/console.py:2156: in input
    result = input()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <_pytest.capture.DontReadFromInput object at 0x7ee47f20c100>, size = -1

    def read(self, size: int = -1) -> str:
>       raise OSError(
            "pytest: reading from stdin while output is captured!  Consider using `-s`."
        )
E       OSError: pytest: reading from stdin while output is captured!  Consider using `-s`.

.venv/lib/python3.10/site-packages/_pytest/capture.py:209: OSError

test_prompt.py::test_prompt_should_not_ask_if_no_input_and_rm_repo_file

test_prompt.py::test_prompt_should_not_ask_if_no_input_and_rm_repo_file
topfd = 12
path = '/tmp/pytest-of-root/pytest-0/test_prompt_should_not_ask_if_1/repo.zip'
onerror = 

    def _rmtree_safe_fd(topfd, path, onerror):
        try:
>           with os.scandir(topfd) as scandir_it:
E           NotADirectoryError: [Errno 20] Not a directory: '/tmp/pytest-of-root/pytest-0/test_prompt_should_not_ask_if_1/repo.zip'

/usr/lib/python3.10/shutil.py:629: NotADirectoryError

During handling of the above exception, another exception occurred:

mocker = 
tmp_path = PosixPath('/tmp/pytest-of-root/pytest-0/test_prompt_should_not_ask_if_1')

    def test_prompt_should_not_ask_if_no_input_and_rm_repo_file(mocker, tmp_path):
        """Prompt should not ask if no input and rm file.

        In `prompt_and_delete()`, if `no_input` is True, the call to
        `prompt.read_user_yes_no()` should be suppressed.
        """
        mock_read_user = mocker.patch(
            'cookiecutter.prompt.read_user_yes_no', return_value=True, autospec=True
        )

        repo_file = tmp_path.joinpath('repo.zip')
        repo_file.write_text('this is zipfile content')

>       deleted = prompt.prompt_and_delete(str(repo_file), no_input=True)

tests/test_prompt.py:765: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
cookiecutter/prompt.py:271: in prompt_and_delete
    rmtree(path)
cookiecutter/utils.py:30: in rmtree
    shutil.rmtree(path, onerror=force_delete)
/usr/lib/python3.10/shutil.py:725: in rmtree
    _rmtree_safe_fd(fd, path, onerror)
/usr/lib/python3.10/shutil.py:633: in _rmtree_safe_fd
    onerror(os.scandir, path, sys.exc_info())
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

func = 
path = '/tmp/pytest-of-root/pytest-0/test_prompt_should_not_ask_if_1/repo.zip'
exc_info = (, NotADirectoryError(20, 'Not a directory'), )

    def force_delete(func, path, exc_info):
        """Error handler for `shutil.rmtree()` equivalent to `rm -rf`.

        Usage: `shutil.rmtree(path, onerror=force_delete)`
        From https://docs.python.org/3/library/shutil.html#rmtree-example
        """
        os.chmod(path, stat.S_IWRITE)
>       func(path)
E       NotADirectoryError: [Errno 20] Not a directory: '/tmp/pytest-of-root/pytest-0/test_prompt_should_not_ask_if_1/repo.zip'

cookiecutter/utils.py:22: NotADirectoryError

test_read_user_choice.py::test_click_invocation[1-hello]

test_read_user_choice.py::test_click_invocation[1-hello]
mocker = 
user_choice = 1, expected_value = 'hello'

    @pytest.mark.parametrize('user_choice, expected_value', enumerate(OPTIONS, 1))
    def test_click_invocation(mocker, user_choice, expected_value):
        """Test click function called correctly by cookiecutter.

        Test for choice type invocation.
        """
        prompt = mocker.patch('rich.prompt.Prompt.ask')
        prompt.return_value = f'{user_choice}'

>       assert read_user_choice('varname', OPTIONS) == expected_value
E       AssertionError: assert '1' == 'hello'
E         
E         - hello
E         + 1

tests/test_read_user_choice.py:27: AssertionError

test_read_user_choice.py::test_click_invocation[2-world]

test_read_user_choice.py::test_click_invocation[2-world]
mocker = 
user_choice = 2, expected_value = 'world'

    @pytest.mark.parametrize('user_choice, expected_value', enumerate(OPTIONS, 1))
    def test_click_invocation(mocker, user_choice, expected_value):
        """Test click function called correctly by cookiecutter.

        Test for choice type invocation.
        """
        prompt = mocker.patch('rich.prompt.Prompt.ask')
        prompt.return_value = f'{user_choice}'

>       assert read_user_choice('varname', OPTIONS) == expected_value
E       AssertionError: assert '2' == 'world'
E         
E         - world
E         + 2

tests/test_read_user_choice.py:27: AssertionError

test_read_user_choice.py::test_click_invocation[3-foo]

test_read_user_choice.py::test_click_invocation[3-foo]
mocker = 
user_choice = 3, expected_value = 'foo'

    @pytest.mark.parametrize('user_choice, expected_value', enumerate(OPTIONS, 1))
    def test_click_invocation(mocker, user_choice, expected_value):
        """Test click function called correctly by cookiecutter.

        Test for choice type invocation.
        """
        prompt = mocker.patch('rich.prompt.Prompt.ask')
        prompt.return_value = f'{user_choice}'

>       assert read_user_choice('varname', OPTIONS) == expected_value
E       AssertionError: assert '3' == 'foo'
E         
E         - foo
E         + 3

tests/test_read_user_choice.py:27: AssertionError

test_read_user_choice.py::test_click_invocation[4-bar]

test_read_user_choice.py::test_click_invocation[4-bar]
mocker = 
user_choice = 4, expected_value = 'bar'

    @pytest.mark.parametrize('user_choice, expected_value', enumerate(OPTIONS, 1))
    def test_click_invocation(mocker, user_choice, expected_value):
        """Test click function called correctly by cookiecutter.

        Test for choice type invocation.
        """
        prompt = mocker.patch('rich.prompt.Prompt.ask')
        prompt.return_value = f'{user_choice}'

>       assert read_user_choice('varname', OPTIONS) == expected_value
E       AssertionError: assert '4' == 'bar'
E         
E         - bar
E         + 4

tests/test_read_user_choice.py:27: AssertionError

test_read_user_choice.py::test_raise_if_options_is_not_a_non_empty_list

test_read_user_choice.py::test_raise_if_options_is_not_a_non_empty_list
def test_raise_if_options_is_not_a_non_empty_list():
        """Test function called by cookiecutter raise expected errors.

        Test for choice type invocation.
        """
        with pytest.raises(TypeError):
>           read_user_choice('foo', 'NOT A LIST')

tests/test_read_user_choice.py:38: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
cookiecutter/prompt.py:85: in read_user_choice
    return Prompt.ask(prompt_text, choices=options, default=options[0])
.venv/lib/python3.10/site-packages/rich/prompt.py:149: in ask
    return _prompt(default=default, stream=stream)
.venv/lib/python3.10/site-packages/rich/prompt.py:292: in __call__
    value = self.get_input(self.console, prompt, self.password, stream=stream)
.venv/lib/python3.10/site-packages/rich/prompt.py:211: in get_input
    return console.input(prompt, password=password, stream=stream)
.venv/lib/python3.10/site-packages/rich/console.py:2156: in input
    result = input()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <_pytest.capture.DontReadFromInput object at 0x7ee47f20c100>, size = -1

    def read(self, size: int = -1) -> str:
>       raise OSError(
            "pytest: reading from stdin while output is captured!  Consider using `-s`."
        )
E       OSError: pytest: reading from stdin while output is captured!  Consider using `-s`.

.venv/lib/python3.10/site-packages/_pytest/capture.py:209: OSError

test_read_user_dict.py::test_process_json_invalid_json

test_read_user_dict.py::test_process_json_invalid_json
def test_process_json_invalid_json():
        """Test `process_json` for correct error on malformed input."""
>       with pytest.raises(InvalidResponse) as exc_info:
E       Failed: DID NOT RAISE 

tests/test_read_user_dict.py:12: Failed

test_read_user_dict.py::test_process_json_non_dict

test_read_user_dict.py::test_process_json_non_dict
def test_process_json_non_dict():
        """Test `process_json` for correct error on non-JSON input."""
>       with pytest.raises(InvalidResponse) as exc_info:
E       Failed: DID NOT RAISE 

tests/test_read_user_dict.py:20: Failed

test_read_user_dict.py::test_should_raise_type_error

test_read_user_dict.py::test_should_raise_type_error
mocker = 

    def test_should_raise_type_error(mocker):
        """Test `default_value` arg verification in `read_user_dict` function."""
        prompt = mocker.patch('cookiecutter.prompt.JsonPrompt.ask')

>       with pytest.raises(TypeError):
E       Failed: DID NOT RAISE 

tests/test_read_user_dict.py:79: Failed

test_read_user_dict.py::test_should_call_prompt_with_process_json

test_read_user_dict.py::test_should_call_prompt_with_process_json
mocker = 

    def test_should_call_prompt_with_process_json(mocker):
        """Test to make sure that `process_json` is actually being used.

        Verifies generation of a processor for the user input.
        """
        mock_prompt = mocker.patch('cookiecutter.prompt.JsonPrompt.ask', autospec=True)

        read_user_dict('name', {'project_slug': 'pytest-plugin'})
        print(mock_prompt.call_args)
        args, kwargs = mock_prompt.call_args

>       assert args == ('name [cyan bold](default)[/]',)
E       AssertionError: assert ('name',) == ('name [cyan bold](default)[/]',)
E         
E         At index 0 diff: 'name' != 'name [cyan bold](default)[/]'
E         
E         Full diff:
E           (
E         -     'name [cyan bold](default)[/]',
E         +     'name',
E           )

tests/test_read_user_dict.py:95: AssertionError

test_read_user_dict.py::test_read_user_dict_default_value[\n]

test_read_user_dict.py::test_read_user_dict_default_value[\n]
mocker = 
input = '\n'

    @pytest.mark.parametrize("input", ["\n", "\ndefault\n"])
    def test_read_user_dict_default_value(mocker, input):
        """Make sure that `read_user_dict` returns the default value.

        Verify return of a dict variable rather than the display value.
        """
        runner = click.testing.CliRunner()
        with runner.isolation(input=input):
            val = read_user_dict('name', {'project_slug': 'pytest-plugin'})

>       assert val == {'project_slug': 'pytest-plugin'}
E       assert '{"project_slug": "pytest-plugin"}' == {'project_slug': 'pytest-plugin'}

tests/test_read_user_dict.py:122: AssertionError

test_read_user_dict.py::test_read_user_dict_default_value[\ndefault\n]

test_read_user_dict.py::test_read_user_dict_default_value[\ndefault\n]
mocker = 
input = '\ndefault\n'

    @pytest.mark.parametrize("input", ["\n", "\ndefault\n"])
    def test_read_user_dict_default_value(mocker, input):
        """Make sure that `read_user_dict` returns the default value.

        Verify return of a dict variable rather than the display value.
        """
        runner = click.testing.CliRunner()
        with runner.isolation(input=input):
            val = read_user_dict('name', {'project_slug': 'pytest-plugin'})

>       assert val == {'project_slug': 'pytest-plugin'}
E       assert '{"project_slug": "pytest-plugin"}' == {'project_slug': 'pytest-plugin'}

tests/test_read_user_dict.py:122: AssertionError

test_read_user_variable.py::test_input_loop_with_null_default_value

test_read_user_variable.py::test_input_loop_with_null_default_value
mock_prompt = 

    def test_input_loop_with_null_default_value(mock_prompt):
        """Test `Prompt.ask` is run repeatedly until a valid answer is provided.

        Test for `default_value` parameter equal to None.
        """
        # Simulate user providing None input initially and then a valid input
        mock_prompt.side_effect = [None, DEFAULT]

>       assert read_user_variable(VARIABLE, None) == DEFAULT
E       AssertionError: assert None == 'Kivy Project'
E        +  where None = read_user_variable('project_name', None)

tests/test_read_user_variable.py:37: AssertionError

test_repo_not_found.py::test_should_raise_error_if_repo_does_not_exist

test_repo_not_found.py::test_should_raise_error_if_repo_does_not_exist
def test_should_raise_error_if_repo_does_not_exist():
        """Cookiecutter invocation with non-exist repository should raise error."""
        with pytest.raises(exceptions.RepositoryNotFound):
>           main.cookiecutter('definitely-not-a-valid-repo-dir')

tests/test_repo_not_found.py:11: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = 'definitely-not-a-valid-repo-dir', checkout = None, no_input = False
extra_context = None, replay = None, overwrite_if_exists = False
output_dir = '.', config_file = None, default_config = False, password = None
directory = None, skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

cookiecutter/main.py:60: TypeError

test_specify_output_dir.py::test_api_invocation

test_specify_output_dir.py::test_api_invocation
mocker = 
template = '/tmp/pytest-of-root/pytest-0/test_api_invocation0/template'
output_dir = '/tmp/pytest-of-root/pytest-0/test_api_invocation0/output'
context = {'cookiecutter': {'email': 'raphael@hackebrot.de', 'full_name': 'Raphael Pierzina', 'github_username': 'hackebrot', 'version': '0.1.0'}}

    def test_api_invocation(mocker, template, output_dir, context):
        """Verify output dir location is correctly passed."""
        mock_gen_files = mocker.patch('cookiecutter.main.generate_files')

>       main.cookiecutter(template, output_dir=output_dir)

tests/test_specify_output_dir.py:52: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = '/tmp/pytest-of-root/pytest-0/test_api_invocation0/template'
checkout = None, no_input = False, extra_context = None, replay = None
overwrite_if_exists = False
output_dir = '/tmp/pytest-of-root/pytest-0/test_api_invocation0/output'
config_file = None, default_config = False, password = None, directory = None
skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

cookiecutter/main.py:60: TypeError

test_specify_output_dir.py::test_default_output_dir

test_specify_output_dir.py::test_default_output_dir
mocker = 
template = '/tmp/pytest-of-root/pytest-0/test_default_output_dir0/template'
context = {'cookiecutter': {'email': 'raphael@hackebrot.de', 'full_name': 'Raphael Pierzina', 'github_username': 'hackebrot', 'version': '0.1.0'}}

    def test_default_output_dir(mocker, template, context):
        """Verify default output dir is current working folder."""
        mock_gen_files = mocker.patch('cookiecutter.main.generate_files')

>       main.cookiecutter(template)

tests/test_specify_output_dir.py:69: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = '/tmp/pytest-of-root/pytest-0/test_default_output_dir0/template'
checkout = None, no_input = False, extra_context = None, replay = None
overwrite_if_exists = False, output_dir = '.', config_file = None
default_config = False, password = None, directory = None
skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

cookiecutter/main.py:60: TypeError

test_templates.py::test_build_templates[include]

test_templates.py::test_build_templates[include]
template = 'include'
output_dir = '/tmp/pytest-of-root/pytest-0/test_build_templates_include_0/templates'

    @pytest.mark.parametrize("template", ["include", "no-templates", "extends", "super"])
    def test_build_templates(template, output_dir):
        """
        Verify Templates Design keywords.

        no-templates is a compatibility tests for repo without `templates` directory
        """
>       project_dir = main.cookiecutter(
            f'tests/test-templates/{template}',
            no_input=True,
            output_dir=output_dir,
        )

tests/test_templates.py:28: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = 'tests/test-templates/include', checkout = None, no_input = True
extra_context = None, replay = None, overwrite_if_exists = False
output_dir = '/tmp/pytest-of-root/pytest-0/test_build_templates_include_0/templates'
config_file = None, default_config = False, password = None, directory = None
skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

cookiecutter/main.py:60: TypeError

test_templates.py::test_build_templates[no-templates]

test_templates.py::test_build_templates[no-templates]
template = 'no-templates'
output_dir = '/tmp/pytest-of-root/pytest-0/test_build_templates_no_templa0/templates'

    @pytest.mark.parametrize("template", ["include", "no-templates", "extends", "super"])
    def test_build_templates(template, output_dir):
        """
        Verify Templates Design keywords.

        no-templates is a compatibility tests for repo without `templates` directory
        """
>       project_dir = main.cookiecutter(
            f'tests/test-templates/{template}',
            no_input=True,
            output_dir=output_dir,
        )

tests/test_templates.py:28: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = 'tests/test-templates/no-templates', checkout = None, no_input = True
extra_context = None, replay = None, overwrite_if_exists = False
output_dir = '/tmp/pytest-of-root/pytest-0/test_build_templates_no_templa0/templates'
config_file = None, default_config = False, password = None, directory = None
skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

cookiecutter/main.py:60: TypeError

test_templates.py::test_build_templates[extends]

test_templates.py::test_build_templates[extends]
template = 'extends'
output_dir = '/tmp/pytest-of-root/pytest-0/test_build_templates_extends_0/templates'

    @pytest.mark.parametrize("template", ["include", "no-templates", "extends", "super"])
    def test_build_templates(template, output_dir):
        """
        Verify Templates Design keywords.

        no-templates is a compatibility tests for repo without `templates` directory
        """
>       project_dir = main.cookiecutter(
            f'tests/test-templates/{template}',
            no_input=True,
            output_dir=output_dir,
        )

tests/test_templates.py:28: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = 'tests/test-templates/extends', checkout = None, no_input = True
extra_context = None, replay = None, overwrite_if_exists = False
output_dir = '/tmp/pytest-of-root/pytest-0/test_build_templates_extends_0/templates'
config_file = None, default_config = False, password = None, directory = None
skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

cookiecutter/main.py:60: TypeError

test_templates.py::test_build_templates[super]

test_templates.py::test_build_templates[super]
template = 'super'
output_dir = '/tmp/pytest-of-root/pytest-0/test_build_templates_super_0/templates'

    @pytest.mark.parametrize("template", ["include", "no-templates", "extends", "super"])
    def test_build_templates(template, output_dir):
        """
        Verify Templates Design keywords.

        no-templates is a compatibility tests for repo without `templates` directory
        """
>       project_dir = main.cookiecutter(
            f'tests/test-templates/{template}',
            no_input=True,
            output_dir=output_dir,
        )

tests/test_templates.py:28: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

template = 'tests/test-templates/super', checkout = None, no_input = True
extra_context = None, replay = None, overwrite_if_exists = False
output_dir = '/tmp/pytest-of-root/pytest-0/test_build_templates_super_0/templates'
config_file = None, default_config = False, password = None, directory = None
skip_if_file_exists = False, accept_hooks = True
keep_project_on_failure = False

    def cookiecutter(template, checkout=None, no_input=False, extra_context=
        None, replay=None, overwrite_if_exists=False, output_dir='.',
        config_file=None, default_config=False, password=None, directory=None,
        skip_if_file_exists=False, accept_hooks=True, keep_project_on_failure=False
        ):
        """
        Run Cookiecutter just as if using it from the command line.

        :param template: A directory containing a project template directory,
            or a URL to a git repository.
        :param checkout: The branch, tag or commit ID to checkout after clone.
        :param no_input: Do not prompt for user input.
            Use default values for template parameters taken from `cookiecutter.json`, user
            config and `extra_dict`. Force a refresh of cached resources.
        :param extra_context: A dictionary of context that overrides default
            and user configuration.
        :param replay: Do not prompt for input, instead read from saved json. If
            ``True`` read from the ``replay_dir``.
            if it exists
        :param overwrite_if_exists: Overwrite the contents of the output directory
            if it exists.
        :param output_dir: Where to output the generated project dir into.
        :param config_file: User configuration file path.
        :param default_config: Use default values rather than a config file.
        :param password: The password to use when extracting the repository.
        :param directory: Relative path to a cookiecutter template in a repository.
        :param skip_if_file_exists: Skip the files in the corresponding directories
            if they already exist.
        :param accept_hooks: Accept pre and post hooks if set to `True`.
        :param keep_project_on_failure: If `True` keep generated project directory even when
            generation fails
        """
        try:
            # Get user configuration
            config_dict = get_user_config(config_file=config_file, default_config=default_config)

            # Determine the template directory
>           repo_dir, cleanup = determine_repo_dir(
                template=template,
                checkout=checkout,
                clone_to_dir=config_dict['cookiecutters_dir'],
                no_input=no_input,
                password=password,
                directory=directory
            )
E           TypeError: determine_repo_dir() missing 1 required positional argument: 'abbreviations'

cookiecutter/main.py:60: TypeError

test_time_extension.py::test_utc_default_datetime_format

test_time_extension.py::test_utc_default_datetime_format
environment = 

    def test_utc_default_datetime_format(environment):
        """Verify default datetime format can be parsed."""
        template = environment.from_string("{% now 'utc' %}")

>       assert template.render() == "2015-12-09"
E       AssertionError: assert 'utc' == '2015-12-09'
E         
E         - 2015-12-09
E         + utc

tests/test_time_extension.py:33: AssertionError

test_time_extension.py::test_accept_valid_timezones[utc]

test_time_extension.py::test_accept_valid_timezones[utc]
environment = 
valid_tz = 'utc'

    @pytest.mark.parametrize("valid_tz", ['utc', 'local', 'Europe/Berlin'])
    def test_accept_valid_timezones(environment, valid_tz):
        """Verify that valid timezones are accepted."""
        template = environment.from_string(f"{{% now '{valid_tz}', '%Y-%m' %}}")

>       assert template.render() == '2015-12'

tests/test_time_extension.py:41: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.venv/lib/python3.10/site-packages/jinja2/environment.py:1304: in render
    self.environment.handle_exception()
.venv/lib/python3.10/site-packages/jinja2/environment.py:939: in handle_exception
    raise rewrite_traceback_stack(source=source)