diff --git a/connect_ext_ppr/constants.py b/connect_ext_ppr/constants.py index cf6f80d..813d30c 100644 --- a/connect_ext_ppr/constants.py +++ b/connect_ext_ppr/constants.py @@ -528,6 +528,7 @@ } PPR_FILE_NAME = "PPR_{product_id}_v{version}_{timestamp}.xlsx" PPR_FILE_NAME_DELEGATION_L2 = "{dr_id}-L2Delegation-{ppr_id}-{timestamp}.xlsx" +PPR_FILE_NAME_UPDATE_MARKETPLACES = "{dr_id}-MkplUpdate-{ppr_id}-{timestamp}.xlsx" DESCRIPTION_TEMPLATE = """ **Description** {description} diff --git a/connect_ext_ppr/tasks_manager.py b/connect_ext_ppr/tasks_manager.py index 75245b6..e89a3ea 100644 --- a/connect_ext_ppr/tasks_manager.py +++ b/connect_ext_ppr/tasks_manager.py @@ -5,8 +5,9 @@ from sqlalchemy.orm import joinedload, selectinload from connect_ext_ppr.client.exception import ClientError -from connect_ext_ppr.constants import PPR_FILE_NAME_DELEGATION_L2 +from connect_ext_ppr.constants import PPR_FILE_NAME_DELEGATION_L2, PPR_FILE_NAME_UPDATE_MARKETPLACES from connect_ext_ppr.db import get_cbc_extension_db, get_db_ctx_manager +from connect_ext_ppr.models.configuration import Configuration from connect_ext_ppr.models.enums import CBCTaskLogStatus from connect_ext_ppr.models.enums import ( DeploymentRequestStatusChoices, @@ -14,7 +15,7 @@ TasksStatusChoices, TaskTypesChoices, ) -from connect_ext_ppr.models.deployment import DeploymentRequest +from connect_ext_ppr.models.deployment import DeploymentRequest, MarketplaceConfiguration from connect_ext_ppr.models.ppr import PPRVersion from connect_ext_ppr.models.task import Task from connect_ext_ppr.services.cbc_extension import get_hub_credentials @@ -22,8 +23,11 @@ from connect_ext_ppr.utils import ( create_dr_file_to_media, get_base_workbook, + get_configuration_from_media, get_file_size, + get_mps_to_update_for_apply_ppr_and_delegate_to_marketplaces, get_ppr_from_media, + process_ppr_file_for_apply_ppr_and_delegate_to_marketplaces, process_ppr_file_for_delelegate_l2, ) @@ -97,6 +101,7 @@ def prepare_ppr_file_for_task( deployment_request, deployment, process_func, + **process_args, ): file, writer, wb = get_base_workbook(file_data) @@ -104,7 +109,7 @@ def prepare_ppr_file_for_task( ws_list = [] for sheet_name in wb.sheet_names: ws = wb.parse(sheet_name) - process_func(sheet_name, ws) + process_func(sheet_name, ws, **process_args) ws.name = sheet_name ws_list.append(ws) @@ -133,6 +138,8 @@ def prepare_ppr_file_for_task( except (FileNotFoundError, ValueError, KeyError) as e: raise TaskException(f'Error while processing PPR file: {e}') + except ClientError as e: + raise TaskException(f'Error while connecting to Connect: {e.message}') def check_and_update_product(deployment_request, cbc_service, **kwargs): @@ -158,7 +165,75 @@ def check_and_update_product(deployment_request, cbc_service, **kwargs): return True -def apply_ppr_and_delegate_to_marketplaces(deployment_request, **kwargs): +def apply_ppr_and_delegate_to_marketplaces( + deployment_request, + cbc_service, + connect_client, + db, + **kwargs, +): + dr_marketplaces = db.query(MarketplaceConfiguration).filter_by( + active=True, + deployment_request_id=deployment_request.id, + ).all() + dep_marketplaces = db.query(MarketplaceConfiguration).filter_by( + active=True, + deployment_id=deployment_request.deployment_id, + ).filter( + MarketplaceConfiguration.marketplace.in_([m.marketplace for m in dr_marketplaces]), + ).all() + marketplaces_to_update_dict = {m.marketplace: None for m in dr_marketplaces} + + if not deployment_request.manually: + ppr_file_id = deployment_request.ppr.file + deployment = deployment_request.deployment + configuration = ( + db.query(Configuration) + .filter_by( + deployment=deployment.id, + state=Configuration.STATE.active, + ) + .one_or_none() + ) + try: + file_data = get_ppr_from_media( + connect_client, + deployment.account_id, + deployment.id, + ppr_file_id, + ) + config_json = get_configuration_from_media( + connect_client, deployment.account_id, deployment.id, configuration.file, + ) + except ClientError as e: + raise TaskException(f'Error while connecting to Connect: {e.message}') + + marketplaces_to_update_dict = get_mps_to_update_for_apply_ppr_and_delegate_to_marketplaces( + ppr_file_data=file_data, + config_json=config_json, + dr_marketplaces=dr_marketplaces, + ) + + file = prepare_ppr_file_for_task( + connect_client=connect_client, + file_data=file_data, + file_name_template=PPR_FILE_NAME_UPDATE_MARKETPLACES, + deployment_request=deployment_request, + deployment=deployment, + process_func=process_ppr_file_for_apply_ppr_and_delegate_to_marketplaces, + columns_to_set_false=marketplaces_to_update_dict.values(), + ) + + tracking_id = _send_ppr(cbc_service, file) + file.close() + _check_cbc_task_status(cbc_service, tracking_id) + + for marketplace in dr_marketplaces + dep_marketplaces: + if marketplace.marketplace in marketplaces_to_update_dict: + marketplace.ppr_id = deployment_request.ppr_id + db.add(marketplace) + + db.commit() return True @@ -168,12 +243,15 @@ def delegate_to_l2(deployment_request, cbc_service, connect_client, **kwargs): ppr_file_id = deployment_request.ppr.file deployment = deployment_request.deployment - file_data = get_ppr_from_media( - connect_client, - deployment.account_id, - deployment.id, - ppr_file_id, - ) + try: + file_data = get_ppr_from_media( + connect_client, + deployment.account_id, + deployment.id, + ppr_file_id, + ) + except ClientError as e: + raise TaskException(f'Error while connecting to Connect: {e.message}') file = prepare_ppr_file_for_task( connect_client=connect_client, @@ -213,6 +291,7 @@ def execute_tasks(db, config, tasks, connect_client): deployment_request=task.deployment_request, cbc_service=cbc_service, connect_client=connect_client, + db=db, ) task.status = TasksStatusChoices.done if not was_succesfull: diff --git a/connect_ext_ppr/utils.py b/connect_ext_ppr/utils.py index de6bd04..76b9488 100644 --- a/connect_ext_ppr/utils.py +++ b/connect_ext_ppr/utils.py @@ -1,3 +1,4 @@ +import re from collections import defaultdict from functools import partial from io import BytesIO @@ -660,3 +661,55 @@ def process_ppr_file_for_delelegate_l2(sheet_name, ws): ws['Published'] = 'TRUE' elif sheet_name == 'ServicePlans': ws['Published'] = 'FALSE' + + +def get_mps_to_update_for_apply_ppr_and_delegate_to_marketplaces( + ppr_file_data, + config_json, + dr_marketplaces, +): + wb = pd.ExcelFile(ppr_file_data) + ws = wb.parse('ServicePlans') + + marketplace_mapping = config_json.get('marketplace_mapping', {}) + cbc_marketplace_ids_dict = {} + for dr_marketplace in dr_marketplaces: + if cbc_marketplace_id := marketplace_mapping.get(dr_marketplace.marketplace): + cbc_marketplace_ids_dict[cbc_marketplace_id] = dr_marketplace.marketplace + + cbc_mp_ids_found = set() + for col in ws.columns.tolist(): + if re.match(r'^OpUnit_[A-Z]{2}$', col): + cbc_marketplace_id = col.split('_')[1] + cbc_mp_ids_found.add(cbc_marketplace_id) + + marketplaces_to_update_dict = { + cbc_marketplace_ids_dict[cbc_id]: f'OpUnit_{cbc_id}' for cbc_id in cbc_marketplace_ids_dict + if cbc_id in cbc_mp_ids_found + } + # {'MP-06811': 'OpUnit_DE', ...} + return marketplaces_to_update_dict + + +def process_service_plans_for_apply_ppr_and_delegate_to_marketplaces( + ws, + columns_to_set_false, +): + for col in ws.columns.tolist(): + if re.match(r'^OpUnit_[A-Z]{2}$', col) and col not in columns_to_set_false: + ws[col] = 'FALSE' + + +def process_ppr_file_for_apply_ppr_and_delegate_to_marketplaces( + sheet_name, + ws, + columns_to_set_false, +): + if sheet_name == 'ServicePlans': + process_service_plans_for_apply_ppr_and_delegate_to_marketplaces( + ws, + columns_to_set_false, + ) + + elif sheet_name == 'OpUnitServicePlans': + ws['Published'] = 'FALSE' diff --git a/tests/fixtures/test_PPR_file_delegate_l2.xlsx b/tests/fixtures/test_PPR_file_delegate_l2.xlsx index 7dc3328..e5d7262 100644 Binary files a/tests/fixtures/test_PPR_file_delegate_l2.xlsx and b/tests/fixtures/test_PPR_file_delegate_l2.xlsx differ diff --git a/tests/test_tasks_manager.py b/tests/test_tasks_manager.py index 4f7e4c9..0d566ee 100644 --- a/tests/test_tasks_manager.py +++ b/tests/test_tasks_manager.py @@ -1,10 +1,12 @@ import copy +import json from io import BufferedReader import pytest from unittest.mock import patch +from requests import Response from sqlalchemy import null from connect_ext_ppr.models.deployment import Deployment, DeploymentRequest @@ -31,8 +33,521 @@ from tests.test_utils import check_excel_file_column_values -def test_apply_ppr_and_delegate_to_marketplaces(deployment_request_factory): - assert apply_ppr_and_delegate_to_marketplaces(deployment_request_factory()) +@patch.object(CBCService, '__init__', return_value=None) +def test_apply_ppr_and_delegate_to_marketplaces( + _, + dbsession, + deployment_request_factory, + deployment_factory, + marketplace_config_factory, + ppr_version_factory, + configuration_factory, + connect_client, + mocker, +): + ppr_file_data = open('./tests/fixtures/test_PPR_apply_to_marketplaces.xlsx', 'rb').read() + ppr_config_file_data = json.load(open('./tests/fixtures/test_PPR_config_file.json')) + + assert not check_excel_file_column_values( + ppr_file_data, 'OpUnitServicePlans', 'Published', [False] * 4, + ) + file_sent = null + + def send_ppr_side_effect(*args): + nonlocal file_sent + file_sent = args[1].read() + + send_ppr_mock = mocker.patch( + 'connect_ext_ppr.tasks_manager._send_ppr', + return_value=101, + side_effect=send_ppr_side_effect, + ) + get_config_from_media_mock = mocker.patch( + 'connect_ext_ppr.tasks_manager.get_configuration_from_media', + return_value=ppr_config_file_data, + ) + + get_ppr_from_media_mock = mocker.patch( + 'connect_ext_ppr.tasks_manager.get_ppr_from_media', + return_value=ppr_file_data, + ) + + create_dr_file_to_media_mock = mocker.patch( + 'connect_ext_ppr.tasks_manager.create_dr_file_to_media', + ) + check_cbc_task_status_mock = mocker.patch( + 'connect_ext_ppr.tasks_manager._check_cbc_task_status', + ) + + cbc_service = CBCService() + dep = deployment_factory() + configuration_factory(deployment=dep.id) + ppr = ppr_version_factory(deployment=dep) + ppr2 = ppr_version_factory(deployment=dep) + dr = deployment_request_factory(deployment=dep, ppr=ppr2) + + dep_m1 = marketplace_config_factory(deployment=dep, marketplace_id='MP-123') + dep_m2 = marketplace_config_factory(deployment=dep, marketplace_id='MP-124', ppr_id=ppr.id) + dep_m3 = marketplace_config_factory(deployment=dep, marketplace_id='MP-125', ppr_id=ppr.id) + + # Mapping marketplaces Connect => CBC + # "MP-123": "CO" + # "MP-124": "AT" + # "MP-125": "US" + + dr_m1 = marketplace_config_factory(deployment_request=dr, marketplace_id='MP-123') + dr_m2 = marketplace_config_factory(deployment_request=dr, marketplace_id='MP-124') + + assert apply_ppr_and_delegate_to_marketplaces(dr, cbc_service, connect_client, dbsession) + + dbsession.refresh(dr_m1) + dbsession.refresh(dr_m2) + dbsession.refresh(dep_m1) + dbsession.refresh(dep_m2) + dbsession.refresh(dep_m3) + + assert dr_m1.ppr_id == ppr2.id + assert dr_m2.ppr_id == ppr2.id + assert dep_m1.ppr_id == ppr2.id + assert dep_m2.ppr_id == ppr2.id + assert dep_m3.ppr_id == ppr.id + + assert get_config_from_media_mock.call_count == 1 + assert get_ppr_from_media_mock.call_count == 1 + assert create_dr_file_to_media_mock.call_count == 1 + assert send_ppr_mock.call_count == 1 + assert check_cbc_task_status_mock.call_count == 1 + + assert send_ppr_mock.call_args.args[0] == cbc_service + ppr_file_arg = send_ppr_mock.call_args.args[1] + assert isinstance(ppr_file_arg, BufferedReader) + assert check_excel_file_column_values(file_sent, 'OpUnitServicePlans', 'Published', [False] * 4) + assert check_excel_file_column_values( + file_sent, 'ServicePlans', 'Published', [False, True, False, True, True, True], + ) + assert check_excel_file_column_values( + file_sent, 'ServicePlans', 'OpUnit_CO', [True, True, True, False, False, False], + ) + assert check_excel_file_column_values( + file_sent, 'ServicePlans', 'OpUnit_AT', [True, True, True, False, False, False], + ) + assert check_excel_file_column_values( + file_sent, 'ServicePlans', 'OpUnit_US', [False] * 6, + ) + + +@patch.object(CBCService, '__init__', return_value=None) +def test_apply_ppr_and_delegate_to_marketplaces_manually( + _, + dbsession, + deployment_request_factory, + deployment_factory, + marketplace_config_factory, + ppr_version_factory, + connect_client, + mocker, +): + + get_from_media_mock = mocker.patch('connect_ext_ppr.tasks_manager.get_ppr_from_media') + create_dr_file_to_media_mock = mocker.patch( + 'connect_ext_ppr.tasks_manager.create_dr_file_to_media', + ) + check_cbc_task_status_mock = mocker.patch( + 'connect_ext_ppr.tasks_manager._check_cbc_task_status', + ) + + dep = deployment_factory() + ppr = ppr_version_factory(deployment=dep) + ppr2 = ppr_version_factory(deployment=dep) + dr = deployment_request_factory(deployment=dep, ppr=ppr2, manually=True) + + dep_m1 = marketplace_config_factory(deployment=dep, marketplace_id='MP-124') + dep_m2 = marketplace_config_factory(deployment=dep, marketplace_id='MP-123', ppr_id=ppr.id) + dep_m3 = marketplace_config_factory(deployment=dep, marketplace_id='MP-125', ppr_id=ppr.id) + + dr_m1 = marketplace_config_factory(deployment_request=dr, marketplace_id='MP-124') + dr_m2 = marketplace_config_factory(deployment_request=dr, marketplace_id='MP-123') + + assert apply_ppr_and_delegate_to_marketplaces(dr, CBCService(), connect_client, dbsession) + + dbsession.refresh(dr_m1) + dbsession.refresh(dr_m2) + dbsession.refresh(dep_m1) + dbsession.refresh(dep_m2) + dbsession.refresh(dep_m3) + + assert dr_m1.ppr_id == ppr2.id + assert dr_m2.ppr_id == ppr2.id + assert dep_m1.ppr_id == ppr2.id + assert dep_m2.ppr_id == ppr2.id + assert dep_m3.ppr_id == ppr.id + + assert get_from_media_mock.call_count == 0 + assert create_dr_file_to_media_mock.call_count == 0 + assert check_cbc_task_status_mock.call_count == 0 + + +@patch.object(CBCService, '__init__', return_value=None) +def test_apply_ppr_and_delegate_to_marketplaces_w_marketplace_not_present_in_mapping( + _, + dbsession, + deployment_request_factory, + deployment_factory, + marketplace_config_factory, + ppr_version_factory, + configuration_factory, + connect_client, + mocker, +): + ppr_file_data = open('./tests/fixtures/test_PPR_apply_to_marketplaces.xlsx', 'rb').read() + ppr_config_file_data = json.load(open('./tests/fixtures/test_PPR_config_file.json')) + + assert not check_excel_file_column_values( + ppr_file_data, 'OpUnitServicePlans', 'Published', [False] * 4, + ) + file_sent = null + + def send_ppr_side_effect(*args): + nonlocal file_sent + file_sent = args[1].read() + + send_ppr_mock = mocker.patch( + 'connect_ext_ppr.tasks_manager._send_ppr', + return_value=101, + side_effect=send_ppr_side_effect, + ) + get_config_from_media_mock = mocker.patch( + 'connect_ext_ppr.tasks_manager.get_configuration_from_media', + return_value=ppr_config_file_data, + ) + + get_ppr_from_media_mock = mocker.patch( + 'connect_ext_ppr.tasks_manager.get_ppr_from_media', + return_value=ppr_file_data, + ) + + create_dr_file_to_media_mock = mocker.patch( + 'connect_ext_ppr.tasks_manager.create_dr_file_to_media', + ) + check_cbc_task_status_mock = mocker.patch( + 'connect_ext_ppr.tasks_manager._check_cbc_task_status', + ) + + cbc_service = CBCService() + dep = deployment_factory() + configuration_factory(deployment=dep.id) + ppr = ppr_version_factory(deployment=dep) + ppr2 = ppr_version_factory(deployment=dep) + dr = deployment_request_factory(deployment=dep, ppr=ppr2) + + dep_m1 = marketplace_config_factory(deployment=dep, marketplace_id='MP-123') + dep_m2 = marketplace_config_factory(deployment=dep, marketplace_id='MP-124', ppr_id=ppr.id) + dep_m3 = marketplace_config_factory(deployment=dep, marketplace_id='MP-125', ppr_id=ppr.id) + marketplace_config_factory(deployment=dep, marketplace_id='MP-126') + + # Mapping marketplaces Connect => CBC + # "MP-123": "CO" + # "MP-124": "AT" + # "MP-125": "US" + + dr_m1 = marketplace_config_factory(deployment_request=dr, marketplace_id='MP-123') + dr_m2 = marketplace_config_factory(deployment_request=dr, marketplace_id='MP-124') + dr_m3 = marketplace_config_factory(deployment_request=dr, marketplace_id='MP-126') + + assert apply_ppr_and_delegate_to_marketplaces(dr, cbc_service, connect_client, dbsession) + + dbsession.refresh(dr_m1) + dbsession.refresh(dr_m2) + dbsession.refresh(dr_m3) + dbsession.refresh(dep_m1) + dbsession.refresh(dep_m2) + dbsession.refresh(dep_m3) + + assert dr_m1.ppr_id == ppr2.id + assert dr_m2.ppr_id == ppr2.id + assert dr_m3.ppr_id is None + assert dep_m1.ppr_id == ppr2.id + assert dep_m2.ppr_id == ppr2.id + assert dep_m3.ppr_id == ppr.id + + assert get_config_from_media_mock.call_count == 1 + assert get_ppr_from_media_mock.call_count == 1 + assert create_dr_file_to_media_mock.call_count == 1 + assert send_ppr_mock.call_count == 1 + assert check_cbc_task_status_mock.call_count == 1 + + assert send_ppr_mock.call_args.args[0] == cbc_service + ppr_file_arg = send_ppr_mock.call_args.args[1] + assert isinstance(ppr_file_arg, BufferedReader) + assert check_excel_file_column_values(file_sent, 'OpUnitServicePlans', 'Published', [False] * 4) + assert check_excel_file_column_values( + file_sent, 'ServicePlans', 'Published', [False, True, False, True, True, True], + ) + assert check_excel_file_column_values( + file_sent, 'ServicePlans', 'OpUnit_CO', [True, True, True, False, False, False], + ) + assert check_excel_file_column_values( + file_sent, 'ServicePlans', 'OpUnit_AT', [True, True, True, False, False, False], + ) + assert check_excel_file_column_values( + file_sent, 'ServicePlans', 'OpUnit_US', [False] * 6, + ) + + +@patch.object(CBCService, '__init__', return_value=None) +def test_apply_ppr_and_delegate_to_marketplaces_config_file_not_found( + _, + dbsession, + deployment_request_factory, + deployment_factory, + marketplace_config_factory, + ppr_version_factory, + configuration_factory, + connect_client, + mocker, +): + ppr_file_data = open('./tests/fixtures/test_PPR_apply_to_marketplaces.xlsx', 'rb').read() + + assert not check_excel_file_column_values( + ppr_file_data, 'OpUnitServicePlans', 'Published', [False] * 4, + ) + + response = Response() + response.status_code = 404 + + mocker.patch( + 'connect_ext_ppr.tasks_manager.get_ppr_from_media', + return_value=ppr_file_data, + ) + get_config_from_media_mock = mocker.patch( + 'connect_ext_ppr.tasks_manager.get_configuration_from_media', + side_effect=ClientError(response=response, message='Not found'), + ) + + cbc_service = CBCService() + dep = deployment_factory() + configuration_factory(deployment=dep.id) + ppr = ppr_version_factory(deployment=dep) + ppr2 = ppr_version_factory(deployment=dep) + dr = deployment_request_factory(deployment=dep, ppr=ppr2) + + dep_m1 = marketplace_config_factory(deployment=dep, marketplace_id='MP-123') + dep_m2 = marketplace_config_factory(deployment=dep, marketplace_id='MP-124', ppr_id=ppr.id) + dep_m3 = marketplace_config_factory(deployment=dep, marketplace_id='MP-125', ppr_id=ppr.id) + + dr_m1 = marketplace_config_factory(deployment_request=dr, marketplace_id='MP-123') + dr_m2 = marketplace_config_factory(deployment_request=dr, marketplace_id='MP-124') + + with pytest.raises(TaskException): + apply_ppr_and_delegate_to_marketplaces(dr, cbc_service, connect_client, dbsession) + + dbsession.refresh(dr_m1) + dbsession.refresh(dr_m2) + dbsession.refresh(dep_m1) + dbsession.refresh(dep_m2) + dbsession.refresh(dep_m3) + + assert dr_m1.ppr_id is None + assert dr_m2.ppr_id is None + assert dep_m1.ppr_id is None + assert dep_m2.ppr_id == ppr.id + assert dep_m3.ppr_id == ppr.id + + assert get_config_from_media_mock.call_count == 1 + + +@patch.object(CBCService, '__init__', return_value=None) +def test_apply_ppr_and_delegate_to_marketplaces_ppr_file_not_found( + _, + dbsession, + deployment_request_factory, + deployment_factory, + marketplace_config_factory, + ppr_version_factory, + configuration_factory, + connect_client, + mocker, +): + ppr_file_data = open('./tests/fixtures/test_PPR_apply_to_marketplaces.xlsx', 'rb').read() + + assert not check_excel_file_column_values( + ppr_file_data, 'OpUnitServicePlans', 'Published', [False] * 4, + ) + + response = Response() + response.status_code = 404 + get_ppr_from_media_mock = mocker.patch( + 'connect_ext_ppr.tasks_manager.get_ppr_from_media', + side_effect=ClientError(response=response, message='Not found'), + ) + + dep = deployment_factory() + configuration_factory(deployment=dep.id) + ppr = ppr_version_factory(deployment=dep) + ppr2 = ppr_version_factory(deployment=dep) + dr = deployment_request_factory(deployment=dep, ppr=ppr2) + + dep_m1 = marketplace_config_factory(deployment=dep, marketplace_id='MP-123') + dep_m2 = marketplace_config_factory(deployment=dep, marketplace_id='MP-124', ppr_id=ppr.id) + dep_m3 = marketplace_config_factory(deployment=dep, marketplace_id='MP-125', ppr_id=ppr.id) + + dr_m1 = marketplace_config_factory(deployment_request=dr, marketplace_id='MP-123') + dr_m2 = marketplace_config_factory(deployment_request=dr, marketplace_id='MP-124') + + with pytest.raises(TaskException): + apply_ppr_and_delegate_to_marketplaces(dr, CBCService(), connect_client, dbsession) + + dbsession.refresh(dr_m1) + dbsession.refresh(dr_m2) + dbsession.refresh(dep_m1) + dbsession.refresh(dep_m2) + dbsession.refresh(dep_m3) + + assert dr_m1.ppr_id is None + assert dr_m2.ppr_id is None + assert dep_m1.ppr_id is None + assert dep_m2.ppr_id == ppr.id + assert dep_m3.ppr_id == ppr.id + + assert get_ppr_from_media_mock.call_count == 1 + + +@patch.object(CBCService, '__init__', return_value=None) +def test_apply_ppr_and_delegate_to_marketplaces_error_saving_ppr( + _, + dbsession, + deployment_request_factory, + deployment_factory, + marketplace_config_factory, + ppr_version_factory, + configuration_factory, + connect_client, + mocker, +): + ppr_file_data = open('./tests/fixtures/test_PPR_apply_to_marketplaces.xlsx', 'rb').read() + ppr_config_file_data = json.load(open('./tests/fixtures/test_PPR_config_file.json')) + + assert not check_excel_file_column_values( + ppr_file_data, 'OpUnitServicePlans', 'Published', [False] * 4, + ) + + get_config_from_media_mock = mocker.patch( + 'connect_ext_ppr.tasks_manager.get_configuration_from_media', + return_value=ppr_config_file_data, + ) + + get_ppr_from_media_mock = mocker.patch( + 'connect_ext_ppr.tasks_manager.get_ppr_from_media', + return_value=ppr_file_data, + ) + response = Response() + response.status_code = 404 + create_dr_file_to_media_mock = mocker.patch( + 'connect_ext_ppr.tasks_manager.create_dr_file_to_media', + side_effect=ClientError(response=response, message='Error on create DR file'), + ) + + dep = deployment_factory() + configuration_factory(deployment=dep.id) + ppr = ppr_version_factory(deployment=dep) + ppr2 = ppr_version_factory(deployment=dep) + dr = deployment_request_factory(deployment=dep, ppr=ppr2) + + dep_m1 = marketplace_config_factory(deployment=dep, marketplace_id='MP-123') + dep_m2 = marketplace_config_factory(deployment=dep, marketplace_id='MP-124', ppr_id=ppr.id) + dep_m3 = marketplace_config_factory(deployment=dep, marketplace_id='MP-125', ppr_id=ppr.id) + + dr_m1 = marketplace_config_factory(deployment_request=dr, marketplace_id='MP-123') + dr_m2 = marketplace_config_factory(deployment_request=dr, marketplace_id='MP-124') + + with pytest.raises(TaskException): + apply_ppr_and_delegate_to_marketplaces(dr, CBCService(), connect_client, dbsession) + + dbsession.refresh(dr_m1) + dbsession.refresh(dr_m2) + dbsession.refresh(dep_m1) + dbsession.refresh(dep_m2) + dbsession.refresh(dep_m3) + + assert dr_m1.ppr_id is None + assert dr_m2.ppr_id is None + assert dep_m1.ppr_id is None + assert dep_m2.ppr_id == ppr.id + assert dep_m3.ppr_id == ppr.id + + assert get_config_from_media_mock.call_count == 1 + assert get_ppr_from_media_mock.call_count == 1 + assert create_dr_file_to_media_mock.call_count == 1 + + +@patch.object(CBCService, '__init__', return_value=None) +def test_apply_ppr_and_delegate_to_marketplaces_error_sending_ppr( + _, + dbsession, + deployment_request_factory, + deployment_factory, + marketplace_config_factory, + ppr_version_factory, + configuration_factory, + connect_client, + mocker, +): + ppr_file_data = open('./tests/fixtures/test_PPR_apply_to_marketplaces.xlsx', 'rb').read() + ppr_config_file_data = json.load(open('./tests/fixtures/test_PPR_config_file.json')) + + assert not check_excel_file_column_values( + ppr_file_data, 'OpUnitServicePlans', 'Published', [False] * 4, + ) + + get_config_from_media_mock = mocker.patch( + 'connect_ext_ppr.tasks_manager.get_configuration_from_media', + return_value=ppr_config_file_data, + ) + + get_ppr_from_media_mock = mocker.patch( + 'connect_ext_ppr.tasks_manager.get_ppr_from_media', + return_value=ppr_file_data, + ) + + create_dr_file_to_media_mock = mocker.patch( + 'connect_ext_ppr.tasks_manager.create_dr_file_to_media', + ) + send_ppr_mock = mocker.patch( + 'connect_ext_ppr.tasks_manager._send_ppr', + side_effect=TaskException(), + ) + dep = deployment_factory() + configuration_factory(deployment=dep.id) + ppr = ppr_version_factory(deployment=dep) + ppr2 = ppr_version_factory(deployment=dep) + dr = deployment_request_factory(deployment=dep, ppr=ppr2) + + dep_m1 = marketplace_config_factory(deployment=dep, marketplace_id='MP-123') + dep_m2 = marketplace_config_factory(deployment=dep, marketplace_id='MP-124', ppr_id=ppr.id) + dep_m3 = marketplace_config_factory(deployment=dep, marketplace_id='MP-125', ppr_id=ppr.id) + + dr_m1 = marketplace_config_factory(deployment_request=dr, marketplace_id='MP-123') + dr_m2 = marketplace_config_factory(deployment_request=dr, marketplace_id='MP-124') + + with pytest.raises(TaskException): + apply_ppr_and_delegate_to_marketplaces(dr, CBCService(), connect_client, dbsession) + + dbsession.refresh(dr_m1) + dbsession.refresh(dr_m2) + dbsession.refresh(dep_m1) + dbsession.refresh(dep_m2) + dbsession.refresh(dep_m3) + + assert dr_m1.ppr_id is None + assert dr_m2.ppr_id is None + assert dep_m1.ppr_id is None + assert dep_m2.ppr_id == ppr.id + assert dep_m3.ppr_id == ppr.id + + assert get_config_from_media_mock.call_count == 1 + assert get_ppr_from_media_mock.call_count == 1 + assert create_dr_file_to_media_mock.call_count == 1 + assert send_ppr_mock.call_count == 1 def test__send_ppr(parse_ppr_success_response, sample_ppr_file, mocker): @@ -196,9 +711,11 @@ def test_delegate_to_l2( cbc_sevice = CBCService() ppr_file_data = open('./tests/fixtures/test_PPR_file_delegate_l2.xlsx', 'rb').read() assert not check_excel_file_column_values( - ppr_file_data, 'OpUnitServicePlans', 'Published', True, + ppr_file_data, 'OpUnitServicePlans', 'Published', [True] * 6, + ) + assert not check_excel_file_column_values( + ppr_file_data, 'ServicePlans', 'Published', [False] * 6, ) - assert not check_excel_file_column_values(ppr_file_data, 'ServicePlans', 'Published', False) file_sent = null @@ -237,8 +754,8 @@ def send_ppr_side_effect(*args): assert send_ppr_mock.call_args.args[0] == cbc_sevice ppr_file_arg = send_ppr_mock.call_args.args[1] assert isinstance(ppr_file_arg, BufferedReader) - assert check_excel_file_column_values(file_sent, 'OpUnitServicePlans', 'Published', True) - assert check_excel_file_column_values(file_sent, 'ServicePlans', 'Published', False) + assert check_excel_file_column_values(file_sent, 'OpUnitServicePlans', 'Published', [True] * 6) + assert check_excel_file_column_values(file_sent, 'ServicePlans', 'Published', [False] * 6) @patch.object(CBCService, '__init__') @@ -474,7 +991,6 @@ def test_main_process_ends_w_error( def mock_get(key): return lambda **kwargs: key != type_function_to_mock - my_mock.get = mock_get mocker.patch('connect_ext_ppr.tasks_manager._get_cbc_service', return_value=CBCService()) diff --git a/tests/test_utils.py b/tests/test_utils.py index 71c6e0c..ed89845 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -452,7 +452,7 @@ def test_get_all_info_w_marketplace_not_available( assert get_all_listing_info(connect_client) == [] -def check_excel_file_column_values(file, sheet_name, column_name, value): +def check_excel_file_column_values(file, sheet_name, column_name, values): wb = pd.ExcelFile(file) ws1 = wb.parse(sheet_name) - return (ws1[column_name] == value).all() + return all(t1[0] == t1[1] for t1 in zip(ws1[column_name], values))