"""Unit tests for the OurGroceries integration."""
from unittest.mock import AsyncMock

import pytest

from homeassistant.components.ourgroceries import (
    AsyncIOTimeoutError,
    ClientError,
    InvalidLoginException,
)
from homeassistant.components.ourgroceries.const import DOMAIN
from homeassistant.config_entries import ConfigEntryState
from homeassistant.core import HomeAssistant

from tests.common import MockConfigEntry


async def test_load_unload(
    hass: HomeAssistant,
    setup_integration: None,
    ourgroceries_config_entry: MockConfigEntry | None,
) -> None:
    """Test loading and unloading of the config entry."""
    entries = hass.config_entries.async_entries(DOMAIN)
    assert len(entries) == 1

    assert ourgroceries_config_entry.state == ConfigEntryState.LOADED

    assert await hass.config_entries.async_unload(ourgroceries_config_entry.entry_id)
    assert ourgroceries_config_entry.state == ConfigEntryState.NOT_LOADED


@pytest.fixture
def login_with_error(exception, ourgroceries: AsyncMock):
    """Fixture to simulate error on login."""
    ourgroceries.login.side_effect = (exception,)


@pytest.mark.parametrize(
    ("exception", "status"),
    [
        (InvalidLoginException, ConfigEntryState.SETUP_ERROR),
        (ClientError, ConfigEntryState.SETUP_RETRY),
        (AsyncIOTimeoutError, ConfigEntryState.SETUP_RETRY),
    ],
)
async def test_init_failure(
    hass: HomeAssistant,
    login_with_error,
    setup_integration: None,
    status: ConfigEntryState,
    ourgroceries_config_entry: MockConfigEntry | None,
) -> None:
    """Test an initialization error on integration load."""
    assert ourgroceries_config_entry.state == status