import json from unittest.mock import ANY from unittest.mock import Mock from unittest.mock import patch import pytest from masters_registry.constant import bulk_tasks_const from masters_registry.constant import field_const from masters_registry.models import bulk_tasks from masters_registry.models import ownership from tests.helpers import patches def make_post(client, valid_headers, data): url = '/ownership/unlock/isrcs' valid_headers['Content-Type'] = 'application/json' return client.post(url, data=json.dumps(data), headers=valid_headers) @pytest.fixture def valid_data(): return { 'isrcs': ['ABC123456', 'DEF890123', 'ZW1010600008'], 'territories': ['AF', 'AS', 'DZ'] } @patch( 'masters_registry.models.ows_territories.get_territories', new=patches.ows_territories_get_territories_patch) @patch( 'masters_registry.models.ownership.get_existing_isrcs_in_tracks', new=patches.ownership_get_existing_isrcs_in_tracks_patch) @patch( 'masters_registry.models.ownership.get_existing_isrcs_in_active_table', new=patches.ownership_get_existing_isrcs_in_active_table_patch) def test_post_bulk_unlock_territories( monkeypatch, client, valid_headers, valid_data, feature_engine): """Test post valid data """ update_multiple_ownerships = Mock() monkeypatch.setattr( ownership, 'update_multiple_ownerships', update_multiple_ownerships) update_active_record = Mock() monkeypatch.setattr( ownership, 'update_active_record', update_active_record) update_task = Mock() monkeypatch.setattr( bulk_tasks, 'update_task', update_task) task_id = 1 create_task = Mock(return_value=task_id) monkeypatch.setattr( bulk_tasks, 'create_task', create_task) correlation_id = valid_headers[field_const.CORRELATION_ID] user = valid_headers[field_const.ORCHARD_USER_ID] isrcs = valid_data[field_const.ISRCS] isrcs_count = len(valid_data[field_const.ISRCS]) territories = set(valid_data[field_const.TERRITORIES]) expected_audit_records = [] for isrc in isrcs: record = { 'opcode': 'UNLOCK', 'timestamp': ANY, 'user': user, 'correlation_id': correlation_id, 'isrc': isrc, 'territories': territories } expected_audit_records.append(record) res = make_post(client, valid_headers, valid_data) update_multiple_ownerships_args = update_multiple_ownerships.call_args[0] update_active_record_args = update_active_record.call_args_list assert create_task.called create_task_args = create_task.call_args_list[0][0] assert create_task_args[0] == correlation_id assert create_task_args[1] == user assert create_task_args[2] == bulk_tasks_const.BULK_UNLOCK assert create_task_args[3] == isrcs_count assert sorted(create_task_args[4]) == sorted(isrcs) for args in update_active_record_args: isrc = args[0][0] to_unlock = set(args[0][1]['to_unlock']) assert isrc in isrcs assert to_unlock == territories for record in update_multiple_ownerships_args[0]: record['territories'] = set(record['territories']) assert record in expected_audit_records update_task.assert_called_once_with( task_id, bulk_tasks_const.DONE_STATUS, None ) assert res.status_code == 200