"""Unit tests for stores metadata handlers.""" import json from unittest.mock import MagicMock from oto import response as oto_response import pytest from analytics.logic import stores from tests.unit.fixtures import fixture_api @pytest.fixture(name='playlist_metadata') def get_test_playlist_metadata(): """Fixture for getting playlist metadata.""" return [{ 'playlist_link': ( 'http://open.spotify.com/user/' 'spotify/playlist/37i9dQZF1DWWOaP4H0w5b0'), 'image': 'https://i.scdn.co/image/some_image', 'followers': 82000}] def test_get_playlist_metadata( monkeypatch, headers, playlist_metadata): """Test /playlist-metadata endpoint.""" url = ( '/playlist-metadata/?playlist_links=' 'http://open.spotify.com/user/spotify/playlist/37i9dQZF1DWWOaP4H0w5b0' ) mock = MagicMock( return_value=oto_response.Response(message=playlist_metadata)) monkeypatch.setattr(stores, 'get_playlists_metadata', mock) response = fixture_api.CLIENT.get(url, headers=headers) data = json.loads(response.data.decode('utf8')) assert mock.called assert data == playlist_metadata assert response.status_code == 200 def test_get_playlist_metadata_without_links(headers): """Test /playlist-metadata endpoint when links were not specified.""" url = '/playlist-metadata/' response = fixture_api.CLIENT.get(url, headers=headers) assert response.status_code == 400 def test_get_playlist_metadata_with_unsupported_links(headers): """Test /playlist-metadata endpoint with unsupported links.""" url = ( '/playlist-metadata/?playlist_links=' 'https://www.youtube.com/watch?v=TsH4CrwExCQ' ) response = fixture_api.CLIENT.get(url, headers=headers) assert response.status_code == 400 def test_get_playlist_metadata_calls_fetch( monkeypatch, headers): """Test /playlist-metadata endpoint calls fetch_playlists_metadata.""" url = '/playlist-metadata/?playlist_links=test_link' fetch_mock = MagicMock( return_value=oto_response.Response( message={'test_link': {'playlist_link': 'test_link'}})) headers['Use-Snowflake'] = True monkeypatch.setattr(stores, 'fetch_playlists_metadata', fetch_mock) response = fixture_api.CLIENT.get(url, headers=headers) data = json.loads(response.data.decode('utf8')) assert fetch_mock.call_count == 1 assert data == [{'playlist_link': 'test_link'}] assert response.status_code == 200