"""Unit tests for the ows-search interface.""" import flexmock from owsrequest import request import requests from feature_fm.constants.error import ERROR_CODE_OWS_SEARCH from feature_fm.constants.ows_services import CONTENT_TYPE from feature_fm.constants.ows_services import DEFAULT_PAGE_LIMIT from feature_fm.constants.ows_services import OWS_SEARCH from feature_fm.constants.ows_services import OWS_SEARCH_RELEASES_CONTEXTS from feature_fm.constants.ows_services import OWS_SEARCH_RELEASES_TOKEN from feature_fm.models import ows_search def test_get_artist_releases(): """Test getting an artist's releases.""" account_type = 'vendor' account_id = 1234 artist_id = 1 search_term = '12' page_size = 20 releases = { 'totalHits': 1, 'pageSize': '20', 'results': { 'rel1': { 'release_id': '1', 'release_name': 'One', 'upc': 'UPC1', 'coverart_paths': { 'thumb': 'IMAGE_URL' } } } } path = ('/api/v1/suggest?context={0}&token={1}&term={2}&page_size={3}' '&filter.artist_id={4}&filter.{5}={6}' '&sort=sale_start_date&sort_order=desc').\ format( OWS_SEARCH_RELEASES_CONTEXTS[account_type], OWS_SEARCH_RELEASES_TOKEN, search_term, page_size, artist_id, 'vendor_id', account_id) ows_search_response = flexmock(requests.models.Response()) ows_search_response.status_code = 200 (flexmock(ows_search_response) .should_receive('json') .and_return(releases)) (flexmock(request) .should_receive('get') .with_args( OWS_SEARCH, path, headers={'Content-Type': CONTENT_TYPE}) .and_return(ows_search_response)) result = ows_search.get_artist_releases( account_type, account_id, artist_id, search_term, page_size) assert result.status == 200 assert result.message == releases def test_get_artist_releases_default(): """Test getting an artist's releases with the default params.""" account_type = 'vendor' account_id = 1234 artist_id = 1 releases = { 'totalHits': 1, 'pageSize': '20', 'results': { 'rel1': { 'release_id': '1', 'release_name': 'One', 'upc': 'UPC1', 'coverart_paths': { 'thumb': 'IMAGE_URL' } } } } path = ('/api/v1/suggest?context={0}&token={1}&term={2}&page_size={3}' '&filter.artist_id={4}&filter.{5}={6}' '&sort=sale_start_date&sort_order=desc').\ format( OWS_SEARCH_RELEASES_CONTEXTS[account_type], OWS_SEARCH_RELEASES_TOKEN, '', DEFAULT_PAGE_LIMIT, artist_id, 'vendor_id', account_id) ows_search_response = flexmock(requests.models.Response()) ows_search_response.status_code = 200 (flexmock(ows_search_response) .should_receive('json') .and_return(releases)) (flexmock(request) .should_receive('get') .with_args( OWS_SEARCH, path, headers={'Content-Type': CONTENT_TYPE}) .and_return(ows_search_response)) result = ows_search.get_artist_releases( account_type, account_id, artist_id) assert result.status == 200 assert result.message == releases def test_get_artist_releases_error(): """Test getting an artist's releases when the request fails.""" account_type = 'vendor' account_id = 1234 artist_id = 1 search_term = '12' page_size = 20 path = ('/api/v1/suggest?context={0}&token={1}&term={2}&page_size={3}' '&filter.artist_id={4}&filter.{5}={6}' '&sort=sale_start_date&sort_order=desc').\ format( OWS_SEARCH_RELEASES_CONTEXTS[account_type], OWS_SEARCH_RELEASES_TOKEN, search_term, page_size, artist_id, 'vendor_id', account_id) ows_search_response = flexmock(requests.models.Response()) ows_search_response.status_code = 500 ows_search_error = 'ows_search_error' (flexmock(ows_search_response) .should_receive('text') .and_return(ows_search_error)) (flexmock(request) .should_receive('get') .with_args( OWS_SEARCH, path, headers={'Content-Type': CONTENT_TYPE}) .and_return(ows_search_response)) result = ows_search.get_artist_releases( account_type, account_id, artist_id, search_term, page_size) assert result.status == 500 assert result.errors == { 'code': ERROR_CODE_OWS_SEARCH, 'message': ows_search_error } def test_get_label_releases(): """Test getting releases for a label.""" account_type = 'vendor' account_id = 1234 search_term = '12' page_size = 20 releases = { 'totalHits': 1, 'pageSize': '20', 'results': { 'rel1': { 'release_id': '1', 'release_name': 'One', 'upc': 'UPC1', 'coverart_paths': { 'thumb': 'IMAGE_URL' } } } } path = ('/api/v1/suggest?context={0}&token={1}&term={2}&page_size={3}' '&filter.{4}={5}' '&sort=sale_start_date&sort_order=desc').\ format( OWS_SEARCH_RELEASES_CONTEXTS[account_type], OWS_SEARCH_RELEASES_TOKEN, search_term, page_size, 'vendor_id', account_id) ows_search_response = flexmock(requests.models.Response()) ows_search_response.status_code = 200 (flexmock(ows_search_response) .should_receive('json') .and_return(releases)) (flexmock(request) .should_receive('get') .with_args( OWS_SEARCH, path, headers={'Content-Type': CONTENT_TYPE}) .and_return(ows_search_response)) result = ows_search.get_label_releases( account_type, account_id, search_term, page_size) assert result.status == 200 assert result.message == releases def test_get_label_releases_default(): """Test getting releases for a label with the default params.""" account_type = 'vendor' account_id = 1234 releases = { 'totalHits': 1, 'pageSize': '20', 'results': { 'rel1': { 'release_id': '1', 'release_name': 'One', 'upc': 'UPC1', 'coverart_paths': { 'thumb': 'IMAGE_URL' } } } } path = ('/api/v1/suggest?context={0}&token={1}&term={2}&page_size={3}' '&filter.{4}={5}' '&sort=sale_start_date&sort_order=desc').\ format( OWS_SEARCH_RELEASES_CONTEXTS[account_type], OWS_SEARCH_RELEASES_TOKEN, '', DEFAULT_PAGE_LIMIT, 'vendor_id', account_id) ows_search_response = flexmock(requests.models.Response()) ows_search_response.status_code = 200 (flexmock(ows_search_response) .should_receive('json') .and_return(releases)) (flexmock(request) .should_receive('get') .with_args( OWS_SEARCH, path, headers={'Content-Type': CONTENT_TYPE}) .and_return(ows_search_response)) result = ows_search.get_label_releases( account_type, account_id) assert result.status == 200 assert result.message == releases def test_get_label_releases_error(): """Test getting releases for a label when the request fails.""" account_type = 'vendor' account_id = 1234 search_term = '12' page_size = 20 path = ('/api/v1/suggest?context={0}&token={1}&term={2}&page_size={3}' '&filter.{4}={5}' '&sort=sale_start_date&sort_order=desc').\ format( OWS_SEARCH_RELEASES_CONTEXTS[account_type], OWS_SEARCH_RELEASES_TOKEN, search_term, page_size, 'vendor_id', account_id) ows_search_response = flexmock(requests.models.Response()) ows_search_response.status_code = 500 ows_search_error = 'ows_search_error' (flexmock(ows_search_response) .should_receive('text') .and_return(ows_search_error)) (flexmock(request) .should_receive('get') .with_args( OWS_SEARCH, path, headers={'Content-Type': CONTENT_TYPE}) .and_return(ows_search_response)) result = ows_search.get_label_releases( account_type, account_id, search_term, page_size) assert result.status == 500 assert result.errors == { 'code': ERROR_CODE_OWS_SEARCH, 'message': ows_search_error }