"""The tests for the SleepIQ component."""
from unittest.mock import MagicMock, patch

from homeassistant import setup
import homeassistant.components.sleepiq as sleepiq

from tests.common import load_fixture

CONFIG = {"sleepiq": {"username": "foo", "password": "bar"}}


def mock_responses(mock, single=False):
    """Mock responses for SleepIQ."""
    base_url = "https://prod-api.sleepiq.sleepnumber.com/rest/"
    if single:
        suffix = "-single"
    else:
        suffix = ""
    mock.put(base_url + "login", text=load_fixture("sleepiq-login.json"))
    mock.get(base_url + "bed?_k=0987", text=load_fixture(f"sleepiq-bed{suffix}.json"))
    mock.get(base_url + "sleeper?_k=0987", text=load_fixture("sleepiq-sleeper.json"))
    mock.get(
        base_url + "bed/familyStatus?_k=0987",
        text=load_fixture(f"sleepiq-familystatus{suffix}.json"),
    )


async def test_setup(hass, requests_mock):
    """Test the setup."""
    mock_responses(requests_mock)

    # We're mocking the load_platform discoveries or else the platforms
    # will be setup during tear down when blocking till done, but the mocks
    # are no longer active.
    with patch("homeassistant.helpers.discovery.load_platform", MagicMock()):
        assert sleepiq.setup(hass, CONFIG)


async def test_setup_login_failed(hass, requests_mock):
    """Test the setup if a bad username or password is given."""
    mock_responses(requests_mock)
    requests_mock.put(
        "https://prod-api.sleepiq.sleepnumber.com/rest/login",
        status_code=401,
        json=load_fixture("sleepiq-login-failed.json"),
    )

    response = sleepiq.setup(hass, CONFIG)
    assert not response


async def test_setup_component_no_login(hass):
    """Test the setup when no login is configured."""
    conf = CONFIG.copy()
    del conf["sleepiq"]["username"]
    assert not await setup.async_setup_component(hass, sleepiq.DOMAIN, conf)


async def test_setup_component_no_password(hass):
    """Test the setup when no password is configured."""
    conf = CONFIG.copy()
    del conf["sleepiq"]["password"]

    assert not await setup.async_setup_component(hass, sleepiq.DOMAIN, conf)