Completed
Pull Request — master (#934)
by
unknown
54s
created

_test_symlink()   A

Complexity

Conditions 4

Size

Total Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
dl 0
loc 9
rs 9.2
c 0
b 0
f 0
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.exceptions import NoSymlinksOnWindowsPythonBefore32
15
from cookiecutter import generate
16
from cookiecutter import utils
17
18
19
TEST_OUTPUT_DIR = 'test_symlinks'
20
21
WIN_BEFORE_PY32 = sys.platform.startswith('win') and sys.version_info < (3, 2)
22
23
24
@pytest.fixture(scope='function')
25
def remove_test_dir(request):
26
    """
27
    Remove the folder that is created by the test.
28
    """
29
    def fin_remove_test_dir():
30
        if os.path.exists(TEST_OUTPUT_DIR):
31
            utils.rmtree(TEST_OUTPUT_DIR)
32
    request.addfinalizer(fin_remove_test_dir)
33
34
35
@pytest.mark.skipif(WIN_BEFORE_PY32,
36
                    reason='No symlinks on Windows + Python < 3.2')
37
@pytest.mark.usefixtures('clean_system', 'remove_test_dir')
38
def test_symlinks():
39
    generate.generate_files(
40
        context={
41
            'cookiecutter': {
42
                'name': TEST_OUTPUT_DIR,
43
                "link_dir": "rendered_dir",
44
                "sym_to_nontemp": "rendered_sym_to_original",
45
                "sym_to_temp": "rendered_sym_to_rendered_dir",
46
                "_copy_without_render": [
47
                    "copy_no_render"
48
                ]
49
            }
50
        },
51
        repo_dir='tests/test-generate-symlinks'
52
    )
53
54
    dir_contents = os.listdir(TEST_OUTPUT_DIR)
55
56
    assert 'copy_no_render' in dir_contents
57
    assert 'original' in dir_contents
58
    assert 'rendered_dir' in dir_contents
59
    assert 'rendered_sym_to_original' in dir_contents
60
    assert 'rendered_sym_to_rendered_dir' in dir_contents
61
    assert 'symlink' in dir_contents
62
63
    # Test links that have been rendered and copied
64
    def _test_symlink(root, link, points_to):
65
        assert os.path.islink(os.path.join(root, link))
66
67
        actual_points_to = os.readlink(os.path.join(root, link))
68
69
        if actual_points_to.endswith(os.sep):
70
            actual_points_to = actual_points_to[:-1]
71
72
        assert actual_points_to == points_to
73
74
    # normal symlink, not rendered target
75
    _test_symlink(TEST_OUTPUT_DIR, 'symlink', 'original')
76
77
    # normal symlink, rendered target
78
    _test_symlink(TEST_OUTPUT_DIR, 'symlink_to_rendered', 'rendered_dir')
79
80
    # rendered symlink, not rendered target
81
    _test_symlink(TEST_OUTPUT_DIR, 'rendered_sym_to_original', 'original')
82
83
    # rendered symlink, rendered target
84
    _test_symlink(TEST_OUTPUT_DIR, 'rendered_sym_to_rendered_dir',
85
                  'rendered_dir')
86
87
    # Test links that have not been rendered
88
    non_rendered_dir = os.path.join(TEST_OUTPUT_DIR, 'copy_no_render')
89
    non_rendered_dir_contents = os.listdir(non_rendered_dir)
90
91
    assert 'original' in non_rendered_dir_contents
92
    assert 'symlink' in non_rendered_dir_contents
93
    assert 'symlink_to_rendered' in non_rendered_dir_contents
94
    assert '{{ cookiecutter.link_dir }}' in non_rendered_dir_contents
95
    assert '{{ cookiecutter.sym_to_nontemp }}' in non_rendered_dir_contents
96
    assert '{{ cookiecutter.sym_to_temp }}' in non_rendered_dir_contents
97
98
    # normal symlink, not rendered target
99
    _test_symlink(non_rendered_dir, 'symlink', 'original')
100
101
    # normal symlink, rendered target
102
    _test_symlink(non_rendered_dir,
103
                  'symlink_to_rendered',
104
                  '{{ cookiecutter.link_dir }}')
105
106
    # rendered symlink, not rendered target
107
    _test_symlink(non_rendered_dir,
108
                  '{{ cookiecutter.sym_to_nontemp }}',
109
                  'original')
110
111
    # rendered symlink, rendered target
112
    _test_symlink(non_rendered_dir,
113
                  '{{ cookiecutter.sym_to_temp }}',
114
                  '{{ cookiecutter.link_dir }}')
115
116
117
@pytest.mark.skipif(not WIN_BEFORE_PY32,
118
                    reason='No symlinks on Windows + Python < 3.2')
119
@pytest.mark.usefixtures('clean_system', 'remove_test_dir')
120
def test_generate_symlinks_fail_unsupported():
121
    with pytest.raises(NoSymlinksOnWindowsPythonBefore32):
122
        generate.generate_files(
123
            context={
124
                'cookiecutter': {
125
                    'name': TEST_OUTPUT_DIR,
126
                    "link_dir": "rendered_dir",
127
                    "sym_to_nontemp": "rendered_sym_to_original",
128
                    "sym_to_temp": "rendered_sym_to_rendered_dir",
129
                    "_copy_without_render": [
130
                        "copy_no_render"
131
                    ]
132
                }
133
            },
134
            repo_dir='tests/test-generate-symlinks'
135
        )
136