"""Functional tests for creating tracks. Test endpoint: PUT /product//tracks """ import json from unittest.mock import MagicMock from oto import status as response_code import pytest from tests.testutils import db @db.test_schema_no_seed def test_create_tracks_with_metadata_track_numbers_auto( mock_app, client_create_tracks_with_metadata, mocker, track_factory): """Test PUT tracks is successful.""" product_id = 12345 track_1 = track_factory( track_name='Track 1_1', product_id=product_id).to_dict() track_2 = track_factory( track_name='Track 1_2', product_id=product_id).to_dict() for track in track_1, track_2: del track['tuid'] del track['volume_number'] del track['track_number'] # Set to None because the when we bulk create these tracks # the tracks don't have a language set thus the expected # response should be track data with a None language object track['language'] = None track_1['artists'] = [{ 'name': 'Seminaarinmäen Mieslaulajat', 'type': 'performer', }] create_data = { 'tracks': [ track_1, track_2 ] } message = {'upc': 123456789012, 'vendor_id': 100, 'product_id': 12345} get_response = MagicMock(status=200, message=message) mocker.patch('backend.models.ows_product._get_from_ows_product_service', return_value=get_response) expected_response = { 'items': [ dict(track_1, tuid=1, volume_number=1, track_number=1), dict(track_2, tuid=2, volume_number=1, track_number=2) ], 'pagination': {'total_records': 2, 'type': 'none'} } expected_response['items'][0]['artists'][0]['track_artist_id'] = 1 expected_response['items'][0]['artists'][0]['artist_info_id'] = None res = client_create_tracks_with_metadata(12345, create_data) res_body = json.loads(res.data.decode()) assert res.status_code == response_code.OK assert res_body == expected_response @db.test_schema_no_seed def test_create_tracks_with_metadata_track_numbers_set( mock_app, client_create_tracks_with_metadata, mocker, track_factory): """Test PUT tracks is successful.""" product_id = 12345 track_1 = track_factory( track_name='Track 1_2', product_id=product_id, track_number=2, volume_number=1).to_dict() track_2 = track_factory( track_name='Track 1_3', product_id=product_id, track_number=3, volume_number=1).to_dict() track_3 = track_factory( track_name='Track 1_1', product_id=product_id, track_number=1, volume_number=1).to_dict() for track in [track_1, track_2, track_3]: del track['tuid'] # Set to None because the when we bulk create these tracks # the tracks don't have a language set thus the expected # response should be track data with a None language object track['language'] = None create_data = { 'tracks': [ track_1, track_2, track_3 ] } message = {'upc': 123456789012, 'vendor_id': 100, 'product_id': 12345} get_response = MagicMock(status=200, message=message) mocker.patch('backend.models.ows_product._get_from_ows_product_service', return_value=get_response) expected_response = { 'items': [ dict(track_1, tuid=1), dict(track_2, tuid=2), dict(track_3, tuid=3) ], 'pagination': {'total_records': 3, 'type': 'none'} } res = client_create_tracks_with_metadata(12345, create_data) res_body = json.loads(res.data.decode()) assert res.status_code == response_code.OK assert res_body == expected_response @pytest.mark.parametrize('missing_field', [ 'track_name', 'meta_language_code', 'version', 'p_info', 'explicit', 'ownership_rights', 'recording_country_id', 'original_rights_holder_country_id' ]) @db.test_schema_no_seed def test_create_tracks_with_metadata_missing_field( client_create_tracks_with_metadata, mocker, track_factory, missing_field ): """Test PUT tracks is successful.""" product_id = 12345 track_1 = track_factory( track_name='Track 1', product_id=product_id).to_dict() del track_1['tuid'] del track_1[missing_field] create_data = { 'tracks': [ track_1, ] } message = {'upc': 123456789012, 'vendor_id': 100, 'product_id': 12345} get_response = MagicMock(status=200, message=message) mocker.patch('backend.models.ows_product._get_from_ows_product_service', return_value=get_response) res = client_create_tracks_with_metadata(12345, create_data) res_body = json.loads(res.data.decode()) assert res.status_code == response_code.BAD_REQUEST assert missing_field in res_body['message']['tracks']['0']