Completed
Push — master ( acfc98...8a8271 )
by
unknown
01:01
created

test_generate_file_jsonify_filter()   A

Complexity

Conditions 4

Size

Total Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 4
c 1
b 0
f 1
dl 0
loc 14
rs 9.2
1
# -*- coding: utf-8 -*-
2
3
"""
4
test_generate_file
5
------------------
6
7
Tests formerly known from a unittest residing in test_generate.py named
8
TestGenerateFile.test_generate_file
9
TestGenerateFile.test_generate_file_verbose_template_syntax_error
10
"""
11
12
from __future__ import unicode_literals
13
import os
14
import pytest
15
import json
16
17
from jinja2 import FileSystemLoader
18
from jinja2.exceptions import TemplateSyntaxError
19
20
from cookiecutter import generate
21
from cookiecutter.environment import StrictEnvironment
22
23
24
@pytest.fixture(scope='function')
25
def remove_cheese_file(request):
26
    """
27
    Remove the cheese text file which is created by the tests.
28
    """
29
    def fin_remove_cheese_file():
30
        if os.path.exists('tests/files/cheese.txt'):
31
            os.remove('tests/files/cheese.txt')
32
    request.addfinalizer(fin_remove_cheese_file)
33
34
35
@pytest.fixture
36
def env():
37
    environment = StrictEnvironment()
38
    environment.loader = FileSystemLoader('.')
39
    return environment
40
41
42
@pytest.mark.usefixtures('remove_cheese_file')
43
def test_generate_file(env):
44
    infile = 'tests/files/{{generate_file}}.txt'
45
    generate.generate_file(
46
        project_dir=".",
47
        infile=infile,
48
        context={'generate_file': 'cheese'},
49
        env=env
50
    )
51
    assert os.path.isfile('tests/files/cheese.txt')
52
    with open('tests/files/cheese.txt', 'rt') as f:
53
        generated_text = f.read()
54
        assert generated_text == 'Testing cheese'
55
56
57
@pytest.mark.usefixtures('remove_cheese_file')
58
def test_generate_file_with_false_condition(env):
59
    infile = 'tests/files/{% if generate_file == \'y\' %}cheese.txt{% endif %}'
60
    generate.generate_file(
61
        project_dir=".",
62
        infile=infile,
63
        context={'generate_file': 'n'},
64
        env=env
65
    )
66
    assert not os.path.exists('tests/files/cheese.txt')
67
68
69
@pytest.mark.usefixtures('remove_cheese_file')
70
def test_generate_file_jsonify_filter(env):
71
    infile = 'tests/files/{{cookiecutter.jsonify_file}}.txt'
72
    data = {'jsonify_file': 'cheese', 'type': 'roquefort'}
73
    generate.generate_file(
74
        project_dir=".",
75
        infile=infile,
76
        context={'cookiecutter': data},
77
        env=env
78
    )
79
    assert os.path.isfile('tests/files/cheese.txt')
80
    with open('tests/files/cheese.txt', 'rt') as f:
81
        generated_text = f.read()
82
        assert json.loads(generated_text) == data
83
84
85
@pytest.mark.usefixtures('remove_cheese_file')
86
def test_generate_file_with_true_conditional(env):
87
    infile = 'tests/files/{% if generate_file == \'y\' %}cheese.txt{% endif %}'
88
    generate.generate_file(
89
        project_dir=".",
90
        infile=infile,
91
        context={'generate_file': 'y'},
92
        env=env
93
    )
94
    assert os.path.isfile('tests/files/cheese.txt')
95
    with open('tests/files/cheese.txt', 'rt') as f:
96
        generated_text = f.read()
97
        assert generated_text == 'Testing that generate_file was y'
98
99
100
@pytest.fixture
101
def expected_msg():
102
    msg = (
103
        'Missing end of comment tag\n'
104
        '  File "./tests/files/syntax_error.txt", line 1\n'
105
        '    I eat {{ syntax_error }} {# this comment is not closed}'
106
    )
107
    return msg.replace("/", os.sep)
108
109
110
@pytest.mark.usefixtures('remove_cheese_file')
111
def test_generate_file_verbose_template_syntax_error(env, expected_msg):
112
    try:
113
        generate.generate_file(
114
            project_dir=".",
115
            infile='tests/files/syntax_error.txt',
116
            context={'syntax_error': 'syntax_error'},
117
            env=env
118
        )
119
    except TemplateSyntaxError as exception:
120
        assert str(exception) == expected_msg
121
    except Exception as exception:
122
        pytest.fail('Unexpected exception thrown: {0}'.format(exception))
123
    else:
124
        pytest.fail('TemplateSyntaxError not thrown')
125