You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
206 lines
5.2 KiB
206 lines
5.2 KiB
""" tests for the sartorius_logger.datalogger module """ |
|
|
|
import pytest |
|
|
|
from unittest.mock import call |
|
|
|
|
|
@pytest.mark.parametrize( |
|
"value,expected", |
|
[ |
|
([], True), |
|
((), True), |
|
({}, True), |
|
(set(), True), |
|
(iter("A"), True), |
|
("string", False), |
|
(b"bytes", False), |
|
], |
|
) |
|
def test_is_container(value, expected): |
|
from sartorius_logger.datalogger import is_container |
|
|
|
result = is_container(value) |
|
|
|
assert result == expected |
|
|
|
|
|
def test_datalogger_init(): |
|
from sartorius_logger.datalogger import DataLogger |
|
from pathlib import Path |
|
|
|
logger = DataLogger("/logs", none_rep="<none>", sep=";", end="<br>") |
|
|
|
assert isinstance(logger.path, Path) |
|
assert logger.path == Path("/logs") |
|
assert logger.none_rep == "<none>" |
|
assert logger.sep == ";" |
|
assert logger.end == "<br>" |
|
assert logger.handle is None |
|
|
|
|
|
def test_datalogger_open(mocker): |
|
from sartorius_logger.datalogger import DataLogger |
|
from pathlib import Path |
|
from tempfile import TemporaryDirectory |
|
|
|
with TemporaryDirectory() as tmp_dir: |
|
tmp_dir_path = Path(tmp_dir) |
|
log_folder = tmp_dir_path / "new_folder" |
|
log_path = log_folder / "test.log" |
|
|
|
logger = DataLogger(log_path) |
|
logger.open() |
|
|
|
assert log_folder.exists() |
|
assert log_path.exists() |
|
|
|
logger.close() |
|
|
|
|
|
def test_datalogger_open_on_already_opened_connection(mocker): |
|
from sartorius_logger.datalogger import DataLogger |
|
|
|
logger = DataLogger("log_path") |
|
logger.handle = "not None" |
|
logger.path = mocker.Mock() |
|
|
|
logger.open() |
|
|
|
assert logger.path.open.call_count == 0 |
|
|
|
|
|
def test_datalogger_close(mocker): |
|
from sartorius_logger.datalogger import DataLogger |
|
|
|
logger = DataLogger("log_path") |
|
logger.handle = mocker.Mock() |
|
mocked_handle = logger.handle |
|
|
|
logger.close() |
|
|
|
assert mocked_handle.close.call_count == 1 |
|
assert logger.handle is None |
|
|
|
|
|
@pytest.mark.parametrize( |
|
"value,add_count,list_count", [(["a"], 0, 1), ("b", 1, 0)] |
|
) |
|
def test_datalogger_call(mocker, value, add_count, list_count): |
|
from sartorius_logger.datalogger import DataLogger |
|
|
|
logger = DataLogger("log_path") |
|
mocker.patch.object(logger, "add") |
|
mocker.patch.object(logger, "add_list") |
|
|
|
logger(value) |
|
|
|
assert logger.add.call_count == add_count |
|
assert logger.add_list.call_count == list_count |
|
|
|
|
|
def test_datalogger_add(mocker): |
|
from sartorius_logger.datalogger import DataLogger |
|
|
|
logger = DataLogger("log_path", end="<br>") |
|
logger.handle = mocker.Mock() |
|
|
|
logger.add("some \n text \r lines") |
|
|
|
assert logger.handle.write.call_count == 1 |
|
assert logger.handle.write.call_args == call( |
|
"some <br> text <br> lines<br>" |
|
) |
|
|
|
|
|
def test_datalogger_add_raises_error_if_logfile_not_opened(): |
|
from sartorius_logger.datalogger import DataLogger |
|
|
|
logger = DataLogger("log_path") |
|
|
|
with pytest.raises(IOError): |
|
logger.add("whoops") |
|
|
|
|
|
def test_datalogger_add_list(mocker): |
|
from sartorius_logger.datalogger import DataLogger |
|
|
|
logger = DataLogger("log_path", none_rep="REDACTED", sep="; ", end="<br>") |
|
logger.add = mocker.Mock() |
|
|
|
logger.add_list(["foo", 1, None, "", "bar"]) |
|
|
|
assert logger.add.call_count == 1 |
|
assert logger.add.call_args == call("foo; 1; REDACTED; ; bar") |
|
|
|
|
|
@pytest.mark.parametrize("add_empty_line", [True, False]) |
|
def test_datalogger_add_section(mocker, add_empty_line): |
|
from sartorius_logger.datalogger import DataLogger |
|
|
|
logger = DataLogger("log_path", none_rep="REDACTED", sep="; ", end="<br>") |
|
logger.add = mocker.Mock() |
|
|
|
logger.add_section( |
|
"A really cool title\n", [[1, 2], [3, 4, 5]], add_empty_line |
|
) |
|
|
|
assert logger.add.call_count == 4 if add_empty_line else 3 |
|
assert logger.add.call_args_list[:3] == [ |
|
call("[A really cool title]"), |
|
call("1; 2"), |
|
call("3; 4; 5"), |
|
] |
|
if add_empty_line: |
|
logger.add.call_args = call("") |
|
|
|
|
|
def test_datalogger_as_context_manager(mocker): |
|
from sartorius_logger.datalogger import DataLogger |
|
|
|
logger = DataLogger("log_path") |
|
logger.open = mocker.Mock() |
|
logger.close = mocker.Mock() |
|
|
|
with logger as context: |
|
assert logger is context |
|
|
|
assert logger.open.call_count == 1 |
|
assert logger.close.call_count == 1 |
|
|
|
|
|
def test_datalogger_null_logger_init_should_not_raise_error(mocker): |
|
from sartorius_logger.datalogger import NullLogger |
|
|
|
NullLogger("log_path", end="<br>", unknown="nothing") |
|
|
|
|
|
def test_datalogger_null_logger_is_callable(mocker): |
|
from sartorius_logger.datalogger import NullLogger |
|
|
|
nl = NullLogger() |
|
|
|
assert nl("whatever") is None |
|
|
|
|
|
def test_datalogger_null_logger_attribute_access_returns_instance(mocker): |
|
from sartorius_logger.datalogger import NullLogger |
|
|
|
nl = NullLogger() |
|
|
|
assert nl.some_really_weird_attribute is nl |
|
|
|
|
|
def test_datalogger_null_logger_allows_method_calls(mocker): |
|
from sartorius_logger.datalogger import NullLogger |
|
|
|
nl = NullLogger() |
|
|
|
assert nl.calling_any_method(1, b=2) is None |
|
|
|
|
|
def test_datalogger_null_as_context_manager(mocker): |
|
from sartorius_logger.datalogger import NullLogger |
|
|
|
with NullLogger() as nl: |
|
assert isinstance(nl, NullLogger)
|
|
|