core/tests/components/iotty/test_api.py

83 lines
2.4 KiB
Python
Raw Normal View History

Add integration for iotty Smart Home (#103073) * Initial import 0.0.2 * Fixes to URL, and removed commits * Initial import 0.0.2 * Fixes to URL, and removed commits * Added first test for iotty * First release * Reviewers request #1 - Removed clutter - Added support for new naming convention for IottySmartSwitch entity * Removed commmented code * Some modifications * Modified REST EP for iotty CloudApi * Initial import 0.0.2 * Fixes to URL, and removed commits * Added first test for iotty * First release * Rebased and resolved conflicts * Reviewers request #1 - Removed clutter - Added support for new naming convention for IottySmartSwitch entity * Removed commmented code * Some modifications * Modified REST EP for iotty CloudApi * Removed empty entries in manifest.json * Added test_config_flow * Fix as requested by @edenhaus * Added test_init * Removed comments, added one assert * Added TEST_CONFIG_FLOW * Added test for STORE_ENTITY * Increased code coverage * Full coverage for api.py * Added tests for switch component * Converted INFO logs onto DEBUG logs * Removed .gitignore from commits * Modifications to SWITCH.PY * Initial import 0.0.2 * Fixes to URL, and removed commits * Added first test for iotty * First release * Rebased and resolved conflicts * Fixed conflicts * Reviewers request #1 - Removed clutter - Added support for new naming convention for IottySmartSwitch entity * Removed commmented code * Some modifications * Modified REST EP for iotty CloudApi * Removed empty entries in manifest.json * Added test_config_flow * Some modifications * Fix as requested by @edenhaus * Added test_init * Removed comments, added one assert * Added TEST_CONFIG_FLOW * Added test for STORE_ENTITY * Increased code coverage * Full coverage for api.py * Added tests for switch component * Converted INFO logs onto DEBUG logs * Removed .gitignore from commits * Modifications to SWITCH.PY * Fixed tests for SWITCH * First working implementation of Coordinator * Increased code coverage * Full code coverage * Missing a line in testing * Update homeassistant/components/iotty/__init__.py Co-authored-by: Robert Resch <robert@resch.dev> * Update homeassistant/components/iotty/__init__.py Co-authored-by: Robert Resch <robert@resch.dev> * Modified coordinator as per request by edenhaus * use coordinator entities for switches * move platforms to constants * fix whitespace with ruff-format * correct iotty entry in application_credentials list * minor style improvements * refactor function name * handle new and deleted devices * improve code for adding devices after first initialization * use typed config entry instead of adding known devices to hass.data * improve iotty entity removal * test listeners update cycle * handle iotty as devices and not only as entities * fix test typing for mock config entry * test with fewer mocks for an integration test style opposed to the previous unit test style * remove useless tests and add more integration style tests * check if device_to_remove is None * integration style tests for turning switches on and off * remove redundant coordinator tests * check device status after issuing command in tests * remove unused fixtures * add strict typing for iotty * additional asserts and named snapshots in tests * fix mypy issues after enabling strict typing * upgrade iottycloud version to 0.1.3 * move coordinator to runtime_data * remove entity name * fix typing issues * coding style fixes * improve tests coding style and assertion targets * test edge cases when apis are not working * improve tests comments and assertions --------- Co-authored-by: Robert Resch <robert@resch.dev> Co-authored-by: Shapour Nemati <shapour.nemati@iotty.com> Co-authored-by: Erik Montnemery <erik@montnemery.com> Co-authored-by: shapournemati-iotty <130070037+shapournemati-iotty@users.noreply.github.com>
2024-07-19 10:10:39 +00:00
"""Unit tests for iottycloud API."""
from unittest.mock import patch
from aiohttp import ClientSession
import pytest
from homeassistant.components.iotty import api
from homeassistant.components.iotty.const import DOMAIN
from homeassistant.core import HomeAssistant
from homeassistant.helpers import config_entry_oauth2_flow
from tests.common import MockConfigEntry
from tests.test_util.aiohttp import AiohttpClientMocker
async def test_api_create_fail(
hass: HomeAssistant, aioclient_mock: AiohttpClientMocker
) -> None:
"""Test API creation with no session."""
with pytest.raises(ValueError, match="websession"):
api.IottyProxy(hass, None, None)
with pytest.raises(ValueError, match="oauth_session"):
api.IottyProxy(hass, aioclient_mock, None)
async def test_api_create_ok(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
aiohttp_client_session: None,
local_oauth_impl: ClientSession,
) -> None:
"""Test API creation. We're checking that we can create an IottyProxy without raising."""
mock_config_entry.add_to_hass(hass)
assert mock_config_entry.data["auth_implementation"] is not None
config_entry_oauth2_flow.async_register_implementation(
hass, DOMAIN, local_oauth_impl
)
api.IottyProxy(hass, aiohttp_client_session, local_oauth_impl)
@patch(
"homeassistant.helpers.config_entry_oauth2_flow.OAuth2Session.valid_token", False
)
async def test_api_getaccesstoken_tokennotvalid_reloadtoken(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
local_oauth_impl: ClientSession,
mock_aioclient: None,
aiohttp_client_session: ClientSession,
) -> None:
"""Test getting access token.
If a request with an invalid token is made, a request for a new token is done,
and the resulting token is used for future calls.
"""
config_entry_oauth2_flow.async_register_implementation(
hass, DOMAIN, local_oauth_impl
)
new_token = "ACCESS_TOKEN_1"
mock_aioclient.post(
"https://token.url", json={"access_token": new_token, "expires_in": 100}
)
mock_aioclient.post("https://example.com", status=201)
mock_config_entry.add_to_hass(hass)
oauth2_session = config_entry_oauth2_flow.OAuth2Session(
hass, mock_config_entry, local_oauth_impl
)
iotty = api.IottyProxy(hass, aiohttp_client_session, oauth2_session)
tok = await iotty.async_get_access_token()
assert tok == new_token