Passed
Push — master ( 75e659...d8cee1 )
by Jaisen
01:58
created

elodie.tests.log_test   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 84
Duplicated Lines 38.1 %

Importance

Changes 0
Metric Value
eloc 69
dl 32
loc 84
rs 10
c 0
b 0
f 0
wmc 10

6 Functions

Rating   Name   Duplication   Size   Complexity  
A with_new_line() 0 2 1
A test_calls_print_debug_true() 16 16 3
A test_calls_print_progress_no_new_line() 0 7 1
A test_calls_print_debug_false() 16 16 3
A test_calls_print_progress_with_new_line() 0 7 1
A call_log_and_assert() 0 10 1

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
from __future__ import absolute_import
2
# Project imports
3
4
import os
5
import sys
6
import unittest 
7
8
from json import dumps
9
from mock import patch
10
try:
11
    from StringIO import StringIO
12
except ImportError:
13
    from io import StringIO
14
15
sys.path.insert(0, os.path.abspath(os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))))
16
17
from elodie import constants
18
from elodie import log
19
20
21
def call_log_and_assert(func, args, expected):
22
    saved_stdout = sys.stdout
23
    try:
24
        out = StringIO()
25
        sys.stdout = out
26
        func(*args)
27
        output = out.getvalue()
28
        assert output == expected, (expected, func, output)
29
    finally:
30
        sys.stdout = saved_stdout
31
32
def with_new_line(string):
33
    return "{}\n".format(string)
34
35 View Code Duplication
@patch('elodie.log')
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
36
@patch('elodie.constants.debug', True)
37
def test_calls_print_debug_true(fake_log):
38
    expected = 'some string'
39
    fake_log.info.return_value = expected
40
    fake_log.warn.return_value = expected
41
    fake_log.error.return_value = expected
42
    for func in [log.info, log.warn, log.error]:
43
        call_log_and_assert(func, [expected], with_new_line(expected))
44
45
    expected_json = {'foo':'bar'}
46
    fake_log.info.return_value = expected_json
47
    fake_log.warn.return_value = expected_json
48
    fake_log.error.return_value = expected_json
49
    for func in [log.info_json, log.warn_json, log.error_json]:
50
        call_log_and_assert(func, [expected_json], with_new_line(dumps(expected_json)))
51
52 View Code Duplication
@patch('elodie.log')
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
53
@patch('elodie.constants.debug', False)
54
def test_calls_print_debug_false(fake_log):
55
    expected = 'some other string'
56
    fake_log.info.return_value = expected
57
    fake_log.warn.return_value = expected
58
    fake_log.error.return_value = expected
59
    for func in [log.info, log.warn, log.error]:
60
        call_log_and_assert(func, [expected], '')
61
62
    expected_json = {'foo':'bar'}
63
    fake_log.info.return_value = expected_json
64
    fake_log.warn.return_value = expected_json
65
    fake_log.error.return_value = expected_json
66
    for func in [log.info_json, log.warn_json, log.error_json]:
67
        call_log_and_assert(func, [expected_json], '')
68
69
@patch('elodie.log')
70
def test_calls_print_progress_no_new_line(fake_log):
71
    expected = 'some other string'
72
    fake_log.info.return_value = expected
73
    fake_log.warn.return_value = expected
74
    fake_log.error.return_value = expected
75
    call_log_and_assert(log.progress, [expected], expected)
76
77
@patch('elodie.log')
78
def test_calls_print_progress_with_new_line(fake_log):
79
    expected = "some other string\n"
80
    fake_log.info.return_value = expected
81
    fake_log.warn.return_value = expected
82
    fake_log.error.return_value = expected
83
    call_log_and_assert(log.progress, [expected, True], with_new_line(expected))
84