"""The tests for the mochad light platform."""
import unittest
import unittest.mock as mock

import pytest

from homeassistant.components import light
from homeassistant.components.mochad import light as mochad
from homeassistant.setup import setup_component

from tests.common import get_test_home_assistant


@pytest.fixture(autouse=True)
def pymochad_mock():
    """Mock pymochad."""
    with mock.patch.dict("sys.modules", {"pymochad": mock.MagicMock()}):
        yield


class TestMochadSwitchSetup(unittest.TestCase):
    """Test the mochad light."""

    PLATFORM = mochad
    COMPONENT = light
    THING = "light"

    def setUp(self):
        """Set up things to be run when tests are started."""
        self.hass = get_test_home_assistant()

    def tearDown(self):
        """Stop everything that was started."""
        self.hass.stop()

    @mock.patch("homeassistant.components.mochad.light.MochadLight")
    def test_setup_adds_proper_devices(self, mock_light):
        """Test if setup adds devices."""
        good_config = {
            "mochad": {},
            "light": {
                "platform": "mochad",
                "devices": [{"name": "Light1", "address": "a1"}],
            },
        }
        assert setup_component(self.hass, light.DOMAIN, good_config)


class TestMochadLight(unittest.TestCase):
    """Test for mochad light platform."""

    def setUp(self):
        """Set up things to be run when tests are started."""
        self.hass = get_test_home_assistant()
        controller_mock = mock.MagicMock()
        dev_dict = {"address": "a1", "name": "fake_light", "brightness_levels": 32}
        self.light = mochad.MochadLight(self.hass, controller_mock, dev_dict)

    def teardown_method(self, method):
        """Stop everything that was started."""
        self.hass.stop()

    def test_name(self):
        """Test the name."""
        assert "fake_light" == self.light.name

    def test_turn_on_with_no_brightness(self):
        """Test turn_on."""
        self.light.turn_on()
        self.light.light.send_cmd.assert_called_once_with("on")

    def test_turn_on_with_brightness(self):
        """Test turn_on."""
        self.light.turn_on(brightness=45)
        self.light.light.send_cmd.assert_has_calls(
            [mock.call("on"), mock.call("dim 25")]
        )

    def test_turn_off(self):
        """Test turn_off."""
        self.light.turn_off()
        self.light.light.send_cmd.assert_called_once_with("off")


class TestMochadLight256Levels(unittest.TestCase):
    """Test for mochad light platform."""

    def setUp(self):
        """Set up things to be run when tests are started."""
        self.hass = get_test_home_assistant()
        controller_mock = mock.MagicMock()
        dev_dict = {"address": "a1", "name": "fake_light", "brightness_levels": 256}
        self.light = mochad.MochadLight(self.hass, controller_mock, dev_dict)

    def teardown_method(self, method):
        """Stop everything that was started."""
        self.hass.stop()

    def test_turn_on_with_no_brightness(self):
        """Test turn_on."""
        self.light.turn_on()
        self.light.light.send_cmd.assert_called_once_with("xdim 255")

    def test_turn_on_with_brightness(self):
        """Test turn_on."""
        self.light.turn_on(brightness=45)
        self.light.light.send_cmd.assert_called_once_with("xdim 45")

    def test_turn_off(self):
        """Test turn_off."""
        self.light.turn_off()
        self.light.light.send_cmd.assert_called_once_with("off")


class TestMochadLight64Levels(unittest.TestCase):
    """Test for mochad light platform."""

    def setUp(self):
        """Set up things to be run when tests are started."""
        self.hass = get_test_home_assistant()
        controller_mock = mock.MagicMock()
        dev_dict = {"address": "a1", "name": "fake_light", "brightness_levels": 64}
        self.light = mochad.MochadLight(self.hass, controller_mock, dev_dict)

    def teardown_method(self, method):
        """Stop everything that was started."""
        self.hass.stop()

    def test_turn_on_with_no_brightness(self):
        """Test turn_on."""
        self.light.turn_on()
        self.light.light.send_cmd.assert_called_once_with("xdim 63")

    def test_turn_on_with_brightness(self):
        """Test turn_on."""
        self.light.turn_on(brightness=45)
        self.light.light.send_cmd.assert_called_once_with("xdim 11")

    def test_turn_off(self):
        """Test turn_off."""
        self.light.turn_off()
        self.light.light.send_cmd.assert_called_once_with("off")
