"""Tests for Handlers.""" import json from time import time from unittest.mock import MagicMock from unittest.mock import patch from oto import response import pytest from feature_fm import api from feature_fm import handlers from feature_fm.logic import ows_services from feature_fm.utils import handler_utils @pytest.fixture def fixture_client(): """Create an api test client fixture.""" return api.app.test_client() @pytest.fixture def fixture_success(): """Fixture for a success response.""" return response.Response(status=200) @pytest.fixture def fixture_fatal(): """Fixture for a fatal response.""" return response.create_fatal_response() @pytest.fixture def fixture_not_found(): """Fixture for a not found response.""" return response.create_not_found_response() @patch('feature_fm.handlers.g') def test_exception_handler(mock_g): """Verify exception_Handler returns 500 status code and json payload.""" message = ( 'The server encountered an internal error ' 'and was unable to complete your request.') mock_error = MagicMock() server_response = handlers.exception_handler(mock_error) mock_g.log.exception.assert_called_with(mock_error) # assert status code is 500 assert server_response.status_code == 500 # assert json payload response_message = json.loads(server_response.data.decode()) assert response_message['message'] == message assert response_message['code'] == response.error.ERROR_CODE_INTERNAL_ERROR def test_get_artists_handler_success( monkeypatch, fixture_client, fixture_success): """Test get_artists handler with success result.""" timestamp = int(time()) token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/label/123/artists?timestamp={0}&token={1}'.format(timestamp, token) monkeypatch.setattr( handler_utils, 'validate_token', MagicMock(return_value=True)) monkeypatch.setattr( ows_services, 'get_artists', MagicMock(return_value=fixture_success)) result = fixture_client.get(url) assert result.status_code == fixture_success.status def test_get_artists_handler_invalid_token(monkeypatch, fixture_client): """Test get_artists handler with token not being verified.""" timestamp = int(time()) token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/label/123/artists?timestamp={0}&token={1}'.format(timestamp, token) monkeypatch.setattr( handler_utils, 'validate_token', MagicMock(return_value=False)) result = fixture_client.get(url) assert result.status_code == 400 def test_get_artists_handler_no_token_provided(fixture_client): """Test get_artists handler with token not provided.""" timestamp = int(time()) url = '/label/123/artists?timestamp={0}'.format(timestamp) result = fixture_client.get(url) assert result.status_code == 400 def test_get_artists_handler_no_timestamp_provided(fixture_client): """Test get_artists handler with no timestamp on query string.""" token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/label/123/artists?token={0}'.format(token) result = fixture_client.get(url) assert result.status_code == 400 def test_get_artists_handler_old_timestamp(fixture_client): """Test get_artists handler with invalid timestamp on query string.""" timestamp = 1501065677 token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/label/123/artists?timestamp={0}&token={1}'.format(timestamp, token) result = fixture_client.get(url) assert result.status_code == 400 def test_get_artists_bulk_handler_success( monkeypatch, fixture_client, fixture_success): """Test get_artists_bulk handler with success result.""" timestamp = int(time()) token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/label/123/artists?timestamp={0}&token={1}'.format( timestamp, token) data = {'artist_ids': [1, 2]} monkeypatch.setattr( handler_utils, 'validate_token', MagicMock(return_value=True)) monkeypatch.setattr( ows_services, 'get_artists_bulk', MagicMock( return_value=fixture_success)) result = fixture_client.post(url, data=json.dumps(data)) assert result.status_code == fixture_success.status def test_get_artists_bulk_handler_invalid_token(monkeypatch, fixture_client): """Test get_artists_bulk handler with token not being verified.""" timestamp = int(time()) token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/label/123/artists?timestamp={0}&token={1}'.format( timestamp, token) data = {'artist_ids': [1, 2]} monkeypatch.setattr( handler_utils, 'validate_token', MagicMock(return_value=False)) result = fixture_client.post(url, data=json.dumps(data)) assert result.status_code == 400 def test_get_artists_bulk_handler_no_token_provided(fixture_client): """Test get_artists_bulk handler with token not provided.""" timestamp = int(time()) url = '/label/123/artists?timestamp={0}'.format(timestamp) data = {'artist_ids': [1, 2]} result = fixture_client.post(url, data=json.dumps(data)) assert result.status_code == 400 def test_get_artists_bulk_handler_no_timestamp_provided(fixture_client): """Test get_artists_bulk handler with no timestamp.""" token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/label/123/artists?token={0}'.format(token) data = {'artist_ids': [1, 2]} result = fixture_client.post(url, data=json.dumps(data)) assert result.status_code == 400 def test_get_artists_bulk_handler_old_timestamp(fixture_client): """Test get_artists_bulk handler with invalid timestamp.""" timestamp = 1501065677 token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/label/123/artists?timestamp={0}&token={1}'.format( timestamp, token) data = {'artist_ids': [1, 2]} result = fixture_client.post(url, data=json.dumps(data)) assert result.status_code == 400 def test_get_artists_bulk_handler_missing_params( monkeypatch, fixture_client, fixture_success): """Test get_artists_bulk handler when called without artist_ids.""" timestamp = int(time()) token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/label/123/artists?timestamp={0}&token={1}'.format( timestamp, token) data = {'artist_ids': []} monkeypatch.setattr( handler_utils, 'validate_token', MagicMock(return_value=True)) result = fixture_client.post(url, data=json.dumps(data)) assert result.status_code == 400 def test_get_user_info_handler_success( monkeypatch, fixture_client, fixture_success): """Test get_user_info handler with success result.""" timestamp = int(time()) token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/label/123/users/123?timestamp={0}&token={1}'.format( timestamp, token) monkeypatch.setattr( handler_utils, 'validate_token', MagicMock(return_value=True)) monkeypatch.setattr( ows_services, 'get_user_info', MagicMock(return_value=fixture_success)) result = fixture_client.get(url) assert result.status_code == fixture_success.status def test_get_user_info_handler_invalid_token(monkeypatch, fixture_client): """Test get_user_info handler with token not being verified.""" timestamp = int(time()) token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/label/123/users/123?timestamp={0}&token={1}'.format( timestamp, token) monkeypatch.setattr( handler_utils, 'validate_token', MagicMock(return_value=False)) result = fixture_client.get(url) assert result.status_code == 400 def test_get_user_info_handler_no_token_provided(fixture_client): """Test get_user_info handler with token not provided.""" timestamp = int(time()) url = '/label/123/users/123?timestamp={0}'.format(timestamp) result = fixture_client.get(url) assert result.status_code == 400 def test_get_user_info_handler_no_timestamp_provided(fixture_client): """Test get_user_info handler with no timestamp on query string.""" token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/label/123/users/123?token={0}'.format(token) result = fixture_client.get(url) assert result.status_code == 400 def test_get_user_info_handler_old_timestamp(fixture_client): """Test get_user_info handler with invalid timestamp on query string.""" timestamp = 1501065677 token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/label/123/users/123?timestamp={0}&token={1}'.format( timestamp, token) result = fixture_client.get(url) assert result.status_code == 400 def test_get_releases_for_artist_handler_success( monkeypatch, fixture_client, fixture_success): """Test get_releeases handler with success result.""" timestamp = int(time()) token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/label/123/artists/123/releases?timestamp={0}&token={1}'.format( timestamp, token) monkeypatch.setattr( handler_utils, 'validate_token', MagicMock(return_value=True)) monkeypatch.setattr( ows_services, 'get_artist_releases', MagicMock(return_value=fixture_success)) result = fixture_client.get(url) assert result.status_code == fixture_success.status def test_get_releases_for_artist_handler_invalid_token( monkeypatch, fixture_client): """Test get_user_info handler with token not being verified.""" timestamp = int(time()) token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/label/123/artists/123/releases?timestamp={0}&token={1}'.format( timestamp, token) monkeypatch.setattr( handler_utils, 'validate_token', MagicMock(return_value=False)) result = fixture_client.get(url) assert result.status_code == 400 def test_get_releases_for_artist_handler_no_token_provided(fixture_client): """Test get_user_info handler with token not provided.""" timestamp = int(time()) url = '/label/123/artists/123/releases?timestamp={0}'.format(timestamp) result = fixture_client.get(url) assert result.status_code == 400 def test_get_releases_for_artist_handler_no_timestamp_provided(fixture_client): """Test get_user_info handler with no timestamp on query string.""" token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/label/123/artists/123/releases?token={0}'.format(token) result = fixture_client.get(url) assert result.status_code == 400 def test_get_releases_for_artist_handler_old_timestamp(fixture_client): """Test get_user_info handler with invalid timestamp on query string.""" timestamp = 1501065677 token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/label/123/artists/123/releases?timestamp={0}&token={1}'.format( timestamp, token) result = fixture_client.get(url) assert result.status_code == 400 def test_get_artist_by_id_handler_success( monkeypatch, fixture_client, fixture_success): """Test get artist by id with successful result.""" timestamp = int(time()) token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/label/123/artist/123?timestamp={0}&token={1}'.format( timestamp, token) monkeypatch.setattr( handler_utils, 'validate_token', MagicMock(return_value=True)) monkeypatch.setattr( ows_services, 'get_artist_by_id', MagicMock(return_value=fixture_success)) result = fixture_client.get(url) assert result.status_code == fixture_success.status def test_get_artist_by_id_handler_invalid_token( monkeypatch, fixture_client): """Test get artist by id with with invalid token.""" timestamp = int(time()) token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/label/123/artist/123?timestamp={0}&token={1}'.format( timestamp, token) monkeypatch.setattr( handler_utils, 'validate_token', MagicMock(return_value=False)) monkeypatch.setattr( ows_services, 'get_artist_by_id', MagicMock(return_value=fixture_success)) result = fixture_client.get(url) assert result.status_code == 400 def test_get_artist_by_id_handler_no_timestamp_provided(fixture_client): """Test get artist by id with with no timestamp provided.""" token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/label/123/artist/123?token={0}'.format(token) result = fixture_client.get(url) assert result.status_code == 400 def test_get_artist_by_id_handler_old_timestamp(fixture_client): """Test get artist by id with with old timestamp.""" token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' timestamp = 1501065677 url = '/label/123/artist/123?timestamp={0}&token={1}'.format( timestamp, token) result = fixture_client.get(url) assert result.status_code == 400 def test_get_campaign_budget_handler_success( monkeypatch, fixture_client, fixture_success): """Test getting campaign budget handler with success result.""" timestamp = int(time()) token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/label/123/campaign-budget?timestamp={0}&token={1}'.format( timestamp, token) monkeypatch.setattr( handler_utils, 'validate_token', MagicMock(return_value=True)) monkeypatch.setattr( ows_services, 'get_campaign_budget', MagicMock(return_value=fixture_success)) result = fixture_client.get(url) assert result.status_code == fixture_success.status def test_get_campaign_budget_handler_invalid_token( monkeypatch, fixture_client): """Test getting campaign budget handler with token not verified.""" timestamp = int(time()) token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/label/123/campaign-budget?timestamp={0}&token={1}'.format( timestamp, token) monkeypatch.setattr( handler_utils, 'validate_token', MagicMock(return_value=False)) result = fixture_client.get(url) assert result.status_code == 400 def test_get_campaign_budget_handler_no_token_provided(fixture_client): """Test getting campaign budget handler with token not provided.""" timestamp = int(time()) url = '/label/123/campaign-budget?timestamp={0}'.format(timestamp) result = fixture_client.get(url) assert result.status_code == 400 def test_get_campaign_budget_handler_no_timestamp_provided(fixture_client): """Test getting campaign budget handler with no timestamp.""" token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/label/123/campaign-budget?token={0}'.format(token) result = fixture_client.get(url) assert result.status_code == 400 def test_get_campaign_budget_handler_old_timestamp(fixture_client): """Test getting campaign budget handler with invalid timestamp.""" timestamp = 1501065677 token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/label/123/campaign-budget?timestamp={0}&token={1}'.format( timestamp, token) result = fixture_client.get(url) assert result.status_code == 400 def test_get_budgets_caps_handler_success( monkeypatch, fixture_client, fixture_success): """Test get budget caps.""" timestamp = int(time()) token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/budget-caps?timestamp={0}&token={1}'.format( timestamp, token) monkeypatch.setattr( handler_utils, 'validate_token', MagicMock(return_value=True)) monkeypatch.setattr( ows_services, 'get_budget_caps', MagicMock(return_value=fixture_success)) result = fixture_client.get(url) assert result.status_code == fixture_success.status def test_get_budget_caps_handler_invalid_token( monkeypatch, fixture_client): """Test get budget caps invalid token.""" timestamp = int(time()) token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/budget-caps?timestamp={0}&token={1}'.format( timestamp, token) monkeypatch.setattr( handler_utils, 'validate_token', MagicMock(return_value=False)) result = fixture_client.get(url) assert result.status_code == 400 def test_get_budget_caps_handler_no_token_provided(fixture_client): """Test get budget caps handler with token not provided.""" timestamp = int(time()) url = '/budget-caps?timestamp={0}'.format(timestamp) result = fixture_client.get(url) assert result.status_code == 400 def test_get_budget_caps_handler_no_timestamp_provided(fixture_client): """Test get budget caps handler with no timestamp.""" token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/budget-caps?token={0}'.format(token) result = fixture_client.get(url) assert result.status_code == 400 def test_get_budget_caps_handler_old_timestamp(fixture_client): """Test get budget caps handler with invalid timestamp.""" timestamp = 1501065677 token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/budget-caps?timestamp={0}&token={1}'.format( timestamp, token) result = fixture_client.get(url) assert result.status_code == 400 def test_get_releases_for_label_handler_success( monkeypatch, fixture_client, fixture_success): """Test get_releases for a label handler with success result.""" timestamp = int(time()) token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/label/123/releases?timestamp={0}&token={1}'.format( timestamp, token) monkeypatch.setattr( handler_utils, 'validate_token', MagicMock(return_value=True)) monkeypatch.setattr( ows_services, 'get_label_releases', MagicMock(return_value=fixture_success)) result = fixture_client.get(url) assert result.status_code == fixture_success.status def test_get_releases_for_label_handler_invalid_token( monkeypatch, fixture_client): """Test get_releases for a label handler with token not being verified.""" timestamp = int(time()) token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/label/123/releases?timestamp={0}&token={1}'.format( timestamp, token) monkeypatch.setattr( handler_utils, 'validate_token', MagicMock(return_value=False)) result = fixture_client.get(url) assert result.status_code == 400 def test_get_releases_for_label_handler_no_token_provided(fixture_client): """Test get_user_info handler with token not provided.""" timestamp = int(time()) url = '/label/123/releases?timestamp={0}'.format(timestamp) result = fixture_client.get(url) assert result.status_code == 400 def test_get_releases_for_label_handler_no_timestamp_provided(fixture_client): """Test get releases for a label handler no timestamp on query string.""" token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/label/123/releases?token={0}'.format(token) result = fixture_client.get(url) assert result.status_code == 400 def test_get_releases_for_label_handler_old_timestamp(fixture_client): """Test get_user_info handler with invalid timestamp on query string.""" timestamp = 1501065677 token = 'ZjQxMmJlYmI0NjQzNWM1ODk5NjkyZTBhODlhZGM4ODU2NDEyZjU1Nw==' url = '/label/123/releases?timestamp={0}&token={1}'.format( timestamp, token) result = fixture_client.get(url) assert result.status_code == 400