import logging

from src.util.logger import logger_instance as logger


class TestLogger:

    def test_logging_debug(self, caplog):
        """
        Cases:
            Debugレベルを設定したloggerについて、それ以下のログが出力されないこと
        Arranges:
            - 各レベルでのログを出力する
            - ログレベルの設定
        Expects:
            - 期待値通りのログが出力されること
        """

        # Arranges
        caplog.set_level(logging.DEBUG)

        logger.debug('debugログ出力')
        logger.info('infoログ出力')
        logger.warning("warningログ出力")
        logger.error("errorログ出力")
        logger.critical("criticalログ出力")

        # Expects
        assert ("root", logging.DEBUG, "debugログ出力") in caplog.record_tuples
        assert ("root", logging.INFO, "infoログ出力") in caplog.record_tuples
        assert ("root", logging.WARNING, "warningログ出力") in caplog.record_tuples
        assert ("root", logging.ERROR, "errorログ出力") in caplog.record_tuples
        assert ("root", logging.CRITICAL, "criticalログ出力") in caplog.record_tuples

    def test_logging_info(self, caplog):
        """
        Cases:
            Infoレベルを設定したloggerについて、それ以下のログが出力されないこと
        Arranges:
            - 各レベルでのログを出力する
            - ログレベルの設定
        Expects:
            - 期待値通りのログが出力されること
        """

        # Arranges
        caplog.set_level(logging.INFO)

        logger.debug('debugログ出力')
        logger.info('infoログ出力')
        logger.warning("warningログ出力")
        logger.error("errorログ出力")
        logger.critical("criticalログ出力")

        # Expects
        assert ("root", logging.DEBUG, "debugログ出力") not in caplog.record_tuples
        assert ("root", logging.INFO, "infoログ出力") in caplog.record_tuples
        assert ("root", logging.WARNING, "warningログ出力") in caplog.record_tuples
        assert ("root", logging.ERROR, "errorログ出力") in caplog.record_tuples
        assert ("root", logging.CRITICAL, "criticalログ出力") in caplog.record_tuples

    def test_logging_warning(self, caplog):
        """
        Cases:
            Warningレベルを設定したloggerについて、それ以下のログが出力されないこと
        Arranges:
            - 各レベルでのログを出力する
            - ログレベルの設定
        Expects:
            - 期待値通りのログが出力されること
        """

        # Arranges
        caplog.set_level(logging.WARNING)

        logger.debug('debugログ出力')
        logger.info('infoログ出力')
        logger.warning("warningログ出力")
        logger.error("errorログ出力")
        logger.critical("criticalログ出力")

        # Expects
        assert ("root", logging.DEBUG, "debugログ出力") not in caplog.record_tuples
        assert ("root", logging.INFO, "infoログ出力") not in caplog.record_tuples
        assert ("root", logging.WARNING, "warningログ出力") in caplog.record_tuples
        assert ("root", logging.ERROR, "errorログ出力") in caplog.record_tuples
        assert ("root", logging.CRITICAL, "criticalログ出力") in caplog.record_tuples

    def test_logging_error(self, caplog):
        """
        Cases:
            Errorレベルを設定したloggerについて、それ以下のログが出力されないこと
        Arranges:
            - 各レベルでのログを出力する
            - ログレベルの設定
        Expects:
            - 期待値通りのログが出力されること
        """

        # Arranges
        caplog.set_level(logging.ERROR)

        logger.debug('debugログ出力')
        logger.info('infoログ出力')
        logger.warning("warningログ出力")
        logger.error("errorログ出力")
        logger.critical("criticalログ出力")

        # Expects
        assert ("root", logging.DEBUG, "debugログ出力") not in caplog.record_tuples
        assert ("root", logging.INFO, "infoログ出力") not in caplog.record_tuples
        assert ("root", logging.WARNING, "warningログ出力") not in caplog.record_tuples
        assert ("root", logging.ERROR, "errorログ出力") in caplog.record_tuples
        assert ("root", logging.CRITICAL, "criticalログ出力") in caplog.record_tuples

    def test_logging_critical(self, caplog):
        """
        Cases:
            Criticalレベルを設定したloggerについて、それ以下のログが出力されないこと
        Arranges:
            - 各レベルでのログを出力する
            - ログレベルの設定
        Expects:
            - 期待値通りのログが出力されること
        """

        # Arranges
        caplog.set_level(logging.CRITICAL)

        logger.debug('debugログ出力')
        logger.info('infoログ出力')
        logger.warning("warningログ出力")
        logger.error("errorログ出力")
        logger.critical("criticalログ出力")

        # Expects
        assert ("root", logging.DEBUG, "debugログ出力") not in caplog.record_tuples
        assert ("root", logging.INFO, "infoログ出力") not in caplog.record_tuples
        assert ("root", logging.WARNING, "warningログ出力") not in caplog.record_tuples
        assert ("root", logging.ERROR, "errorログ出力") not in caplog.record_tuples
        assert ("root", logging.CRITICAL, "criticalログ出力") in caplog.record_tuples

    def test_logging_getlogger_boto3(self):
        """
        Cases:
            個別設定したboto3モジュールのログレベル確認
        Arranges:
            なし
        Expects:
            設定されているログレベルが期待値と一致すること
        """

        # Expects
        assert logging.getLogger("boto3").getEffectiveLevel() == logging.WARNING

    def test_logging_getlogger_botocore(self):
        """
        Cases:
            個別設定したbotocoreモジュールのログレベル確認
        Arranges:
            なし
        Expects:
            設定されているログレベルが期待値と一致すること
        """

        # Expects
        assert logging.getLogger("botocore").getEffectiveLevel() == logging.WARNING

    def test_logging_getlogger_s3transfer(self):
        """
        Cases:
            個別設定したs3transferモジュールのログレベル確認
        Arranges:
            なし
        Expects:
            設定されているログレベルが期待値と一致すること
        """

        # Expects
        assert logging.getLogger("s3transfer").getEffectiveLevel() == logging.WARNING

    def test_logging_getlogger_urllib3(self):
        """
        Cases:
            個別設定したurllib3モジュールのログレベル確認
        Arranges:
            なし
        Expects:
            設定されているログレベルが期待値と一致すること
        """

        # Expects
        assert logging.getLogger("s3transfer").getEffectiveLevel() == logging.WARNING
