import configparser
import datetime
import unittest

from api_clients import utils


def get_force_ssl(value, useConfigParser):
    config = {}
    if useConfigParser:
        config = configparser.ConfigParser()
    config["general"] = {
        "base_port": 80,
        "force_ssl": value,
    }
    return utils.get_protocol(config)


class TestTime(unittest.TestCase):
    def test_time_in_seconds(self):
        time = datetime.time(hour=0, minute=3, second=34, microsecond=649600)
        self.assertTrue(abs(utils.time_in_seconds(time) - 214.65) < 0.009)

    def test_time_in_milliseconds(self):
        time = datetime.time(hour=0, minute=0, second=0, microsecond=500000)
        self.assertEqual(utils.time_in_milliseconds(time), 500)


class TestGetProtocol(unittest.TestCase):
    def test_dict_config_empty_http(self):
        config = {"general": {}}
        protocol = utils.get_protocol(config)
        self.assertEqual(protocol, "http")

    def test_dict_config_http(self):
        config = {
            "general": {
                "base_port": 80,
            },
        }
        protocol = utils.get_protocol(config)
        self.assertEqual(protocol, "http")

    def test_dict_config_https(self):
        config = {
            "general": {
                "base_port": 443,
            },
        }
        protocol = utils.get_protocol(config)
        self.assertEqual(protocol, "https")

    def test_dict_config_force_https(self):
        postive_values = ["yes", "Yes", "True", "true", True]
        negative_values = ["no", "No", "False", "false", False]
        for value in postive_values:
            self.assertEqual(get_force_ssl(value, False), "https")
        for value in negative_values:
            self.assertEqual(get_force_ssl(value, False), "http")

    def test_configparser_config_empty_http(self):
        config = configparser.ConfigParser()
        config["general"] = {}
        protocol = utils.get_protocol(config)
        self.assertEqual(protocol, "http")

    def test_configparser_config_http(self):
        config = configparser.ConfigParser()
        config["general"] = {
            "base_port": 80,
        }
        protocol = utils.get_protocol(config)
        self.assertEqual(protocol, "http")

    def test_configparser_config_https(self):
        config = configparser.ConfigParser()
        config["general"] = {
            "base_port": 443,
        }
        protocol = utils.get_protocol(config)
        self.assertEqual(protocol, "https")

    def test_configparser_config_force_https(self):
        postive_values = ["yes", "Yes", "True", "true", True]
        negative_values = ["no", "No", "False", "false", False]
        for value in postive_values:
            self.assertEqual(get_force_ssl(value, True), "https")
        for value in negative_values:
            self.assertEqual(get_force_ssl(value, True), "http")

    def test_fromisoformat(self):
        time = {
            "00:00:00.500000": datetime.time(microsecond=500000),
            "00:04:30.092540": datetime.time(minute=4, second=30, microsecond=92540),
        }
        for time_string, expected in time.items():
            result = utils.fromisoformat(time_string)
            self.assertEqual(result, expected)


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