"""The tests for the WSDOT platform."""
import re
import unittest
from datetime import timedelta, datetime, timezone

import requests_mock

from homeassistant.components.sensor import wsdot
from homeassistant.components.sensor.wsdot import (
    WashingtonStateTravelTimeSensor, ATTR_DESCRIPTION,
    ATTR_TIME_UPDATED, CONF_API_KEY, CONF_NAME,
    CONF_ID, CONF_TRAVEL_TIMES, SCAN_INTERVAL)
from homeassistant.setup import setup_component
from tests.common import load_fixture, get_test_home_assistant


class TestWSDOT(unittest.TestCase):
    """Test the WSDOT platform."""

    def add_entities(self, new_entities, update_before_add=False):
        """Mock add entities."""
        if update_before_add:
            for entity in new_entities:
                entity.update()

        for entity in new_entities:
            self.entities.append(entity)

    def setUp(self):
        """Initialize values for this testcase class."""
        self.hass = get_test_home_assistant()
        self.config = {
            CONF_API_KEY: 'foo',
            SCAN_INTERVAL: timedelta(seconds=120),
            CONF_TRAVEL_TIMES: [{
                CONF_ID: 96,
                CONF_NAME: 'I90 EB'}],
        }
        self.entities = []

    def tearDown(self):  # pylint: disable=invalid-name
        """Stop everything that was started."""
        self.hass.stop()

    def test_setup_with_config(self):
        """Test the platform setup with configuration."""
        self.assertTrue(
            setup_component(self.hass, 'sensor', {'wsdot': self.config}))

    @requests_mock.Mocker()
    def test_setup(self, mock_req):
        """Test for operational WSDOT sensor with proper attributes."""
        uri = re.compile(WashingtonStateTravelTimeSensor.RESOURCE + '*')
        mock_req.get(uri, text=load_fixture('wsdot.json'))
        wsdot.setup_platform(self.hass, self.config, self.add_entities)
        self.assertEqual(len(self.entities), 1)
        sensor = self.entities[0]
        self.assertEqual(sensor.name, 'I90 EB')
        self.assertEqual(sensor.state, 11)
        self.assertEqual(sensor.device_state_attributes[ATTR_DESCRIPTION],
                         'Downtown Seattle to Downtown Bellevue via I-90')
        self.assertEqual(sensor.device_state_attributes[ATTR_TIME_UPDATED],
                         datetime(2017, 1, 21, 15, 10,
                                  tzinfo=timezone(timedelta(hours=-8))))