#!/usr/bin/env python3
#
# Copyright 2020 The Cobalt Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
"""Tests the log_level module."""

import argparse
import logging
import unittest

try:
  from unittest import mock
except ImportError:
  import mock

from starboard.tools import log_level

_INITIALIZE_LOGGING_MOCK = 'starboard.tools.log_level.InitializeLoggingWithLevel'  # pylint:disable=line-too-long


class LogLevelTest(unittest.TestCase):

  @mock.patch(_INITIALIZE_LOGGING_MOCK)
  def testRainyDayNoArgs(self, initialize_logging_mock):
    log_level.InitializeLogging(None)
    initialize_logging_mock.assert_called_with(logging.INFO)

  @mock.patch(_INITIALIZE_LOGGING_MOCK)
  def testRainyDayEmptyArgs(self, initialize_logging_mock):
    log_level.InitializeLogging(argparse.Namespace())
    initialize_logging_mock.assert_called_with(logging.INFO)

  @mock.patch(_INITIALIZE_LOGGING_MOCK)
  def testSunnyDayCorrectLevels(self, initialize_logging_mock):
    for name, level in log_level._NAME_TO_LEVEL.items():  # pylint:disable=protected-access
      args = argparse.Namespace()
      args.log_level = name
      log_level.InitializeLogging(args)
      initialize_logging_mock.assert_called_with(level)

  @mock.patch(_INITIALIZE_LOGGING_MOCK)
  def testSunnyDayVerboseOverride(self, initialize_logging_mock):
    args = argparse.Namespace()
    args.verbose = True
    log_level.InitializeLogging(args)
    initialize_logging_mock.assert_called_with(logging.DEBUG)


if __name__ == '__main__':
  unittest.main()
