"""Functional tests for put a track lyrics. Test endpoint: PUT /tracks//lyrics """ import datetime import json from oto import status as http_status import pytest from tests.factories import lyrics_factory from tests.test_utils import db authorization_header = {'Authorization': 'ows-track/ows-lyrics:randomhmac123'} blank_authorization_header = {'Authorization': ''} @db.test_schema @pytest.mark.parametrize( 'headers, response_status, response_data', ((authorization_header, http_status.OK, { 'track_id': 42, 'lyrics': 'lalala', }), ({}, http_status.FORBIDDEN, {'code': 'authorization_error', 'message': 'user is forbidden'} ), (blank_authorization_header, http_status.FORBIDDEN, {'code': 'authorization_error', 'message': 'user is forbidden'}))) def test_put_lyrics_success( client, client_headers, authorization_mock, headers, response_status, response_data): """Check that put lyrics works.""" lyrics = 'lalala' track_id = 42 body = {'lyrics': lyrics} client_headers.update(headers) response = client.put( 'tracks/{}/lyrics'.format(track_id), headers=client_headers, data=json.dumps(body)) assert response.status_code == response_status if response.status_code == http_status.OK: response = client.get( 'tracks/{}/lyrics'.format(track_id), headers=headers) assert response.status_code == 200 data = json.loads(response.data.decode()) assert data == { 'track_id': track_id, 'lyrics': lyrics, } else: data = json.loads(response.data.decode()) assert data == response_data @db.test_schema @pytest.mark.parametrize( 'headers, response_status, response_data', ((authorization_header, http_status.OK, { 'track_id': 42, 'lyrics': 'nanana', }), ({}, http_status.FORBIDDEN, {'code': 'authorization_error', 'message': 'user is forbidden'}))) def test_put_lyrics_already_exist( client, client_headers, authorization_mock, headers, response_status, response_data): """Check that put lyrics works when it is already exists.""" old_lyrics = 'lalala' new_lyrics = 'nanana' track_id = 42 body = {'lyrics': new_lyrics} lyrics_obj = lyrics_factory.LyricsFactory( entity_id=track_id, description=old_lyrics) db.seed_models([lyrics_obj]) client_headers.update(headers) response = client.put( 'tracks/{}/lyrics'.format(track_id), headers=client_headers, data=json.dumps(body)) assert response.status_code == response_status if response.status_code == http_status.OK: response = client.get( 'tracks/{}/lyrics'.format(track_id), headers=headers) assert response.status_code == 200 data = json.loads(response.data.decode()) assert data == response_data @pytest.mark.parametrize( 'headers, response_status, response_message', ((authorization_header, http_status.BAD_REQUEST, 'GRASS requests are forbidden'), ({}, http_status.FORBIDDEN, 'user is forbidden'))) def test_put_lyrics_grass( client, grass_headers, authorization_mock, headers, response_status, response_message): """Check that endpoint is not accessible via GRASS.""" grass_headers.update(headers) response = client.put('tracks/{}/lyrics'.format(11), headers=grass_headers) assert response.status_code == response_status data = json.loads(response.data.decode()) assert data['message'] == response_message @pytest.mark.parametrize( 'headers, response_status, response_message', ((authorization_header, http_status.BAD_REQUEST, {'lyrics': ['Missing data for required field.']}), ({}, http_status.FORBIDDEN, 'user is forbidden'))) def test_put_tracks_lyrics_validation( client, client_headers, authorization_mock, headers, response_status, response_message): """Check that put lyrics validation works.""" body = { 'tuids': 'str' } client_headers.update(headers) response = client.put( 'tracks/{}/lyrics'.format(11), headers=client_headers, data=json.dumps(body)) assert response.status_code == response_status data = json.loads(response.data.decode()) assert data['message'] == response_message @pytest.mark.parametrize( 'headers, response_status, response_data', ((authorization_header, http_status.OK, { 'track_id': 42, 'lyrics': 'lalala', }), ({}, http_status.FORBIDDEN, {'code': 'authorization_error', 'message': 'user is forbidden'}))) @db.test_schema def test_put_lyrics_multiple_records( client, client_headers, authorization_mock, headers, response_status, response_data): """Check that put lyrics works with multiple records.""" lyrics = 'lalala' track_id = 42 now = datetime.datetime.now() db.seed_models([ lyrics_factory.LyricsFactory( entity_id=track_id, description='nanana', last_updated=(now - datetime.timedelta(hours=1))), lyrics_factory.LyricsFactory( entity_id=track_id, description=lyrics, last_updated=now) ]) body = {'lyrics': lyrics} client_headers.update(headers) response = client.put( 'tracks/{}/lyrics'.format(track_id), headers=client_headers, data=json.dumps(body)) assert response.status_code == response_status if response.status_code == 200: response = client.get( 'tracks/{}/lyrics'.format(track_id), headers=headers) assert response.status_code == 200 data = json.loads(response.data.decode()) assert data == response_data