"""Tests for streams endpoints.""" import json from unittest.mock import MagicMock from flexmock import flexmock from oto import response as oto_response from owsrequest.constants import headers as owsrequest_constants from analytics.logic import streams from tests.unit.fixtures import fixture_api def test_get_stream_charts_missing_stores(headers, monkeypatch): """Test for /stream-charts/ endpoint. Missings stores should be treated as a list of of all available stores """ url = '/stream-charts/?from_date=2017-02-01&to_date=2017-02-28' logic_mock = MagicMock(return_value=oto_response.Response({})) monkeypatch.setattr(streams, 'get_streams', logic_mock) response = fixture_api.CLIENT.get(url, headers=headers) assert response.status_code == 200 def test_get_stream_charts_incorrect_stores(headers): """Test for /stream-charts/ endpoint.""" url = '/stream-charts/?from_date=2017-02-01&to_date=2017-02-28&stores=bad' response = fixture_api.CLIENT.get(url, headers=headers) assert response.status_code == 400 def test_get_stream_charts(monkeypatch, headers, valid_stores): """Test for /stream-charts/ endpoint.""" url = ( '/stream-charts/?from_date=2017-02-01' '&to_date=2017-02-28&stores={}'.format( ','.join(valid_stores))) logic_mock = MagicMock(return_value=oto_response.Response({})) monkeypatch.setattr(streams, 'get_streams', logic_mock) response = fixture_api.CLIENT.get(url, headers=headers) assert response.status_code == 200 def test_get_stream_charts_missing_dates(headers): """Test getting data on /create_stream_charts/ with missing date params. Assert that 422 error should be returned """ url = '/stream-charts/' response = fixture_api.CLIENT.get(url, headers=headers) assert response.status_code == 400 def test_get_stream_charts_for_isrc_missing_dates(headers): """Test getting data on /get_streams_chart/isrc with missing date params. Assert that 422 error should be returned """ url = '/stream-charts/ISRC12121212/' response = fixture_api.CLIENT.get(url, headers=headers) assert response.status_code == 400 def test_get_streams_chart_for_isrc_access(incorrect_headers): """Assert that 403 status code is returned for incorrect headers.""" url = ( '/stream-charts/ISRC12121212/' '?from_date=2017-02-01&to_date=2017-02-28') response = fixture_api.CLIENT.get(url, headers=incorrect_headers) assert response.status_code == 403 def test_get_streams_charts_with_snowflake_header_calls_get_stream_charts( headers, get_streams_logic_result_response, valid_stores, all_stores): """Assert a 200 response is returned when 'Use-Snowflake' header.""" account_type = owsrequest_constants.GRASS_ACCOUNT_TYPE account_id = owsrequest_constants.GRASS_ACCOUNT_ID (flexmock(streams).should_receive('get_streams').with_args( '2017-02-01', '2017-02-28', headers[account_type], headers[account_id], valid_stores or all_stores, [1, 2], None, None, ['theorchard']).and_return( get_streams_logic_result_response)) headers['Use-Snowflake'] = True url = ( '/stream-charts/?from_date=2017-02-01' '&to_date=2017-02-28&stores={}'.format( ','.join(valid_stores))) response = fixture_api.CLIENT.get(url, headers=headers) assert response.status_code == 200 def test_get_streams_charts_with_snowflake_header_parses_query_params( headers, get_streams_logic_result_response, valid_stores, all_stores): """Assert isrcs and artist_ids parsed from query params.""" account_type = owsrequest_constants.GRASS_ACCOUNT_TYPE account_id = owsrequest_constants.GRASS_ACCOUNT_ID isrcs_string = '123,456,789' artist_ids_string = '246,357' (flexmock(streams).should_receive('get_streams').with_args( '2017-02-01', '2017-02-28', headers[account_type], headers[account_id], valid_stores or all_stores, [1, 2], ['123', '456', '789'], ['246', '357'], ['theorchard']).and_return( get_streams_logic_result_response)) headers['Use-Snowflake'] = True url = ( '/stream-charts/?from_date=2017-02-01&to_date=2017-02-28' '&stores={}&isrcs={}&artist_ids={}'.format( ','.join(valid_stores), isrcs_string, artist_ids_string)) response = fixture_api.CLIENT.get(url, headers=headers) data = json.loads(response.data.decode('utf8')) assert response.status_code == 200 assert data == get_streams_logic_result_response.message