Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 7 additions & 8 deletions homeassistant/components/nintendo_parental_controls/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

from __future__ import annotations

from pynintendoparental import Authenticator
from pynintendoparental.exceptions import (
from pynintendoauth.exceptions import (
InvalidOAuthConfigurationException,
InvalidSessionTokenException,
)
from pynintendoparental import Authenticator

from homeassistant.const import Platform
from homeassistant.core import HomeAssistant
Expand Down Expand Up @@ -39,13 +39,12 @@ async def async_setup_entry(
hass: HomeAssistant, entry: NintendoParentalControlsConfigEntry
) -> bool:
"""Set up Nintendo Switch parental controls from a config entry."""
nintendo_auth = Authenticator(
session_token=entry.data[CONF_SESSION_TOKEN],
client_session=async_get_clientsession(hass),
)
try:
nintendo_auth = await Authenticator.complete_login(
auth=None,
response_token=entry.data[CONF_SESSION_TOKEN],
is_session_token=True,
client_session=async_get_clientsession(hass),
)
await nintendo_auth.async_complete_login(use_session_token=True)
except (InvalidSessionTokenException, InvalidOAuthConfigurationException) as err:
raise ConfigEntryAuthFailed(
translation_domain=DOMAIN,
Expand Down
22 changes: 7 additions & 15 deletions homeassistant/components/nintendo_parental_controls/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@
import logging
from typing import TYPE_CHECKING, Any

from pynintendoauth.exceptions import HttpException, InvalidSessionTokenException
from pynintendoparental import Authenticator
from pynintendoparental.api import Api
from pynintendoparental.exceptions import HttpException, InvalidSessionTokenException
import voluptuous as vol

from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
Expand All @@ -33,18 +33,14 @@ async def async_step_user(
"""Handle the initial step."""
errors = {}
if self.auth is None:
self.auth = Authenticator.generate_login(
client_session=async_get_clientsession(self.hass)
)
self.auth = Authenticator(client_session=async_get_clientsession(self.hass))

if user_input is not None:
nintendo_api = Api(
self.auth, self.hass.config.time_zone, self.hass.config.language
)
try:
await self.auth.complete_login(
self.auth, user_input[CONF_API_TOKEN], False
)
await self.auth.async_complete_login(user_input[CONF_API_TOKEN])
except (ValueError, InvalidSessionTokenException, HttpException):
errors["base"] = "invalid_auth"
else:
Expand All @@ -67,7 +63,7 @@ async def async_step_user(
return self.async_create_entry(
title=self.auth.account_id,
data={
CONF_SESSION_TOKEN: self.auth.get_session_token,
CONF_SESSION_TOKEN: self.auth.session_token,
},
)
return self.async_show_form(
Expand All @@ -90,22 +86,18 @@ async def async_step_reauth_confirm(
errors: dict[str, str] = {}
reauth_entry = self._get_reauth_entry()
if self.auth is None:
self.auth = Authenticator.generate_login(
client_session=async_get_clientsession(self.hass)
)
self.auth = Authenticator(client_session=async_get_clientsession(self.hass))
if user_input is not None:
try:
await self.auth.complete_login(
self.auth, user_input[CONF_API_TOKEN], False
)
await self.auth.async_complete_login(user_input[CONF_API_TOKEN])
except (ValueError, InvalidSessionTokenException, HttpException):
errors["base"] = "invalid_auth"
else:
return self.async_update_reload_and_abort(
reauth_entry,
data={
**reauth_entry.data,
CONF_SESSION_TOKEN: self.auth.get_session_token,
CONF_SESSION_TOKEN: self.auth.session_token,
},
)
return self.async_show_form(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,9 @@
from datetime import timedelta
import logging

from pynintendoauth.exceptions import InvalidOAuthConfigurationException
from pynintendoparental import Authenticator, NintendoParental
from pynintendoparental.exceptions import (
InvalidOAuthConfigurationException,
NoDevicesFoundException,
)
from pynintendoparental.exceptions import NoDevicesFoundException

from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@
"iot_class": "cloud_polling",
"loggers": ["pynintendoparental"],
"quality_scale": "bronze",
"requirements": ["pynintendoparental==1.1.3"]
"requirements": ["pynintendoparental==2.0.0"]
}
2 changes: 1 addition & 1 deletion requirements_all.txt

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion requirements_test_all.txt

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

37 changes: 3 additions & 34 deletions tests/components/nintendo_parental_controls/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

from pynintendoparental import NintendoParental
from pynintendoparental.device import Device
from pynintendoparental.exceptions import InvalidOAuthConfigurationException
import pytest

from homeassistant.components.nintendo_parental_controls.const import DOMAIN
Expand Down Expand Up @@ -71,11 +70,9 @@ def mock_nintendo_authenticator() -> Generator[MagicMock]:
mock_auth._at_expiry = datetime(2099, 12, 31, 23, 59, 59)
mock_auth.account_id = ACCOUNT_ID
mock_auth.login_url = LOGIN_URL
mock_auth.get_session_token = API_TOKEN
# Patch complete_login as an AsyncMock on both instance and class as this is a class method
mock_auth.complete_login = AsyncMock()
type(mock_auth).complete_login = mock_auth.complete_login
mock_auth_class.generate_login.return_value = mock_auth
mock_auth.session_token = API_TOKEN
mock_auth.async_complete_login = AsyncMock()
mock_auth_class.return_value = mock_auth
yield mock_auth


Expand All @@ -93,34 +90,6 @@ def mock_nintendo_api() -> Generator[AsyncMock]:
yield mock_api_instance


@pytest.fixture
def mock_failed_nintendo_authenticator() -> Generator[MagicMock]:
"""Mock a failed Nintendo Authenticator."""
with (
patch(
"homeassistant.components.nintendo_parental_controls.Authenticator",
autospec=True,
) as mock_auth_class,
patch(
"homeassistant.components.nintendo_parental_controls.config_flow.Authenticator",
new=mock_auth_class,
),
patch(
"homeassistant.components.nintendo_parental_controls.coordinator.NintendoParental.update",
return_value=None,
),
):
mock_auth = MagicMock()
mock_auth.complete_login = AsyncMock(
side_effect=InvalidOAuthConfigurationException(
status_code=401,
message="Authentication failed",
)
)
mock_auth_class.complete_login = mock_auth.complete_login
yield mock_auth


@pytest.fixture
def mock_nintendo_client(
mock_nintendo_device: Device, mock_nintendo_authenticator: MagicMock
Expand Down
14 changes: 7 additions & 7 deletions tests/components/nintendo_parental_controls/test_config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from unittest.mock import AsyncMock

from pynintendoparental.exceptions import HttpException, InvalidSessionTokenException
from pynintendoauth.exceptions import HttpException, InvalidSessionTokenException

from homeassistant import config_entries
from homeassistant.components.nintendo_parental_controls.const import (
Expand Down Expand Up @@ -82,7 +82,7 @@ async def test_invalid_auth(
assert "link" in result["description_placeholders"]

# Simulate invalid authentication by raising an exception
mock_nintendo_authenticator.complete_login.side_effect = (
mock_nintendo_authenticator.async_complete_login.side_effect = (
InvalidSessionTokenException(status_code=401, message="Test")
)

Expand All @@ -95,7 +95,7 @@ async def test_invalid_auth(
assert result["errors"] == {"base": "invalid_auth"}

# Now ensure that the flow can be recovered
mock_nintendo_authenticator.complete_login.side_effect = None
mock_nintendo_authenticator.async_complete_login.side_effect = None

result = await hass.config_entries.flow.async_configure(
result["flow_id"], user_input={CONF_API_TOKEN: API_TOKEN}
Expand All @@ -121,7 +121,7 @@ async def test_missing_devices(
assert result["step_id"] == "user"
assert "link" in result["description_placeholders"]

mock_nintendo_authenticator.complete_login.side_effect = None
mock_nintendo_authenticator.async_complete_login.side_effect = None

mock_nintendo_api.async_get_account_devices.side_effect = HttpException(
status_code=404, message="TEST"
Expand Down Expand Up @@ -149,7 +149,7 @@ async def test_cannot_connect(
assert result["step_id"] == "user"
assert "link" in result["description_placeholders"]

mock_nintendo_authenticator.complete_login.side_effect = None
mock_nintendo_authenticator.async_complete_login.side_effect = None

mock_nintendo_api.async_get_account_devices.side_effect = HttpException(
status_code=500, message="TEST"
Expand Down Expand Up @@ -209,7 +209,7 @@ async def test_reauthentication_fail(
assert result["errors"] == {}

# Simulate invalid authentication by raising an exception
mock_nintendo_authenticator.complete_login.side_effect = (
mock_nintendo_authenticator.async_complete_login.side_effect = (
InvalidSessionTokenException(status_code=401, message="Test")
)

Expand All @@ -222,7 +222,7 @@ async def test_reauthentication_fail(
assert result["errors"] == {"base": "invalid_auth"}

# Now ensure that the flow can be recovered
mock_nintendo_authenticator.complete_login.side_effect = None
mock_nintendo_authenticator.async_complete_login.side_effect = None

result = await hass.config_entries.flow.async_configure(
result["flow_id"], user_input={CONF_API_TOKEN: API_TOKEN}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,8 @@

from unittest.mock import AsyncMock

from pynintendoparental.exceptions import (
InvalidOAuthConfigurationException,
NoDevicesFoundException,
)
from pynintendoauth.exceptions import InvalidOAuthConfigurationException
from pynintendoparental.exceptions import NoDevicesFoundException

from homeassistant.config_entries import ConfigEntryState
from homeassistant.core import HomeAssistant
Expand Down
3 changes: 2 additions & 1 deletion tests/components/nintendo_parental_controls/test_init.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,11 @@
async def test_invalid_authentication(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mock_failed_nintendo_authenticator: AsyncMock,
mock_nintendo_authenticator: AsyncMock,
entity_registry: er.EntityRegistry,
) -> None:
"""Test handling of invalid authentication."""
mock_nintendo_authenticator.async_complete_login.side_effect = ValueError
await setup_integration(hass, mock_config_entry)

# Ensure no entities are created
Expand Down
Loading