"""Functional tests for importing existing tracks. Test endpoint: POST /product//tracks/import """ import datetime import json from oto import response from oto import status as response_code from backend.connectors import mysql from backend.models import ows_lyrics from backend.models import track_audit from tests.testutils import db from tests.testutils import mocks @db.test_schema_no_seed def test_import_tracks( mocker, client_import_tracks, tds_copy_localization_single_track_no_artist): """Test import track is successful.""" tds = tds_copy_localization_single_track_no_artist _test_import_tracks(mocker, client_import_tracks, tds) @db.test_schema_no_seed def test_import_tracks_with_artists( mocker, client_import_tracks, tds_copy_localization_single_track_with_artists): """Test import track is successful.""" tds = tds_copy_localization_single_track_with_artists _test_import_tracks(mocker, client_import_tracks, tds) @db.test_schema_no_seed def test_import_tracks_threading( mocker, client_import_tracks, tds_copy_localization_single_track_no_artist): """Make sure calls to ows-asset are non-blocking.""" tds = tds_copy_localization_single_track_no_artist mocks.ows_assets_copy_assets(mocker, sleep_seconds=10) _test_import_tracks( mocker, client_import_tracks, tds, mock_copy_assets=False) def _test_import_tracks( mocker, client_import_tracks, tds, mock_copy_assets=True): """Generic test for track with multiple localizations.""" db.merge_model_objects(tds['seed_data']) mocks.ows_product_update_track_localizations(mocker) mocks.ows_product_get_track_localizations( mocker, tds['source_localizations']) mocker.patch.object( ows_lyrics, 'copy_tracks_lyrics', return_value=response.Response()) if mock_copy_assets: mocks.ows_assets_copy_assets(mocker) mocks.ows_product_get_product_by_id( mocker, tds['destination_product_id'], tds['destination_product_upc']) res = client_import_tracks( product_id=tds['destination_product_id'], tuids=tds['tuids']) response_json = json.loads(res.data.decode()) assert res.status_code == response_code.OK tds['validate_copied_track']( response_json['items'][0], validate_logical=True) @db.test_schema_no_seed def test_import_tracks_copy_asset_failed( mocker, client_import_tracks, tds_copy_localization_single_track_no_artist, copy_assets_failed_response): """Verify track import still works if copy assets failed.""" tds = tds_copy_localization_single_track_no_artist mocks.ows_assets_copy_assets(mocker, response=copy_assets_failed_response) _test_import_tracks( mocker, client_import_tracks, tds, mock_copy_assets=False) @db.test_schema_no_seed def test_import_tracks_saves_log( mocker, client_import_tracks, tds_copy_localization_single_track_no_artist): """Test import track saves log.""" tds = tds_copy_localization_single_track_no_artist _test_import_tracks(mocker, client_import_tracks, tds) with mysql.ows_track_db_session() as session: log_entries = session.query(track_audit.TrackAudit).all() log_entries = [entry.to_dict() for entry in log_entries] assert len(log_entries) == 1 expected_entry = { 'record_id': 1, 'source_tuid': 1, 'destination_tuid': 2, 'source_product_id': 1, 'destination_product_id': 2, 'orchard_user_id': 'alw:123', 'action': 'import', 'created_date': datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M'), 'audit_metadata': None } entry = log_entries[0] entry['created_date'] = entry['created_date'].strftime('%Y-%m-%d %H:%M') assert entry == expected_entry @db.test_schema def test_import_tracks_one_failed( mocker, client_import_tracks, test_product_id, test_upc): """Test import multiple tracks one failed.""" mocks.ows_assets_copy_assets(mocker) mocks.ows_product_get_product_by_id( mocker, test_product_id, test_upc) res = client_import_tracks( product_id=test_product_id, tuids=[10, 9999]) assert res.status_code == response_code.NOT_FOUND