/
/
1"""Tests for the Spotify provider setup and legacy-token migration."""
2
3from __future__ import annotations
4
5from typing import TYPE_CHECKING
6from unittest.mock import MagicMock
7
8from music_assistant.providers.spotify import setup
9from music_assistant.providers.spotify.constants import (
10 CONF_REFRESH_TOKEN_DEPRECATED,
11 CONF_REFRESH_TOKEN_GLOBAL,
12)
13
14if TYPE_CHECKING:
15 import pytest
16
17
18async def test_setup_migrates_legacy_global_token(monkeypatch: pytest.MonkeyPatch) -> None:
19 """
20 A legacy token (no custom client id) is migrated into setup_data under the global key.
21
22 The provider isn't registered during setup, so the migration writes straight to the
23 setup_data store; the presence check then passes without forcing re-auth.
24 """
25 values = {CONF_REFRESH_TOKEN_DEPRECATED: "legacy_tok"}
26 config = MagicMock(instance_id="spotify--test")
27 config.get_value = MagicMock(side_effect=lambda key, default=None: values.get(key, default))
28 config.setup_data = {}
29 mass = MagicMock()
30 mass.config.encrypt_string = MagicMock(side_effect=lambda value: value)
31 mass.config.set = MagicMock()
32 mass.config.set_raw_provider_config_value = MagicMock()
33 sentinel = object()
34 monkeypatch.setattr(
35 "music_assistant.providers.spotify.SpotifyProvider", MagicMock(return_value=sentinel)
36 )
37 result = await setup(mass, MagicMock(), config)
38 assert result is sentinel
39 # legacy token migrated into setup_data under the global key (encrypt is identity here)
40 mass.config.set.assert_any_call(
41 f"providers/spotify--test/setup_data/{CONF_REFRESH_TOKEN_GLOBAL}", "legacy_tok"
42 )
43 assert config.setup_data[CONF_REFRESH_TOKEN_GLOBAL] == "legacy_tok"
44 # the deprecated legacy key is cleared once migrated
45 mass.config.set_raw_provider_config_value.assert_any_call(
46 "spotify--test", CONF_REFRESH_TOKEN_DEPRECATED, None
47 )
48