"""Tests for the sigfox sensor."""
import re
import requests_mock
import unittest

from homeassistant.components.sensor.sigfox import (
    API_URL, CONF_API_LOGIN, CONF_API_PASSWORD)
from homeassistant.setup import setup_component
from tests.common import get_test_home_assistant

TEST_API_LOGIN = 'foo'
TEST_API_PASSWORD = 'ebcd1234'

VALID_CONFIG = {
    'sensor': {
        'platform': 'sigfox',
        CONF_API_LOGIN: TEST_API_LOGIN,
        CONF_API_PASSWORD: TEST_API_PASSWORD}}

VALID_MESSAGE = """
{"data":[{
"time":1521879720,
"data":"7061796c6f6164",
"rinfos":[{"lat":"0.0","lng":"0.0"}],
"snr":"50.0"}]}
"""


class TestSigfoxSensor(unittest.TestCase):
    """Test the sigfox platform."""

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

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

    def test_invalid_credentials(self):
        """Test for invalid credentials."""
        with requests_mock.Mocker() as mock_req:
            url = re.compile(API_URL + 'devicetypes')
            mock_req.get(url, text='{}', status_code=401)
            self.assertTrue(
                setup_component(self.hass, 'sensor', VALID_CONFIG))
        assert len(self.hass.states.entity_ids()) == 0

    def test_valid_credentials(self):
        """Test for valid credentials."""
        with requests_mock.Mocker() as mock_req:
            url1 = re.compile(API_URL + 'devicetypes')
            mock_req.get(url1, text='{"data":[{"id":"fake_type"}]}',
                         status_code=200)

            url2 = re.compile(API_URL + 'devicetypes/fake_type/devices')
            mock_req.get(url2, text='{"data":[{"id":"fake_id"}]}')

            url3 = re.compile(API_URL + 'devices/fake_id/messages*')
            mock_req.get(url3, text=VALID_MESSAGE)

            self.assertTrue(
                setup_component(self.hass, 'sensor', VALID_CONFIG))

            assert len(self.hass.states.entity_ids()) == 1
            state = self.hass.states.get('sensor.sigfox_fake_id')
            assert state.state == 'payload'
            assert state.attributes.get('snr') == '50.0'