mirror of
https://github.com/home-assistant/core.git
synced 2026-01-24 16:42:38 +01:00
136 lines
4.3 KiB
Python
136 lines
4.3 KiB
Python
"""conftest for the GitHub integration."""
|
|
|
|
import asyncio
|
|
from collections.abc import Generator
|
|
from unittest.mock import AsyncMock, MagicMock, patch
|
|
|
|
from aiogithubapi import (
|
|
GitHubLoginDeviceModel,
|
|
GitHubLoginOauthModel,
|
|
GitHubRateLimitModel,
|
|
)
|
|
import pytest
|
|
|
|
from homeassistant.components.github.const import CONF_REPOSITORIES, DOMAIN
|
|
from homeassistant.const import CONF_ACCESS_TOKEN
|
|
from homeassistant.core import HomeAssistant
|
|
|
|
from .const import MOCK_ACCESS_TOKEN, TEST_REPOSITORY
|
|
|
|
from tests.common import (
|
|
MockConfigEntry,
|
|
async_load_json_object_fixture,
|
|
load_json_object_fixture,
|
|
)
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_config_entry() -> MockConfigEntry:
|
|
"""Return the default mocked config entry."""
|
|
return MockConfigEntry(
|
|
title="",
|
|
domain=DOMAIN,
|
|
data={CONF_ACCESS_TOKEN: MOCK_ACCESS_TOKEN},
|
|
options={CONF_REPOSITORIES: [TEST_REPOSITORY]},
|
|
)
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_setup_entry() -> Generator[None]:
|
|
"""Mock setting up a config entry."""
|
|
with patch("homeassistant.components.github.async_setup_entry", return_value=True):
|
|
yield
|
|
|
|
|
|
@pytest.fixture
|
|
def device_activation_event() -> asyncio.Event:
|
|
"""Fixture to provide an asyncio event for device activation."""
|
|
return asyncio.Event()
|
|
|
|
|
|
@pytest.fixture
|
|
def github_device_client(
|
|
hass: HomeAssistant,
|
|
device_activation_event: asyncio.Event,
|
|
) -> Generator[AsyncMock]:
|
|
"""Mock GitHub device client."""
|
|
with patch(
|
|
"homeassistant.components.github.config_flow.GitHubDeviceAPI",
|
|
autospec=True,
|
|
) as github_client_mock:
|
|
client = github_client_mock.return_value
|
|
register_object = AsyncMock()
|
|
register_object.data = GitHubLoginDeviceModel(
|
|
load_json_object_fixture("device_register.json", DOMAIN)
|
|
)
|
|
client.register.return_value = register_object
|
|
|
|
async def mock_api_device_activation(device_code) -> AsyncMock:
|
|
# Simulate the device activation process
|
|
await device_activation_event.wait()
|
|
activate_object = AsyncMock()
|
|
activate_object.data = GitHubLoginOauthModel(
|
|
await async_load_json_object_fixture(
|
|
hass, "device_activate.json", DOMAIN
|
|
)
|
|
)
|
|
return activate_object
|
|
|
|
client.activation = mock_api_device_activation
|
|
yield client
|
|
|
|
|
|
@pytest.fixture
|
|
def github_client(hass: HomeAssistant) -> Generator[AsyncMock]:
|
|
"""Mock GitHub device client."""
|
|
with (
|
|
patch(
|
|
"homeassistant.components.github.config_flow.GitHubAPI",
|
|
autospec=True,
|
|
) as github_client_mock,
|
|
patch("homeassistant.components.github.GitHubAPI", new=github_client_mock),
|
|
patch(
|
|
"homeassistant.components.github.diagnostics.GitHubAPI",
|
|
new=github_client_mock,
|
|
),
|
|
):
|
|
client = github_client_mock.return_value
|
|
client.user.starred = AsyncMock(
|
|
side_effect=[
|
|
MagicMock(
|
|
is_last_page=False,
|
|
next_page_number=2,
|
|
last_page_number=2,
|
|
data=[MagicMock(full_name="home-assistant/core")],
|
|
),
|
|
MagicMock(
|
|
is_last_page=True,
|
|
data=[MagicMock(full_name="home-assistant/frontend")],
|
|
),
|
|
]
|
|
)
|
|
client.user.repos = AsyncMock(
|
|
side_effect=[
|
|
MagicMock(
|
|
is_last_page=False,
|
|
next_page_number=2,
|
|
last_page_number=2,
|
|
data=[MagicMock(full_name="home-assistant/operating-system")],
|
|
),
|
|
MagicMock(
|
|
is_last_page=True,
|
|
data=[MagicMock(full_name="esphome/esphome")],
|
|
),
|
|
]
|
|
)
|
|
rate_limit_mock = AsyncMock()
|
|
rate_limit_mock.data = GitHubRateLimitModel(
|
|
load_json_object_fixture("rate_limit.json", DOMAIN)
|
|
)
|
|
client.rate_limit.return_value = rate_limit_mock
|
|
graphql_mock = AsyncMock()
|
|
graphql_mock.data = load_json_object_fixture("graphql.json", DOMAIN)
|
|
client.graphql.return_value = graphql_mock
|
|
client.repos.events.subscribe = AsyncMock()
|
|
yield client
|