"""The tests for the Canary sensor platform."""
import copy
import unittest
from unittest.mock import Mock

from canary.api import SensorType
from homeassistant.components.canary import DATA_CANARY
from homeassistant.components.sensor import canary
from homeassistant.components.sensor.canary import CanarySensor
from tests.common import (get_test_home_assistant)
from tests.components.test_canary import mock_device, mock_reading, \
    mock_location

VALID_CONFIG = {
    "canary": {
        "username": "<EMAIL>",
        "password": "<PASSWORD>",
    }
}


class TestCanarySensorSetup(unittest.TestCase):
    """Test the Canary platform."""

    DEVICES = []

    def add_devices(self, devices, action):
        """Mock add devices."""
        for device in devices:
            self.DEVICES.append(device)

    def setUp(self):
        """Initialize values for this testcase class."""
        self.hass = get_test_home_assistant()
        self.config = copy.deepcopy(VALID_CONFIG)

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

    def test_setup_sensors(self):
        """Test the sensor setup."""
        online_device_at_home = mock_device(20, "Dining Room", True)
        offline_device_at_home = mock_device(21, "Front Yard", False)
        online_device_at_work = mock_device(22, "Office", True)

        self.hass.data[DATA_CANARY] = Mock()
        self.hass.data[DATA_CANARY].locations = [
            mock_location("Home", True, devices=[online_device_at_home,
                                                 offline_device_at_home]),
            mock_location("Work", True, devices=[online_device_at_work]),
        ]

        canary.setup_platform(self.hass, self.config, self.add_devices, None)

        self.assertEqual(6, len(self.DEVICES))

    def test_celsius_temperature_sensor(self):
        """Test temperature sensor with celsius."""
        device = mock_device(10, "Family Room")
        location = mock_location("Home", True)

        data = Mock()
        data.get_readings.return_value = [
            mock_reading(SensorType.TEMPERATURE, 21.1234)]

        sensor = CanarySensor(data, SensorType.TEMPERATURE, location, device)
        sensor.update()

        self.assertEqual("Home Family Room Temperature", sensor.name)
        self.assertEqual("sensor_canary_10_temperature", sensor.unique_id)
        self.assertEqual("°C", sensor.unit_of_measurement)
        self.assertEqual(21.1, sensor.state)

    def test_fahrenheit_temperature_sensor(self):
        """Test temperature sensor with fahrenheit."""
        device = mock_device(10, "Family Room")
        location = mock_location("Home", False)

        data = Mock()
        data.get_readings.return_value = [
            mock_reading(SensorType.TEMPERATURE, 21.1567)]

        sensor = CanarySensor(data, SensorType.TEMPERATURE, location, device)
        sensor.update()

        self.assertEqual("Home Family Room Temperature", sensor.name)
        self.assertEqual("°F", sensor.unit_of_measurement)
        self.assertEqual(21.2, sensor.state)

    def test_humidity_sensor(self):
        """Test humidity sensor."""
        device = mock_device(10, "Family Room")
        location = mock_location("Home")

        data = Mock()
        data.get_readings.return_value = [
            mock_reading(SensorType.HUMIDITY, 50.4567)]

        sensor = CanarySensor(data, SensorType.HUMIDITY, location, device)
        sensor.update()

        self.assertEqual("Home Family Room Humidity", sensor.name)
        self.assertEqual("%", sensor.unit_of_measurement)
        self.assertEqual(50.5, sensor.state)

    def test_air_quality_sensor(self):
        """Test air quality sensor."""
        device = mock_device(10, "Family Room")
        location = mock_location("Home")

        data = Mock()
        data.get_readings.return_value = [
            mock_reading(SensorType.AIR_QUALITY, 50.4567)]

        sensor = CanarySensor(data, SensorType.AIR_QUALITY, location, device)
        sensor.update()

        self.assertEqual("Home Family Room Air Quality", sensor.name)
        self.assertEqual("", sensor.unit_of_measurement)
        self.assertEqual(50.5, sensor.state)

"""The tests for the Canary sensor platform."""
import copy
import unittest
from unittest.mock import Mock

from canary.api import SensorType
from homeassistant.components.canary import DATA_CANARY
from homeassistant.components.sensor import canary
from homeassistant.components.sensor.canary import CanarySensor
from tests.common import (get_test_home_assistant)
from tests.components.test_canary import mock_device, mock_reading, \
    mock_location

VALID_CONFIG = {
    "canary": {
        "username": "<EMAIL>",
        "password": "<PASSWORD>",
    }
}


class TestCanarySensorSetup(unittest.TestCase):
    """Test the Canary platform."""

    DEVICES = []

    def add_devices(self, devices, action):
        """Mock add devices."""
        for device in devices:
            self.DEVICES.append(device)

    def setUp(self):
        """Initialize values for this testcase class."""
        self.hass = get_test_home_assistant()
        self.config = copy.deepcopy(VALID_CONFIG)

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

    def test_setup_sensors(self):
        """Test the sensor setup."""
        online_device_at_home = mock_device(20, "Dining Room", True)
        offline_device_at_home = mock_device(21, "Front Yard", False)
        online_device_at_work = mock_device(22, "Office", True)

        self.hass.data[DATA_CANARY] = Mock()
        self.hass.data[DATA_CANARY].locations = [
            mock_location("Home", True, devices=[online_device_at_home,
                                                 offline_device_at_home]),
            mock_location("Work", True, devices=[online_device_at_work]),
        ]

        canary.setup_platform(self.hass, self.config, self.add_devices, None)

        self.assertEqual(6, len(self.DEVICES))

    def test_celsius_temperature_sensor(self):
        """Test temperature sensor with celsius."""
        device = mock_device(10, "Family Room")
        location = mock_location("Home", True)

        data = Mock()
        data.get_readings.return_value = [
            mock_reading(SensorType.TEMPERATURE, 21.1234)]

        sensor = CanarySensor(data, SensorType.TEMPERATURE, location, device)
        sensor.update()

        self.assertEqual("Home Family Room Temperature", sensor.name)
        self.assertEqual("sensor_canary_10_temperature", sensor.unique_id)
        self.assertEqual("°C", sensor.unit_of_measurement)
        self.assertEqual(21.1, sensor.state)

    def test_fahrenheit_temperature_sensor(self):
        """Test temperature sensor with fahrenheit."""
        device = mock_device(10, "Family Room")
        location = mock_location("Home", False)

        data = Mock()
        data.get_readings.return_value = [
            mock_reading(SensorType.TEMPERATURE, 21.1567)]

        sensor = CanarySensor(data, SensorType.TEMPERATURE, location, device)
        sensor.update()

        self.assertEqual("Home Family Room Temperature", sensor.name)
        self.assertEqual("°F", sensor.unit_of_measurement)
        self.assertEqual(21.2, sensor.state)

    def test_humidity_sensor(self):
        """Test humidity sensor."""
        device = mock_device(10, "Family Room")
        location = mock_location("Home")

        data = Mock()
        data.get_readings.return_value = [
            mock_reading(SensorType.HUMIDITY, 50.4567)]

        sensor = CanarySensor(data, SensorType.HUMIDITY, location, device)
        sensor.update()

        self.assertEqual("Home Family Room Humidity", sensor.name)
        self.assertEqual("%", sensor.unit_of_measurement)
        self.assertEqual(50.5, sensor.state)

    def test_air_quality_sensor(self):
        """Test air quality sensor."""
        device = mock_device(10, "Family Room")
        location = mock_location("Home")

        data = Mock()
        data.get_readings.return_value = [
            mock_reading(SensorType.AIR_QUALITY, 50.4567)]

        sensor = CanarySensor(data, SensorType.AIR_QUALITY, location, device)
        sensor.update()

        self.assertEqual("Home Family Room Air Quality", sensor.name)
        self.assertEqual("", sensor.unit_of_measurement)
        self.assertEqual(50.5, sensor.state)

The tests for the Canary sensor platform. Test the Canary platform. Mock add devices. Initialize values for this testcase class. Stop everything that was started. Test the sensor setup. Test temperature sensor with celsius. Test temperature sensor with fahrenheit. Test humidity sensor. Test air quality sensor.