/
/
/
1"""Unit tests for provider/auth.py (ya-passport-auth wrapper)."""
2
3from __future__ import annotations
4
5from unittest import mock
6
7import pytest
8from music_assistant_models.errors import LoginFailed
9from ya_passport_auth import SecretStr
10from ya_passport_auth.exceptions import InvalidCredentialsError
11
12from music_assistant.providers.yandex_ynison.auth import refresh_music_token
13
14# ---------------------------------------------------------------
15# refresh_music_token
16# ---------------------------------------------------------------
17
18
19async def test_refresh_music_token_success() -> None:
20 """Successful refresh returns a SecretStr."""
21 mock_client = mock.AsyncMock()
22 mock_client.refresh_music_token.return_value = SecretStr("new_music_token")
23
24 with mock.patch(
25 "music_assistant.providers.yandex_ynison.auth.PassportClient.create"
26 ) as mock_create:
27 mock_create.return_value.__aenter__ = mock.AsyncMock(return_value=mock_client)
28 mock_create.return_value.__aexit__ = mock.AsyncMock(return_value=False)
29
30 result = await refresh_music_token(SecretStr("my_x_token"))
31
32 assert result.get_secret() == "new_music_token"
33 mock_client.refresh_music_token.assert_awaited_once()
34
35
36async def test_refresh_music_token_auth_error_raises_login_failed() -> None:
37 """Auth failure during refresh is mapped to LoginFailed."""
38 mock_client = mock.AsyncMock()
39 mock_client.refresh_music_token.side_effect = InvalidCredentialsError("bad token")
40
41 with mock.patch(
42 "music_assistant.providers.yandex_ynison.auth.PassportClient.create"
43 ) as mock_create:
44 mock_create.return_value.__aenter__ = mock.AsyncMock(return_value=mock_client)
45 mock_create.return_value.__aexit__ = mock.AsyncMock(return_value=False)
46
47 with pytest.raises(LoginFailed, match="Music token refresh was rejected"):
48 await refresh_music_token(SecretStr("bad_x_token"))
49