def test_merge_allowed_when_source_company_has_export_countries(self): """Test that merging is allowed if the source company has export countries.""" source_company = CompanyFactory() CompanyExportCountryFactory(company=source_company) CompanyExportCountryHistoryFactory(company=source_company) target_company = CompanyFactory() user = AdviserFactory() merge_time = datetime(2011, 2, 1, 14, 0, 10, tzinfo=utc) with freeze_time(merge_time): merge_companies(source_company, target_company, user) source_company.refresh_from_db() assert source_company.archived assert source_company.archived_by == user assert source_company.archived_on == merge_time assert source_company.archived_reason == ( f'This record is no longer in use and its data has been transferred ' f'to {target_company} for the following reason: Duplicate record.' ) assert source_company.modified_by == user assert source_company.modified_on == merge_time assert source_company.transfer_reason == Company.TransferReason.DUPLICATE assert source_company.transferred_by == user assert source_company.transferred_on == merge_time assert source_company.transferred_to == target_company
def test_merge_when_both_companies_are_on_pipeline_for_same_adviser( self, source_status, target_status, ): """ Test that both source and target company are on pipeline for the same adviser and same status. And the merge is successful. """ adviser = AdviserFactory() source_company = CompanyFactory() target_company = CompanyFactory() PipelineItemFactory( adviser=adviser, company=source_company, status=source_status, ) PipelineItemFactory( adviser=adviser, company=target_company, status=target_status, ) user = AdviserFactory() merge_companies(source_company, target_company, user) assert not PipelineItem.objects.filter( adviser=adviser, company=source_company, ).exists() assert PipelineItem.objects.filter( adviser=adviser, company=target_company, ).exists()
def test_get_export_wins_one_merged_company_success( self, requests_mock, ): """Test get wins for both source and target, when a company was merged.""" source_company = CompanyFactory() target_company = CompanyFactory() user = create_test_user( permission_codenames=( CompanyPermission.view_export_win, ), ) merge_companies(source_company, target_company, user) requests_mock.register_uri( 'POST', '/api/v1/company/match/', [ {'text': self._get_matching_service_response([1, 2]), 'status_code': 200}, ], ) export_wins_response = { 'count': 2, 'next': None, 'previous': None, 'results': [ { 'id': 'e3013078-7b3e-4359-83d9-cd003a515521', 'date': '2016-05-25', 'created': '2020-02-18T15:36:02.782000Z', 'country': 'CA', }, { 'id': 'e3013078-7b3e-4359-83d9-cd003a515234', 'date': '2016-07-25', 'created': '2020-04-18T15:36:02.782000Z', 'country': 'US', }, ], } export_wins_dynamic_response = HawkMockJSONResponse( api_id=settings.EXPORT_WINS_HAWK_ID, api_key=settings.EXPORT_WINS_HAWK_KEY, response=export_wins_response, ) requests_mock.get( '/wins/match?match_id=1,2', status_code=200, text=export_wins_dynamic_response, ) api_client = self.create_api_client(user=user) url = reverse('api-v4:company:export-win', kwargs={'pk': target_company.id}) response = api_client.get(url) assert response.status_code == 200 assert response.json() == export_wins_response
def test_merge_fails_when_not_allowed( self, is_company_a_valid_merge_source_mock, is_company_a_valid_merge_target_mock, valid_source, valid_target, ): """ Test that perform_merge() raises MergeNotAllowedError when the merge is not allowed. """ is_company_a_valid_merge_source_mock.return_value = valid_source is_company_a_valid_merge_target_mock.return_value = valid_target source_company = CompanyFactory() target_company = CompanyFactory() user = AdviserFactory() with pytest.raises(MergeNotAllowedError): merge_companies(source_company, target_company, user)
def test_merge_when_both_companies_on_same_company_list(self): """ Test that if both the source and target company are on the same company list, the merge is successful and the two list items are also merged. """ source_company = CompanyFactory() target_company = CompanyFactory() company_list = CompanyListFactory() CompanyListItemFactory(list=company_list, company=source_company) CompanyListItemFactory(list=company_list, company=target_company) user = AdviserFactory() merge_companies(source_company, target_company, user) assert not CompanyListItem.objects.filter( list=company_list, company=source_company, ).exists() assert CompanyListItem.objects.filter(list=company_list, company=target_company).exists()
def test_merge_when_both_companies_are_on_pipeline_diff_adviser(self): """ Test that both source and target company are on pipeline with different advisers. Merge is successful and both items are migrated to the target company. """ adviser_1 = AdviserFactory() adviser_2 = AdviserFactory() source_company = CompanyFactory() target_company = CompanyFactory() PipelineItemFactory( adviser=adviser_1, company=source_company, status=PipelineItem.Status.LEADS, ) PipelineItemFactory( adviser=adviser_2, company=target_company, status=PipelineItem.Status.IN_PROGRESS, ) user = AdviserFactory() merge_companies(source_company, target_company, user) assert not PipelineItem.objects.filter( adviser=adviser_1, company=source_company, ).exists() assert PipelineItem.objects.filter( adviser=adviser_1, company=target_company, ).exists() assert PipelineItem.objects.filter( adviser=adviser_2, company=target_company, ).exists()
def _perform_merge(request, source_company, target_company, model_admin): try: merge_results = merge_companies(source_company, target_company, request.user) except MergeNotAllowedError: failure_msg = MERGE_FAILURE_MSG.format( source_company=source_company, target_company=target_company, ) model_admin.message_user(request, failure_msg, django_messages.ERROR) return False reversion.set_comment(REVERSION_REVISION_COMMENT) success_msg = _build_success_msg(source_company, target_company, merge_results) model_admin.message_user(request, success_msg, django_messages.SUCCESS) return True
def test_merge_investment_projects_succeeds(self, fields): """ Tests that perform_merge() moves investment projects to the target company and marks the source company as archived and transferred. """ creation_time = datetime(2010, 12, 1, 15, 0, 10, tzinfo=utc) with freeze_time(creation_time): source_company = CompanyFactory() investment_project = InvestmentProjectFactory( **{field: source_company for field in fields}, ) target_company = CompanyFactory() user = AdviserFactory() merge_time = datetime(2011, 2, 1, 14, 0, 10, tzinfo=utc) with freeze_time(merge_time): result = merge_companies(source_company, target_company, user) other_fields = set(INVESTMENT_PROJECT_COMPANY_FIELDS) - set(fields) assert result == { # each interaction has a contact, that's why 4 contacts should be moved CompanyListItem: { 'company': 0 }, Contact: { 'company': 0 }, Interaction: { 'company': 0 }, InvestmentProject: { **{field: 1 for field in fields}, **{field: 0 for field in other_fields}, }, Order: { 'company': 0 }, } investment_project.refresh_from_db() assert all( getattr(investment_project, field) == target_company for field in fields) assert all( getattr(investment_project, field) != target_company for field in other_fields) assert all( getattr(investment_project, field) != source_company for field in other_fields) assert investment_project.modified_on == creation_time source_company.refresh_from_db() assert source_company.archived assert source_company.archived_by == user assert source_company.archived_on == merge_time assert source_company.archived_reason == ( f'This record is no longer in use and its data has been transferred ' f'to {target_company} for the following reason: Duplicate record.') assert source_company.modified_by == user assert source_company.modified_on == merge_time assert source_company.transfer_reason == Company.TRANSFER_REASONS.duplicate assert source_company.transferred_by == user assert source_company.transferred_on == merge_time assert source_company.transferred_to == target_company
def test_merge_interactions_contacts_succeeds( self, factory_relation_kwarg, creates_contacts, num_related_objects, ): """ Tests that perform_merge() moves contacts and interactions to the target company, and marks the source company as archived and transferred. """ creation_time = datetime(2010, 12, 1, 15, 0, 10, tzinfo=utc) with freeze_time(creation_time): source_company = _company_factory( **{factory_relation_kwarg: num_related_objects}, ) target_company = CompanyFactory() user = AdviserFactory() source_interactions = list(source_company.interactions.all()) source_contacts = list(source_company.contacts.all()) source_orders = list(source_company.orders.all()) source_company_list_items = list( source_company.company_list_items.all()) # Each interaction and order has a contact, so actual number of contacts is # source_num_interactions + source_num_contacts + source_num_orders assert len(source_contacts) == (num_related_objects if creates_contacts else 0) merge_time = datetime(2011, 2, 1, 14, 0, 10, tzinfo=utc) with freeze_time(merge_time): result = merge_companies(source_company, target_company, user) assert result == { CompanyListItem: { 'company': len(source_company_list_items) }, Contact: { 'company': len(source_contacts) }, Interaction: { 'company': len(source_interactions) }, InvestmentProject: {field: 0 for field in INVESTMENT_PROJECT_COMPANY_FIELDS}, Order: { 'company': len(source_orders) }, } for obj in chain(source_interactions, source_contacts, source_orders): obj.refresh_from_db() assert all(obj.company == target_company for obj in source_interactions) assert all(obj.modified_on == creation_time for obj in source_interactions) assert all(obj.company == target_company for obj in source_contacts) assert all(obj.modified_on == creation_time for obj in source_contacts) assert all(obj.company == target_company for obj in source_orders) assert all(obj.modified_on == creation_time for obj in source_orders) source_company.refresh_from_db() assert source_company.archived assert source_company.archived_by == user assert source_company.archived_on == merge_time assert source_company.archived_reason == ( f'This record is no longer in use and its data has been transferred ' f'to {target_company} for the following reason: Duplicate record.') assert source_company.modified_by == user assert source_company.modified_on == merge_time assert source_company.transfer_reason == Company.TRANSFER_REASONS.duplicate assert source_company.transferred_by == user assert source_company.transferred_on == merge_time assert source_company.transferred_to == target_company