Completed
Pull Request — master (#868)
by
unknown
01:04
created

test_generate_symlinks()   F

Complexity

Conditions 17

Size

Total Lines 78

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 17
c 0
b 0
f 0
dl 0
loc 78
rs 2.1974

1 Method

Rating   Name   Duplication   Size   Complexity  
A _test_symlink() 0 9 4

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

Complexity

Complex classes like test_generate_symlinks() often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

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