copier/tests/test_answersfile.py
Jairo Llopis 0441b86f0c
Refactor (#314)
* Refactor
* Fix #110.
* Rewrite test_config_exclude, test_config_exclude_overridden and test_config_include. These tests were badly designed, using a monkeypatch that would never happen in the real world, and actually producing false positives. I moved them to test_exclude.py and rewritten to test the what and not the how.
* Fix #214 by removing skip option. Relevant tests use the better skip_if_exists=["**"].
* Remove subdirectory flag from API/CLI. It was confusing and could lead to bad maintenance situations. Fixes #315.
* Remove extra_paths and fix #321
* Remember that you cannot use _copier_conf.src_path as a path now
* use dataclasses
* Create errors module, simplify some tests, fix many others
* Fix some tests, complete EnvOps removal
* Fix #214 and some tests related to it
* Reorder code
* Update docs and imports
* Modularize test_complex_questions
* Interlink worker and questionary a bit better
* Removal of Questionary class, which only had 1 meaningful method that is now merged into Worker to avoid circular dependencies.
* Fix #280 in a simple way: only user answers are type-casted inside API, and CLI transforms all `--data` using YAML always. Predictable.
* Use prereleases correctly.
* Reorder AnswersMap to have a more significative repr.
* Simpler cache for old `Question.get_choices()` method (renamed now).
* fix wrong test
* Fix test_subdirectory
* Fix test_tasks (and remove tests/demo_tasks)
* Fix path filter tests, and move it to test_exclude, where it belongs
* Make test_config pass
* Fix more wrongly designed tests
* Use cached_property backport if needed
* xfail test known to fail on mac
* force posix paths on windows
* Add typing_extensions for python < 3.8
* Sort dependencies in pyproject.toml
* Support python 3.6 str-to-datetime conversion
* Workaround https://bugs.python.org/issue43095
* xfail test_path_filter on windows
* Upgrade mkdocs and other dependencies to fix https://github.com/pawamoy/mkdocstrings/issues/222
* Add missing reference docs.
* Add workaround for https://github.com/pawamoy/mkdocstrings/pull/209
* Docs.
* Remove validators module
* Add workaround for https://github.com/pawamoy/mkdocstrings/issues/225
* Restore docs autorefs as explained in https://github.com/pawamoy/mkdocstrings/issues/226#issuecomment-775413562.
* Workaround https://github.com/pawamoy/pytkdocs/issues/86
2021-02-09 18:22:47 +00:00

112 lines
3.4 KiB
Python

from textwrap import dedent
import pytest
import copier
from copier.user_data import load_answersfile_data
from .helpers import build_file_tree
@pytest.fixture(scope="module")
def template_path(tmp_path_factory) -> str:
root = tmp_path_factory.mktemp("template")
build_file_tree(
{
root
/ "[[ _copier_conf.answers_file ]].tmpl": """\
# Changes here will be overwritten by Copier
[[ _copier_answers|to_nice_yaml ]]
""",
root
/ "copier.yml": """\
_answers_file: .answers-file-changed-in-template.yml
round: 1st
# A str question without a default should default to None
str_question_without_default:
type: str
# password_1 and password_2 must not appear in answers file
_secret_questions:
- password_1
password_1: password one
password_2:
secret: yes
default: password two
""",
root
/ "round.txt.tmpl": """\
It's the [[round]] round.
password_1=[[password_1]]
password_2=[[password_2]]
""",
}
)
return str(root)
@pytest.mark.parametrize("answers_file", [None, ".changed-by-user.yaml"])
def test_answersfile(template_path, tmp_path, answers_file):
"""Test copier behaves properly when using an answersfile."""
round_file = tmp_path / "round.txt"
# Check 1st round is properly executed and remembered
copier.copy(template_path, tmp_path, answers_file=answers_file, force=True)
answers_file = answers_file or ".answers-file-changed-in-template.yml"
assert (
round_file.read_text()
== dedent(
"""
It's the 1st round.
password_1=password one
password_2=password two
"""
).lstrip()
)
log = load_answersfile_data(tmp_path, answers_file)
assert log["round"] == "1st"
assert log["str_question_without_default"] is None
assert "password_1" not in log
assert "password_2" not in log
# Check 2nd round is properly executed and remembered
copier.copy(
template_path, tmp_path, {"round": "2nd"}, answers_file=answers_file, force=True
)
assert (
round_file.read_text()
== dedent(
"""
It's the 2nd round.
password_1=password one
password_2=password two
"""
).lstrip()
)
log = load_answersfile_data(tmp_path, answers_file)
assert log["round"] == "2nd"
assert log["str_question_without_default"] is None
assert "password_1" not in log
assert "password_2" not in log
# Check repeating 2nd is properly executed and remembered
copier.copy(template_path, tmp_path, answers_file=answers_file, force=True)
assert (
round_file.read_text()
== dedent(
"""
It's the 2nd round.
password_1=password one
password_2=password two
"""
).lstrip()
)
log = load_answersfile_data(tmp_path, answers_file)
assert log["round"] == "2nd"
assert log["str_question_without_default"] is None
assert "password_1" not in log
assert "password_2" not in log