|
1
|
|
|
# -*- coding: utf-8 -*- |
|
2
|
|
|
|
|
3
|
|
|
import logging |
|
4
|
|
|
|
|
5
|
|
|
import pytest |
|
6
|
|
|
|
|
7
|
|
|
from cookiecutter.log import configure_logger |
|
8
|
|
|
|
|
9
|
|
|
|
|
10
|
|
|
def create_log_records(): |
|
11
|
|
|
cookiecutter_logger = logging.getLogger('cookiecutter') |
|
12
|
|
|
foo_logger = logging.getLogger('cookiecutter.foo') |
|
13
|
|
|
foobar_logger = logging.getLogger('cookiecutter.foo.bar') |
|
14
|
|
|
|
|
15
|
|
|
cookiecutter_logger.info('Welcome to Cookiecutter') |
|
16
|
|
|
cookiecutter_logger.debug('Generating project from pytest-plugin') |
|
17
|
|
|
foo_logger.info('Loading user config from home dir') |
|
18
|
|
|
foobar_logger.debug("I don't know.") |
|
19
|
|
|
foobar_logger.debug('I wanted to save the world.') |
|
20
|
|
|
foo_logger.error('Aw, snap! Something went wrong') |
|
21
|
|
|
cookiecutter_logger.debug('Successfully generated project') |
|
22
|
|
|
|
|
23
|
|
|
|
|
24
|
|
|
@pytest.fixture |
|
25
|
|
|
def info_messages(): |
|
26
|
|
|
return [ |
|
27
|
|
|
'INFO: Welcome to Cookiecutter', |
|
28
|
|
|
'INFO: Loading user config from home dir', |
|
29
|
|
|
'ERROR: Aw, snap! Something went wrong', |
|
30
|
|
|
] |
|
31
|
|
|
|
|
32
|
|
|
|
|
33
|
|
|
@pytest.fixture |
|
34
|
|
|
def debug_messages(): |
|
35
|
|
|
return [ |
|
36
|
|
|
'INFO cookiecutter: ' |
|
37
|
|
|
'Welcome to Cookiecutter', |
|
38
|
|
|
|
|
39
|
|
|
'DEBUG cookiecutter: ' |
|
40
|
|
|
'Generating project from pytest-plugin', |
|
41
|
|
|
|
|
42
|
|
|
'INFO cookiecutter.foo: ' |
|
43
|
|
|
'Loading user config from home dir', |
|
44
|
|
|
|
|
45
|
|
|
"DEBUG cookiecutter.foo.bar: " |
|
46
|
|
|
"I don't know.", |
|
47
|
|
|
|
|
48
|
|
|
'DEBUG cookiecutter.foo.bar: ' |
|
49
|
|
|
'I wanted to save the world.', |
|
50
|
|
|
|
|
51
|
|
|
'ERROR cookiecutter.foo: ' |
|
52
|
|
|
'Aw, snap! Something went wrong', |
|
53
|
|
|
|
|
54
|
|
|
'DEBUG cookiecutter: ' |
|
55
|
|
|
'Successfully generated project', |
|
56
|
|
|
] |
|
57
|
|
|
|
|
58
|
|
|
|
|
59
|
|
|
@pytest.fixture |
|
60
|
|
|
def info_logger(): |
|
61
|
|
|
return configure_logger(stream_level='INFO') |
|
62
|
|
|
|
|
63
|
|
|
|
|
64
|
|
|
@pytest.fixture |
|
65
|
|
|
def debug_logger(): |
|
66
|
|
|
return configure_logger(stream_level='DEBUG') |
|
67
|
|
|
|
|
68
|
|
|
|
|
69
|
|
|
@pytest.fixture |
|
70
|
|
|
def debug_file(tmpdir): |
|
71
|
|
|
return tmpdir / 'pytest-plugin.log' |
|
72
|
|
|
|
|
73
|
|
|
|
|
74
|
|
|
@pytest.fixture |
|
75
|
|
|
def info_logger_with_file(debug_file): |
|
76
|
|
|
return configure_logger( |
|
77
|
|
|
stream_level='INFO', |
|
78
|
|
|
debug_file=str(debug_file), |
|
79
|
|
|
) |
|
80
|
|
|
|
|
81
|
|
|
|
|
82
|
|
|
def test_info_stdout_logging(caplog, info_logger, info_messages): |
|
83
|
|
|
"""Test that stdout logs use info format and level.""" |
|
84
|
|
|
[stream_handler] = info_logger.handlers |
|
85
|
|
|
assert isinstance(stream_handler, logging.StreamHandler) |
|
86
|
|
|
assert stream_handler.level == logging.INFO |
|
87
|
|
|
|
|
88
|
|
|
create_log_records() |
|
89
|
|
|
|
|
90
|
|
|
stream_messages = [ |
|
91
|
|
|
stream_handler.format(r) |
|
92
|
|
|
for r in caplog.records |
|
93
|
|
|
if r.levelno >= stream_handler.level |
|
94
|
|
|
] |
|
95
|
|
|
|
|
96
|
|
|
assert stream_messages == info_messages |
|
97
|
|
|
|
|
98
|
|
|
|
|
99
|
|
|
def test_debug_stdout_logging(caplog, debug_logger, debug_messages): |
|
100
|
|
|
"""Test that stdout logs use debug format and level.""" |
|
101
|
|
|
[stream_handler] = debug_logger.handlers |
|
102
|
|
|
assert isinstance(stream_handler, logging.StreamHandler) |
|
103
|
|
|
assert stream_handler.level == logging.DEBUG |
|
104
|
|
|
|
|
105
|
|
|
create_log_records() |
|
106
|
|
|
|
|
107
|
|
|
stream_messages = [ |
|
108
|
|
|
stream_handler.format(r) |
|
109
|
|
|
for r in caplog.records |
|
110
|
|
|
if r.levelno >= stream_handler.level |
|
111
|
|
|
] |
|
112
|
|
|
|
|
113
|
|
|
assert stream_messages == debug_messages |
|
114
|
|
|
|
|
115
|
|
|
|
|
116
|
|
|
def test_debug_file_logging( |
|
117
|
|
|
caplog, info_logger_with_file, debug_file, debug_messages): |
|
118
|
|
|
"""Test that logging to stdout uses a different format and level than |
|
119
|
|
|
the the file handler. |
|
120
|
|
|
""" |
|
121
|
|
|
|
|
122
|
|
|
[file_handler, stream_handler] = info_logger_with_file.handlers |
|
123
|
|
|
assert isinstance(file_handler, logging.FileHandler) |
|
124
|
|
|
assert isinstance(stream_handler, logging.StreamHandler) |
|
125
|
|
|
assert stream_handler.level == logging.INFO |
|
126
|
|
|
assert file_handler.level == logging.DEBUG |
|
127
|
|
|
|
|
128
|
|
|
create_log_records() |
|
129
|
|
|
|
|
130
|
|
|
assert debug_file.exists() |
|
131
|
|
|
|
|
132
|
|
|
# Last line in the log file is an empty line |
|
133
|
|
|
assert debug_file.readlines(cr=False) == debug_messages + [''] |
|
134
|
|
|
|