"""Patches for various services/functions.""" from datetime import datetime import decimal from flexmock import flexmock from oto import response from masters_registry.connectors import mysql from masters_registry.constant import error from masters_registry.constant import field_const TEST_TIME_AS_STR = '2017-12-01T15:00:00' TEST_TIME_AS_TIMESTAMP = decimal.Decimal('1512133200.0') TEST_TIME_AS_DATETIME = datetime.fromtimestamp(1512133200) def ownership_add_territories_patch( isrc, existing_territories, territories, tuid, correlation_id, user): return response.Response( message={'tuid': 12345, 'territories': ['MX', 'US']}) def create_ownership_patch(isrc, territories, tuid, correlation_id, user): return response.Response( message={'tuid': 12345, 'territories': ['MX', 'US']}) def ownership_remove_territories_patch( isrc, existing_territories, territories, correlation_id, user, daemon=False): return response.Response( message={'tuid': 12345, 'territories': ['MX', 'US']}) def ownership_update_ownership_patch(*args, **kwargs): return response.Response( message={'tuid': 12345, 'territories': ['MX', 'US']}) def ownership_update_ownership_nothing_updated_patch( isrc, tuid, territories_to_update, existing_territories, correlation_id, user, daemon=False, source=''): return response.Response( message={'tuid': 12345, 'territories': []}) def ownership_update_ownership_success_patch( isrc, tuid, territories_to_update, existing_territories, correlation_id, user, daemon=False, source=''): return response.Response( message={'tuid': 12345, 'territories': territories_to_update}) def ownership_update_ownership_failure_patch( isrc, territories, tuid, correlation_id, user): return response.Response( message='Failed to write data to DynamoDB', status=500) def ownership_get_ownership_patch(_): ownership_info = { field_const.ISRC: 'US4R30920517', field_const.LOCKED_TERRITORIES: { 'BE': { field_const.REASON: 'Owned by Warner' }, 'NL': { field_const.REASON: 'Owned by Warner' }, 'RU': { field_const.REASON: 'Conflict with Universal' }, 'IT': { field_const.REASON: 'Conflict with Universal' } }, field_const.TERRITORIES: { 'AF': {field_const.TUID: 111111}, 'AS': {field_const.TUID: 111111}, 'BR': {field_const.TUID: 111111}, 'CA': {field_const.TUID: 111111}, 'CH': {field_const.TUID: 111111}, 'CN': {field_const.TUID: 111111}, 'DE': {field_const.TUID: 111111}, 'ES': {field_const.TUID: 111111}, 'FR': {field_const.TUID: 111111}, 'JP': {field_const.TUID: 111111}, 'KZ': {field_const.TUID: 111111}, 'US': {field_const.TUID: 111111}, 'AR': {field_const.TUID: 23223}, 'UK': {field_const.TUID: 12345} } } return response.Response(message=ownership_info) def ownership_get_ownership_with_conflicts_patch(_): ownership_info = { field_const.ISRC: 'US4R30920517', field_const.LOCKED_TERRITORIES: {}, field_const.TERRITORIES: { 'CA': {field_const.TUID: 444}, 'MX': [{field_const.TUID: 111}], 'QA': [ {field_const.TUID: 111}, {field_const.TUID: 444}, ], 'PT': [ {field_const.TUID: 222}, {field_const.TUID: 555}, ] } } return response.Response(message=ownership_info) def ownership_get_ownership_claimed_by_another_owner_patch(): """Data to use in tests for claimed_by_another owner functionality.""" ownership_info = { field_const.ISRC: 'US4R30920517', field_const.LOCKED_TERRITORIES: {}, field_const.TERRITORIES: { 'US': {field_const.TUID: 111111} } } return response.Response(message=ownership_info) def ownership_get_ownership_same_as_carvein_patch(_): ownership_info = { field_const.ISRC: 'US4R30920517', field_const.LOCKED_TERRITORIES: { }, field_const.TERRITORIES: { 'AF': {field_const.TUID: 111111}, 'AX': {field_const.TUID: 111111}, 'AL': {field_const.TUID: 111111}, 'DE': {field_const.TUID: 111111}, 'KZ': {field_const.TUID: 111111}, 'CH': {field_const.TUID: 111111}, 'CN': {field_const.TUID: 111111}, 'JP': {field_const.TUID: 111111}, 'CA': {field_const.TUID: 111111}, 'US': {field_const.TUID: 111111}, 'AS': {field_const.TUID: 111111}, 'BR': {field_const.TUID: 111111}, 'AR': {field_const.TUID: 23223}, 'FR': {field_const.TUID: 12345}, 'ES': {field_const.TUID: 12345}, 'IT': {field_const.TUID: 12345}, 'RU': {field_const.TUID: 12345}, 'BE': {field_const.TUID: 12345}, 'NL': {field_const.TUID: 12345} } } return response.Response(message=ownership_info) def ownership_get_ownership_single_owner_patch(_): ownership_info = { field_const.ISRC: 'US4R30920517', field_const.LOCKED_TERRITORIES: {}, field_const.TERRITORIES: { 'AF': {field_const.TUID: 3333}, 'AS': {field_const.TUID: 3333}, 'BR': {field_const.TUID: 3333}, 'CA': {field_const.TUID: 3333}, } } return response.Response(message=ownership_info) def ownership_get_ownership_multi_owner_patch(_): ownership_info = { field_const.ISRC: 'US4R30920517', field_const.LOCKED_TERRITORIES: {}, field_const.TERRITORIES: { 'AF': {field_const.TUID: 3333}, 'AS': {field_const.TUID: 3333}, 'US': {field_const.TUID: 2222}, 'CA': {field_const.TUID: 3333}, } } return response.Response(message=ownership_info) def ownership_get_ownership_not_found_patch(*args): ownership_info = {} return response.Response(message=ownership_info) def ownership_get_ownership_no_territories_patch(isrc): """Patch with no territories.""" ownership_info = { field_const.ISRC: 'US4R30920517', field_const.LOCKED_TERRITORIES: { 'BE': {field_const.REASON: 'Owned by Warner'}, }, field_const.TERRITORIES: {} } return response.Response(message=ownership_info) def ownership_create_ownership_patch( isrc, territories, tuid, correlation_id, user): return response.Response({ field_const.TUID: tuid, field_const.TERRITORIES: territories }) def ownership_get_track(tuid): track = ownership_get_tracks_patch('').message.get(tuid, {}) return response.Response(message=track) def ownership_get_tracks_patch(_): message = { 111111: { field_const.VENDOR_ID: 47, field_const.SUBACCOUNT_ID: None, field_const.SUBACCOUNT_NAME: None, field_const.TUID: 111111, field_const.ISRC: 'ABC123456', field_const.RELEASE_NAME: 'Zodiac Symphony', field_const.UPC: 669910758229, field_const.TRACK_NAME: 'Taurus', field_const.ARTIST_NAME: 'Burkhard Schmidl', field_const.VENDOR_NAME: 'Amin Refaat' }, 11: { field_const.VENDOR_ID: 47, field_const.SUBACCOUNT_ID: None, field_const.SUBACCOUNT_NAME: None, field_const.TUID: 11, field_const.ISRC: 'ZW1010600008', field_const.RELEASE_NAME: 'Zodiac Symphony', field_const.UPC: 889910758229, field_const.TRACK_NAME: 'Taurus', field_const.ARTIST_NAME: 'Burkhard Schmidl', field_const.VENDOR_NAME: 'Amin Refaat' }, 23223: { field_const.VENDOR_ID: 4372, field_const.SUBACCOUNT_ID: None, field_const.SUBACCOUNT_NAME: None, field_const.TUID: 23223, field_const.ISRC: 'DEF890123', field_const.RELEASE_NAME: 'Pan-American Shindig', field_const.UPC: 669910014525, field_const.TRACK_NAME: '16 Tons', field_const.ARTIST_NAME: 'Grandsons of the Pioneers', field_const.VENDOR_NAME: 'Sam Records' }, 12345: { field_const.VENDOR_ID: 6666, field_const.SUBACCOUNT_ID: None, field_const.SUBACCOUNT_NAME: None, field_const.TUID: 12345, field_const.ISRC: 'ZW1010600008', field_const.RELEASE_NAME: 'Who Am I?', field_const.UPC: 669910011232, field_const.TRACK_NAME: 'What is my name?', field_const.ARTIST_NAME: 'Unknown', field_const.VENDOR_NAME: 'Your Records' }, 123456: { field_const.VENDOR_ID: 66, field_const.SUBACCOUNT_ID: None, field_const.SUBACCOUNT_NAME: None, field_const.TUID: 1234, field_const.ISRC: 'ZW1010600008', field_const.RELEASE_NAME: 'What is my name?', field_const.UPC: 669910011234, field_const.TRACK_NAME: 'Who Am I?', field_const.ARTIST_NAME: 'Known', field_const.VENDOR_NAME: 'My Records' }, 222: { field_const.VENDOR_ID: 22, field_const.SUBACCOUNT_ID: None, field_const.SUBACCOUNT_NAME: None, field_const.TUID: 222, field_const.ISRC: 'US1', field_const.RELEASE_NAME: 'Pan-American Shindig', field_const.UPC: 669910011232, field_const.TRACK_NAME: '17 Tons', field_const.ARTIST_NAME: 'Grandsons of the Pioneers', field_const.VENDOR_NAME: 'Sam Records' }, 321: { field_const.VENDOR_ID: 22, field_const.SUBACCOUNT_ID: None, field_const.SUBACCOUNT_NAME: None, field_const.TUID: 321, field_const.ISRC: 'US1', field_const.RELEASE_NAME: 'Pan-American Shindig', field_const.UPC: 779910011232, field_const.TRACK_NAME: '17 Tons', field_const.ARTIST_NAME: 'Grandsons of the Pioneers', field_const.VENDOR_NAME: 'Sam Records' }, 3333: { field_const.VENDOR_ID: 3333, field_const.SUBACCOUNT_ID: None, field_const.SUBACCOUNT_NAME: None, field_const.TUID: 3333, field_const.ISRC: 'US3333', field_const.RELEASE_NAME: 'Shindig', field_const.UPC: 129910011232, field_const.TRACK_NAME: '17', field_const.ARTIST_NAME: 'The Pioneers', field_const.VENDOR_NAME: 'Sam' }, 444: { field_const.VENDOR_ID: 444, field_const.SUBACCOUNT_ID: None, field_const.SUBACCOUNT_NAME: None, field_const.TUID: 444, field_const.ISRC: 'US4R30920517', field_const.RELEASE_NAME: 'Shindig', field_const.UPC: 129910011232, field_const.TRACK_NAME: '17', field_const.ARTIST_NAME: 'The Pioneers', field_const.VENDOR_NAME: 'Sam' } } return response.Response(message=message) def ownership_get_tracks_only_vendor_patch(tuids): """Patch for get_tracks that returns tuid/vendor_id mapping. This patch omits rest of fields that would normally be returned from DB. """ tracks_payload = { 11684704: {'vendor_id': 222}, 11432391: {'vendor_id': 222}, } return response.Response(tracks_payload) def ows_territories_convert_territories_patch( territories, correlation_id): message = { 'items': [{'territory_code_a2': terr} for terr in territories] } return response.Response(message=message) def ows_territories_get_territories_patch(standard, correlation_id=None): message = { 'items': [ { 'territory_code_a2': 'AF', 'territory_code_numeric': 4, 'territory_code_a3': 'AFG', 'territory_name': 'Afghanistan', 'orch_id': 17, 'standard': 'ISO_3166_1_2016'}, { 'territory_code_a2': 'AX', 'territory_code_numeric': 248, 'territory_code_a3': 'ALA', 'territory_name': 'Åland Islands', 'orch_id': 201, 'standard': 'ISO_3166_1_2016'}, { 'territory_code_a2': 'AL', 'territory_code_numeric': 8, 'territory_code_a3': 'ALB', 'territory_name': 'Albania', 'orch_id': 18, 'standard': 'ISO_3166_1_2016'}, { 'territory_code_a2': 'DZ', 'territory_code_numeric': 12, 'territory_code_a3': 'DZA', 'territory_name': 'Algeria', 'orch_id': 19, 'standard': 'ISO_3166_1_2016'}, { 'territory_code_a2': 'AS', 'territory_code_numeric': 16, 'territory_code_a3': 'ASM', 'territory_name': 'American Samoa', 'orch_id': 199, 'standard': 'ISO_3166_1_2016'}, { 'territory_code_a2': 'PL', 'territory_code_numeric': 616, 'territory_code_a3': 'POL', 'territory_name': 'Poland', 'orch_id': 142, 'standard': 'ISO_3166_1_2016'}, { 'territory_code_a2': 'IT', 'territory_code_numeric': 380, 'territory_code_a3': 'ITA', 'territory_name': 'Italy', 'orch_id': 12, 'standard': 'ISO_3166_1_2016'}, { 'territory_code_a2': 'GB', 'territory_code_numeric': 826, 'territory_code_a3': 'GBR', 'territory_name': 'United Kingdom of Great Britain and Northern Ireland', 'orch_id': 3, 'standard': 'ISO_3166_1_2016'} ], 'pagination': { 'limit': 1000, 'total_records': 5, 'offset': 0, 'type': 'standard'}} return response.Response(message=message) def ows_territories_get_territories_afghanistan_patch( standard, correlation_id=None): """Response from ows-territories. Used in functional tests for update/remove ownership endpoints. These tests use Afghanistan as test territory. """ item = { 'items': [{ 'territory_code_a3': 'AFG', 'orch_id': 17, 'continent': 'Asia', 'territory_name': 'Afghanistan', 'territory_code_numeric': 4, 'territory_code_a2': 'AF', 'standard': 'ISO_3166_1_2016' }], 'pagination': { 'limit': 1000, 'total_records': 5, 'offset': 0, 'type': 'standard' } } return response.Response(item) def ownership_get_complement_patch( territories, standard='', correlation_id=None): message = { 'pagination': { 'total_records': 248, 'offset': 0, 'limit': 1000, 'type': 'standard' }, 'items': [ { 'territory_code_a2': 'AF', 'territory_code_numeric': 4, 'territory_name': 'Afghanistan', 'standard': 'ISO_3166_1_2016', 'orch_id': 17, 'territory_code_a3': 'AFG' }, { 'territory_code_a2': 'AX', 'territory_code_numeric': 248, 'territory_name': 'Åland Islands', 'standard': 'ISO_3166_1_2016', 'orch_id': 201, 'territory_code_a3': 'ALA' }, { 'territory_code_a2': 'AL', 'territory_code_numeric': 8, 'territory_name': 'Albania', 'standard': 'ISO_3166_1_2016', 'orch_id': 18, 'territory_code_a3': 'ALB' }] } return response.Response(message=message) def ownership_get_complement_no_territories_patch( territories, standard='', correlation_id=None): """Can happen when all territories already claimed/locked.""" message = { 'pagination': { 'total_records': 248, 'offset': 0, 'limit': 1000, 'type': 'standard' }, 'items': [] } return response.Response(message=message) def ownership_get_existing_isrcs_in_tracks_patch(isrcs): return {'ABC123456', 'DEF890123', 'ZW1010600008'} def ownership_get_existing_isrcs_in_tracks_patch_for_locks(isrcs): return {'QA123'} def ownership_get_existing_isrcs_in_active_table_patch(_): ownerships_info = [ { field_const.ISRC: 'ABC123456', field_const.LOCKED_TERRITORIES: { 'BE': { field_const.REASON: 'Owned by Warner' } }, field_const.TERRITORIES: { 'CA': {field_const.TUID: 111111}, } }, { field_const.ISRC: 'DEF890123', field_const.LOCKED_TERRITORIES: { 'DE': { field_const.REASON: 'Owned by Warner' } }, field_const.TERRITORIES: { 'GB': {field_const.TUID: 222222}, 'AF': {field_const.TUID: 222222}, } }, { field_const.ISRC: 'ZW1010600008', field_const.LOCKED_TERRITORIES: { 'PL': { field_const.REASON: 'Owned by Warner' } }, field_const.TERRITORIES: { 'US': {field_const.TUID: 333333}, } }, ] return ownerships_info def ownership_get_existing_isrcs_in_active_table_one_isrc_patch(isrcs): ownerships_info = [ { field_const.ISRC: 'ZW1010600008', field_const.LOCKED_TERRITORIES: { 'PL': { field_const.REASON: 'Owned by Warner' } }, field_const.TERRITORIES: { 'US': {field_const.TUID: 333333}, } }, ] return ownerships_info def ows_carveouts_get_territory_carveout_for_upc(upc, correlation_id=None): message = { '3': 'GB', '4': 'DE', '5': 'SE' } return response.Response(message=message) def ows_carveouts_get_error_response(upc, correlation_id=None): return response.create_error_response( error.OWS_CARVEOUTS_ERROR, {'status': 'Unauthorized'}, 401) def ows_territories_get_error_response( territories, input_standard='', output_standard='', correlation_id=None): return response.create_error_response( error.OWS_TERRITORIES_ERROR, {'status': 'Not found'}, 404) def logic_bulk_tasks_get_tasks( num_records, order_by, order_direction, page_offset): tasks = [ { 'correlation_id': '54353453454', 'type': 'BULK_LOCK', 'status': 'PROCESSING', 'user_id': '1294', 'timestamp': 1473181082026.7314, 'finish_timestamp': 1473181082036.7314 } ] * 50 return response.Response(tasks[:num_records]) def logic_masters_registry_bulk_import_upcs(upcs, correlation_id, user): return response.Response({ 'correlation_id': correlation_id, 'celery_task_id': 'task_id' }) def mock_session_scope(mock_data): session_scope = flexmock( execute=lambda query, data: mock_data ) (flexmock(mysql) .should_receive('mr_session_scope') .and_return(session_scope)) def ownership_get_ownership_audit_patch(_): ownership_audit = [{ field_const.ISRC: 'US4R30920517', field_const.TIMESTAMP: 1479278230286.801, field_const.USER: 2233, field_const.OPCODE: 'LOCK', field_const.TERRITORIES: ['BE', 'NL', 'US'], field_const.CORRELATION_ID_FIELD: 'correlationid', field_const.LOCK_REASON: 'Owned by Warner' }, { field_const.ISRC: 'US4R30920517', field_const.TIMESTAMP: 1479278265286.801, field_const.USER: 2233, field_const.OPCODE: 'LOCK', field_const.TERRITORIES: ['RU', 'IT'], field_const.CORRELATION_ID_FIELD: 'correlationid', field_const.LOCK_REASON: 'Conflict with Universal' }, { field_const.ISRC: 'US4R30920517', field_const.TIMESTAMP: 1479278300286.801, field_const.USER: 'oa:2233', field_const.OPCODE: 'UNLOCK', field_const.TERRITORIES: ['US'], field_const.CORRELATION_ID_FIELD: 'correlationid' }] return response.Response(message=ownership_audit) def users_get_orchard_user_names_patch(_): users = { 2233: 'Alex Ivanov', 'oa:2233': 'Alex Ivanov', 3344: 'Sergey Petrov' } return response.Response(users) def ownership_get_lock_history_for_single_reason(reason, isrc): message = { 'created': { 'timestamp': '1974-06-14T01:55:07', 'user': 'Alex Ivanov' }, 'updated': { 'timestamp': '1984-05-13T01:52:04', 'user': 'Sergey Petrov' } } return response.Response(message=message) UPC_BY_TUID = { 3333: '83838383', 2222: '22222222' } def ownership_get_upc_by_tuid_patch(tuid): upc = UPC_BY_TUID.get(tuid, '83838383') return response.Response( message={ field_const.UPC: upc } ) def ownership_get_upc_by_tuid_error_patch(tuid): return response.create_fatal_response() def ownership_get_isrcs_bulk_import_patch(*args): message = { '886788771130': [ { 'release_status': 'in_content', 'tuid': 11, 'deletions': 'N', 'upc': '886788771130', 'track_name': 'Test', 'isrc': 'USA371690671', 'vendor_id': 9, }, { 'release_status': 'in_content', 'tuid': 12345, 'deletions': 'N', 'upc': '886788771130', 'track_name': 'Test 2', 'isrc': 'USA371690672', 'vendor_id': 9, } ], '767767806329': [ { 'release_status': 'in_content', 'tuid': 789, 'deletions': 'Y', 'upc': '767767806329', 'track_name': 'Te Seguire Amando', 'isrc': 'USJTQ1109709', 'vendor_id': 9, }, { 'release_status': 'in_content', 'tuid': 7891, 'deletions': 'Y', 'upc': '767767806329', 'track_name': 'Te Seguire Amando 2', 'isrc': 'USJTQ1109710', 'vendor_id': 9, }, ] } return response.Response(message=message) def ownership_get_upc_by_tuid_functional_tests_patch(tuid): """Patch used in functional tests of update/remove ownership endpoints.""" payload = {'upc': 5055532533385} return response.Response(payload) def ows_carveouts_get_dms_carveout_for_upc_store_carved_out_patch( upc, correlation_id=None): return response.Response({ 'store': { '453': {'dms_name': 'YouTube', 'distros': ['1', '2']} }, 'substore': [] }) def ows_carveouts_get_carveout_without_full_track_distro( upc, correlation_id=None): return response.Response({ 'store': { '453': {'dms_name': 'YouTube', 'distros': ['2']} }, 'substore': [], 'territory': { 142: 'PL' } }) def ows_carveouts_get_dms_carveout_for_upc_substore_patch( upc, correlation_id=None): return response.Response({ 'store': [], 'substore': { '453': { '2': 'CA'}} }) def ows_carveouts_get_dms_carveout_for_upc_not_carved_out_patch( upc, correlation_id=None): return response.Response({ 'store': [], 'substore': [] }) UPC_SUBSTORE_CARVEOUTS = { '83838383': { 'store': [], 'substore': { '453': { '2': 'CA' } } }, '22222222': { 'store': [], 'substore': { '453': { '1': 'US' } } } } def get_dms_carveout_for_upc_substore_carved_out_patch( upc, correlation_id=None): data = UPC_SUBSTORE_CARVEOUTS.get(upc) if not data: data = UPC_SUBSTORE_CARVEOUTS['83838383'] return response.Response(data) def get_dms_carveout_for_upc_store_substore_carved_out_patch( upc, correlation_id=None): return response.Response({ 'store': { '453': {'dms_name': 'YouTube', 'distros': ['1', '2']} }, 'substore': { '453': { '2': 'CA' } } }) def ows_carveouts_get_dms_carveout_failed_patch(upc, correlation_id=None): return response.create_fatal_response() def ows_carveouts_get_dms_carveout_error_patch(upc, correlation_id=None): """Get error with custom code.""" return response.create_error_response( code=error.OWS_CARVEOUTS_ERROR, message='Error calling ows-carveouts microservice') def masters_registry_is_valid_territories(territories): return response.Response(territories) def dynamodb_batch_get_item_response(**kwargs): """Response from dynamodb with multiple items.""" payload = { 'ResponseMetadata': { 'HTTPHeaders': {}, 'HTTPStatusCode': 200, 'RequestId': '', 'RetryAttempts': 0}, 'Responses': { 'test-masters_active': [ {'isrc': 'QA123', 'locked_territories': {}, 'territories': { 'AF': [{'tuid': decimal.Decimal('123')}]}, 'timestamp': decimal.Decimal('1489012800631.612'), 'updated_timestamp': decimal.Decimal('1514980909.436671')}] }, 'UnprocessedKeys': {} } return payload def tracks_response_with_conflict_patch(tuids): """Information from AR database with internal conflict.""" return response.Response({ 11684704: {'vendor_id': 222}, 11432391: {'vendor_id': 333}, }) def db_empty_response(isrc): return response.Response( message=None )