"""Unit tests for Apple Music API Service.""" from unittest.mock import MagicMock import pytest from src.services.apple_music_api import AppleMusicAPI from src.services.apple_music_api import jwt from src.services.apple_music_api import requests from src.services.apple_music_api import time @pytest.fixture def access_token(): """Access token fixture.""" return 'access_token' @pytest.fixture def apple_music_api(mocker, access_token): """Apple Music API object fixture.""" requests_post = mocker.patch.object(jwt, 'encode', ) requests_post.return_value = 'my_token' return AppleMusicAPI('my_client_id', 'my_team_id', 'my_private_key') @pytest.fixture def successful_response(): """Successful response fixture.""" return {'successful': 'response'} @pytest.fixture def response_status_code_200(mocker, successful_response): """Successful response fixture.""" requests_get = mocker.patch.object(requests, 'get') response_mock = MagicMock() response_mock.status_code = 200 response_mock.json.return_value = successful_response requests_get.return_value = response_mock return requests_get def test_apple_music_api_successful( apple_music_api, response_status_code_200, successful_response): """Test successful API call.""" call_response = apple_music_api.call('search', {'my': 'param'}) assert call_response.json() == successful_response assert call_response == response_status_code_200() @pytest.fixture def response_status_code_401(mocker): """Unauthorized response fixture.""" requests_get = mocker.patch.object(requests, 'get') response_mock = MagicMock() response_mock.status_code = 401 requests_get.return_value = response_mock return requests_get def test_apple_music_api_unauthorized( mocker, apple_music_api, response_status_code_401): """Test unauthorized API call.""" method_mock = mocker.patch.object( apple_music_api, '_recreate_access_token_for_creds') call_response = apple_music_api.call('search', {'my': 'param'}) assert method_mock.called assert call_response == response_status_code_401() @pytest.fixture def response_status_code_429(mocker): """Too many requests response fixture.""" requests_get = mocker.patch.object(requests, 'get') response_mock = MagicMock() response_mock.status_code = 429 requests_get.return_value = response_mock return requests_get def test_apple_music_api_too_many_requests( mocker, apple_music_api, response_status_code_429): """Test unauthorized API call.""" method_mock = mocker.patch.object(time, 'sleep') call_response = apple_music_api.call('search', {'my': 'param'}) assert method_mock.called assert call_response == response_status_code_429() @pytest.fixture def response_status_code_500(mocker): """Too many requests response fixture.""" requests_get = mocker.patch.object(requests, 'get') response_mock = MagicMock() response_mock.status_code = 500 requests_get.return_value = response_mock return requests_get def test_apple_music_api_server_error( apple_music_api, response_status_code_500): """Test unauthorized API call.""" call_response = apple_music_api.call('search', {'my': 'param'}) assert call_response.status_code == 500 assert call_response == response_status_code_500()