# -*- coding: utf-8 -*- import os import re import sh 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", "repo_name": "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", "now": "2015/01/13", "year": "2015" } 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['repo_name'] assert result.project.isdir() paths = build_files_list(str(result.project)) assert paths check_paths(paths) @pytest.fixture(params=['use_maildump', '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['repo_name'] 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)