cookiecutter
122 строки · 3.9 Кб
1"""Collection of tests around log handling."""
2
3import logging4
5import pytest6
7from cookiecutter.log import configure_logger8
9
10def create_log_records() -> None:11"""Test function, create log entries in expected stage of test."""12cookiecutter_logger = logging.getLogger('cookiecutter')13foo_logger = logging.getLogger('cookiecutter.foo')14foobar_logger = logging.getLogger('cookiecutter.foo.bar')15
16cookiecutter_logger.info('Welcome to Cookiecutter')17cookiecutter_logger.debug('Generating project from pytest-plugin')18foo_logger.info('Loading user config from home dir')19foobar_logger.debug("I don't know.")20foobar_logger.debug('I wanted to save the world.')21foo_logger.error('Aw, snap! Something went wrong')22cookiecutter_logger.debug('Successfully generated project')23
24
25@pytest.fixture26def info_messages():27"""Fixture. List of test info messages."""28return [29'INFO: Welcome to Cookiecutter',30'INFO: Loading user config from home dir',31'ERROR: Aw, snap! Something went wrong',32]33
34
35@pytest.fixture36def debug_messages():37"""Fixture. List of test debug messages."""38return [39"INFO cookiecutter: Welcome to Cookiecutter",40"DEBUG cookiecutter: Generating project from pytest-plugin",41"INFO cookiecutter.foo: Loading user config from home dir",42"DEBUG cookiecutter.foo.bar: I don't know.",43"DEBUG cookiecutter.foo.bar: I wanted to save the world.",44"ERROR cookiecutter.foo: Aw, snap! Something went wrong",45"DEBUG cookiecutter: Successfully generated project",46]47
48
49@pytest.fixture50def info_logger():51"""Fixture. Call cookiecutter logger setup with `info` debug level."""52return configure_logger(stream_level='INFO')53
54
55@pytest.fixture56def debug_logger():57"""Fixture. Call cookiecutter logger setup with `debug` debug level."""58return configure_logger(stream_level='DEBUG')59
60
61@pytest.fixture62def debug_file(tmp_path):63"""Fixture. Generate debug file location for tests."""64return tmp_path.joinpath('pytest-plugin.log')65
66
67@pytest.fixture68def info_logger_with_file(debug_file):69"""Fixture. Call cookiecutter logger setup with `info` debug level + `file`."""70return configure_logger(stream_level='INFO', debug_file=str(debug_file))71
72
73def test_info_stdout_logging(caplog, info_logger, info_messages) -> None:74"""Test that stdout logs use info format and level."""75[stream_handler] = info_logger.handlers76assert isinstance(stream_handler, logging.StreamHandler)77assert stream_handler.level == logging.INFO78
79create_log_records()80
81stream_messages = [82stream_handler.format(r)83for r in caplog.records84if r.levelno >= stream_handler.level85]86
87assert stream_messages == info_messages88
89
90def test_debug_stdout_logging(caplog, debug_logger, debug_messages) -> None:91"""Test that stdout logs use debug format and level."""92[stream_handler] = debug_logger.handlers93assert isinstance(stream_handler, logging.StreamHandler)94assert stream_handler.level == logging.DEBUG95
96create_log_records()97
98stream_messages = [99stream_handler.format(r)100for r in caplog.records101if r.levelno >= stream_handler.level102]103
104assert stream_messages == debug_messages105
106
107def test_debug_file_logging(info_logger_with_file, debug_file, debug_messages) -> None:108"""Test that logging to stdout uses a different format and level than \109the the file handler."""
110[file_handler, stream_handler] = info_logger_with_file.handlers111assert isinstance(file_handler, logging.FileHandler)112assert isinstance(stream_handler, logging.StreamHandler)113assert stream_handler.level == logging.INFO114assert file_handler.level == logging.DEBUG115
116create_log_records()117
118assert debug_file.exists()119
120# Last line in the log file is an empty line121with debug_file.open() as f:122assert f.read().split('\n') == [*debug_messages, '']123