import logging
from logging import handlers
from unittest.mock import MagicMock, patch

from src.util.logger import Logger


class TestLogger:

    def test_constructor_loglevel_test(self, caplog, monkeypatch):
        """
        Cases:
            ログレベルに対象外の文字列を指定した場合、デフォルトであるInfoが指定されること
        Arranges:
            - LOG_LEVELの変数を想定外の文字列に置き換える
            - loggerインスタンスの生成
            - ログ出力
        Expects:
            - 期待値通りのログが出力されること
            - ログレベルがInfoで設定されていること
        """

        # Arranges
        monkeypatch.setattr('src.util.logger.LOG_LEVEL', "test")

        sut = Logger()
        logger = sut.get_logger()
        logger.info('infoログ出力')

        # Expects
        assert ("root", logging.INFO, "infoログ出力") in caplog.record_tuples
        assert logger.getEffectiveLevel() == logging.INFO

    def test_constructor_hashandlers(self, monkeypatch):
        """
        Cases:
            生成したloggerインスタンスを利用し、期待値通りのログが出力されること
        Arranges:
            - `if not self.__logger.hasHandlers():`の分岐に入るようにモックを準備
            - loggerインスタンスの生成
            - ログ出力
        Expects:
            - loggerインスタンスに1件以上のハンドラーが存在すること
            - loggerインスタンスにStreamHandlerが含まれていること
        """

        # Arranges
        def dummy_method(arg):
            return False

        monkeypatch.setattr("logging.Logger.hasHandlers", dummy_method)

        sut = Logger()
        logger = sut.get_logger()
        logger.warning('warningログ出力')

        # Expects
        assert len(logger.handlers) >= 1
        assert "StreamHandler" in str(logger.handlers)

    def test_get_logger(self, caplog):
        """
        Cases:
            生成したloggerインスタンスを利用し、期待値通りのログが出力されること
        Arranges:
            - loggerインスタンスの生成
            - ログ出力
        Expects:
            - 期待値通りのログが出力されること
        """

        # Arranges
        sut = Logger()
        logger = sut.get_logger()
        logger.warning('warningログ出力')

        # Expects
        assert ("root", logging.WARNING, "warningログ出力") in caplog.record_tuples
