Completed
Pull Request — master (#934)
by
unknown
01:05
created

_test_symlink()   A

Complexity

Conditions 4

Size

Total Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 4
c 1
b 0
f 0
dl 0
loc 9
rs 9.2
1
# -*- coding: utf-8 -*-
2
3
"""
4
test_generate_symlinks
5
---------------------------------
6
"""
7
8
from __future__ import unicode_literals
9
import os
10
import sys
11
12
import pytest
13
14
from cookiecutter import generate
15
from cookiecutter import utils
16
17
TEST_OUTPUT_DIR = 'test_symlinks'
18
19
WINDOWS_LESS_PY32 = sys.platform.startswith('win') and sys.version_info < (3, 2)
20
21
22
@pytest.fixture(scope='function')
23
def remove_test_dir(request):
24
    """
25
    Remove the folder that is created by the test.
26
    """
27
    def fin_remove_test_dir():
28
        if os.path.exists(TEST_OUTPUT_DIR):
29
            utils.rmtree(TEST_OUTPUT_DIR)
30
    request.addfinalizer(fin_remove_test_dir)
31
32
@pytest.mark.skipif(WINDOWS_LESS_PY32, reason='Symlinks do not work as expected on Windows + Python < 3.2')
33
@pytest.mark.usefixtures('clean_system', 'remove_test_dir')
34
def test_generate_copy_without_render_extensions():
35
    generate.generate_files(
36
        context={
37
            'cookiecutter': {
38
                'name': TEST_OUTPUT_DIR,
39
                "link_dir": "rendered_dir",
40
                "sym_to_nontemp": "rendered_sym_to_original",
41
                "sym_to_temp": "rendered_sym_to_rendered_dir",
42
                "_copy_without_render": [
43
                    "copy_no_render"
44
                ]
45
            }
46
        },
47
        repo_dir='tests/test-generate-symlinks'
48
    )
49
50
    dir_contents = os.listdir(TEST_OUTPUT_DIR)
51
52
    assert 'copy_no_render' in dir_contents
53
    assert 'original' in dir_contents
54
    assert 'rendered_dir' in dir_contents
55
    assert 'rendered_sym_to_original' in dir_contents
56
    assert 'rendered_sym_to_rendered_dir' in dir_contents
57
    assert 'symlink' in dir_contents
58
59
    # Test links that have been rendered and copied
60
    def _test_symlink(root, link, points_to):
61
        assert os.path.islink(os.path.join(root, link))
62
63
        actual_points_to = os.readlink(os.path.join(root, link))
64
65
        if actual_points_to.endswith(os.sep):
66
            actual_points_to = actual_points_to[:-1]
67
68
        assert actual_points_to == points_to
69
70
    # normal symlink, not rendered target
71
    _test_symlink(TEST_OUTPUT_DIR, 'symlink', 'original')
72
73
    # normal symlink, rendered target
74
    _test_symlink(TEST_OUTPUT_DIR, 'symlink_to_rendered', 'rendered_dir')
75
76
    # rendered symlink, not rendered target
77
    _test_symlink(TEST_OUTPUT_DIR, 'rendered_sym_to_original', 'original')
78
79
    # rendered symlink, rendered target
80
    _test_symlink(TEST_OUTPUT_DIR, 'rendered_sym_to_rendered_dir',
81
                  'rendered_dir')
82
83
    # Test links that have not been rendered
84
    non_rendered_dir = os.path.join(TEST_OUTPUT_DIR, 'copy_no_render')
85
    non_rendered_dir_contents = os.listdir(non_rendered_dir)
86
87
    assert 'original' in non_rendered_dir_contents
88
    assert 'symlink' in non_rendered_dir_contents
89
    assert 'symlink_to_rendered' in non_rendered_dir_contents
90
    assert '{{ cookiecutter.link_dir }}' in non_rendered_dir_contents
91
    assert '{{ cookiecutter.sym_to_nontemp }}' in non_rendered_dir_contents
92
    assert '{{ cookiecutter.sym_to_temp }}' in non_rendered_dir_contents
93
94
    # normal symlink, not rendered target
95
    _test_symlink(non_rendered_dir, 'symlink', 'original')
96
97
    # normal symlink, rendered target
98
    _test_symlink(non_rendered_dir,
99
                  'symlink_to_rendered',
100
                  '{{ cookiecutter.link_dir }}')
101
102
    # rendered symlink, not rendered target
103
    _test_symlink(non_rendered_dir,
104
                  '{{ cookiecutter.sym_to_nontemp }}',
105
                  'original')
106
107
    # rendered symlink, rendered target
108
    _test_symlink(non_rendered_dir,
109
                  '{{ cookiecutter.sym_to_temp }}',
110
                  '{{ cookiecutter.link_dir }}')
111