summaryrefslogtreecommitdiffstats
path: root/tests/units/test_logger.py
blob: 6e1e5b43576e68e6d8aa727870815cbccc43bb31 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# Copyright (c) 2023-2024 Arista Networks, Inc.
# Use of this source code is governed by the Apache License 2.0
# that can be found in the LICENSE file.
"""
Tests for anta.logger
"""
from __future__ import annotations

import logging
from typing import TYPE_CHECKING
from unittest.mock import patch

import pytest

from anta.logger import anta_log_exception

if TYPE_CHECKING:
    from pytest import LogCaptureFixture


@pytest.mark.parametrize(
    "exception, message, calling_logger, __DEBUG__value, expected_message",
    [
        pytest.param(ValueError("exception message"), None, None, False, "ValueError (exception message)", id="exception only"),
        pytest.param(ValueError("exception message"), "custom message", None, False, "custom message\nValueError (exception message)", id="custom message"),
        pytest.param(
            ValueError("exception message"),
            "custom logger",
            logging.getLogger("custom"),
            False,
            "custom logger\nValueError (exception message)",
            id="custom logger",
        ),
        pytest.param(
            ValueError("exception message"), "Use with custom message", None, True, "Use with custom message\nValueError (exception message)", id="__DEBUG__ on"
        ),
    ],
)
def test_anta_log_exception(
    caplog: LogCaptureFixture,
    exception: Exception,
    message: str | None,
    calling_logger: logging.Logger | None,
    __DEBUG__value: bool,
    expected_message: str,
) -> None:
    """
    Test anta_log_exception
    """

    if calling_logger is not None:
        # https://github.com/pytest-dev/pytest/issues/3697
        calling_logger.propagate = True
        caplog.set_level(logging.ERROR, logger=calling_logger.name)
    else:
        caplog.set_level(logging.ERROR)
    # Need to raise to trigger nice stacktrace for __DEBUG__ == True
    try:
        raise exception
    except ValueError as e:
        with patch("anta.logger.__DEBUG__", __DEBUG__value):
            anta_log_exception(e, message=message, calling_logger=calling_logger)

    # Two log captured
    if __DEBUG__value:
        assert len(caplog.record_tuples) == 2
    else:
        assert len(caplog.record_tuples) == 1
    logger, level, message = caplog.record_tuples[0]

    if calling_logger is not None:
        assert calling_logger.name == logger
    else:
        assert logger == "anta.logger"

    assert level == logging.CRITICAL
    assert message == expected_message
    # the only place where we can see the stracktrace is in the capture.text
    if __DEBUG__value is True:
        assert "Traceback" in caplog.text