import os import re import sh import yaml import pytest from binaryornot.check import is_binary PATTERN = "{{(\s?cookiecutter)[.](.*?)}}" RE_OBJ = re.compile(PATTERN) @pytest.fixture def context(): return { "project_name": "My Test Project", "project_slug": "my_test_project", "author_name": "Test Author", "email": "test@example.com", "description": "A short description of the project.", "domain_name": "example.com", "version": "0.1.0", "timezone": "UTC", } def build_files_list(root_dir): """Build a list containing absolute paths to the generated files.""" return [ os.path.join(dirpath, file_path) for dirpath, subdirs, files in os.walk(root_dir) for file_path in files ] def check_paths(paths): """Method to check all paths have correct substitutions, used by other tests cases """ # Assert that no match is found in any of the files for path in paths: if is_binary(path): continue for line in open(path, "r"): match = RE_OBJ.search(line) msg = "cookiecutter variable not replaced in {}" assert match is None, msg.format(path) def test_default_configuration(cookies, context): result = cookies.bake(extra_context=context) assert result.exit_code == 0 assert result.exception is None assert result.project.basename == context["project_slug"] assert result.project.isdir() paths = build_files_list(str(result.project)) assert paths check_paths(paths) @pytest.fixture(params=["use_mailhog", "use_celery", "windows"]) def feature_context(request, context): context.update({request.param: "y"}) return context def test_enabled_features(cookies, feature_context): result = cookies.bake(extra_context=feature_context) assert result.exit_code == 0 assert result.exception is None assert result.project.basename == feature_context["project_slug"] assert result.project.isdir() paths = build_files_list(str(result.project)) assert paths check_paths(paths) def test_flake8_compliance(cookies): """generated project should pass flake8""" result = cookies.bake() try: sh.flake8(str(result.project)) except sh.ErrorReturnCode as e: pytest.fail(e) def test_travis_invokes_pytest(cookies, context): context.update({"use_travisci": "y"}) result = cookies.bake(extra_context=context) assert result.exit_code == 0 assert result.exception is None assert result.project.basename == context["project_slug"] assert result.project.isdir() with open(f'{result.project}/.travis.yml', 'r') as travis_yml: try: assert yaml.load(travis_yml)['script'] == ['pytest'] except yaml.YAMLError as e: pytest.fail(e)