Пример #1
0
def test_company_referrals_ordering(api_client):
    """
    Test that the company referrals are ordered by ('modified_on', 'pk')
    """
    company_referrals = []

    with freeze_time() as frozen_datetime:
        company_referrals += CompanyReferralFactory.create_batch(2)

        frozen_datetime.tick(datetime.timedelta(microseconds=1))
        company_referrals += CompanyReferralFactory.create_batch(8)

        frozen_datetime.tick(datetime.timedelta(seconds=1, microseconds=1))
        response = hawk.get(
            api_client, get_url('api-v3:activity-stream:company-referrals'))

    assert response.status_code == status.HTTP_200_OK

    sorted_company_referral_ids = [
        f'dit:DataHubCompanyReferral:{obj.pk}'
        for obj in sorted(company_referrals,
                          key=lambda obj: (obj.modified_on, obj.pk))
    ]
    response_company_referral_ids = [
        item['object']['id'] for item in response.json()['orderedItems']
    ]
    assert sorted_company_referral_ids == response_company_referral_ids
Пример #2
0
def _company_factory(
    num_interactions=0,
    num_contacts=0,
    num_investment_projects=0,
    num_orders=0,
    num_referrals=0,
    num_company_list_items=0,
    num_pipeline_items=0,
):
    """
    Factory for a company that has companies, interactions, investment projects and OMIS orders.
    """
    company = CompanyFactory()
    ContactFactory.create_batch(num_contacts, company=company)
    CompanyInteractionFactory.create_batch(num_interactions, company=company)
    CompanyReferralFactory.create_batch(num_referrals,
                                        company=company,
                                        contact=None)
    OrderFactory.create_batch(num_orders, company=company)
    CompanyListItemFactory.create_batch(num_company_list_items,
                                        company=company)
    PipelineItemFactory.create_batch(num_pipeline_items, company=company)

    fields_iter = cycle(INVESTMENT_PROJECT_COMPANY_FIELDS)
    fields = islice(fields_iter, 0, num_investment_projects)
    InvestmentProjectFactory.create_batch(
        num_investment_projects,
        **{field: company
           for field in fields},
    )
    return company
Пример #3
0
def company_with_referrals_factory():
    """
    Factory for a company with referrals.

    No company contacts are created to simplify testing.
    """
    company = CompanyFactory()
    CompanyReferralFactory.create_batch(3, company=company, contact=None)
    return company
    def test_doesnt_return_other_users_referrals(self):
        """Test that other users' referrals are not returned."""
        # Create some referrals sent or received by other users
        CompanyReferralFactory.create_batch(2)

        response = self.api_client.get(collection_url)

        assert response.status_code == status.HTTP_200_OK
        response_data = response.json()
        assert response_data['results'] == []
Пример #5
0
def unrelated_objects():
    """
    Create some objects not related to a known company.

    This is used in tests below to make sure objects unrelated to the company being merged
    do not affect the counts of objects that will be affected by the merge.
    """
    ContactFactory.create_batch(2)
    CompanyReferralFactory.create_batch(2)
    CompanyInteractionFactory.create_batch(2)
    OrderFactory.create_batch(2)
    InvestmentProjectFactory.create_batch(2)
Пример #6
0
def _company_factory(
        num_interactions=0,
        num_contacts=0,
        num_orders=0,
        num_referrals=0,
        num_company_list_items=0,
):
    """Factory for a company that has companies, interactions and OMIS orders."""
    company = CompanyFactory()
    ContactFactory.create_batch(num_contacts, company=company)
    CompanyInteractionFactory.create_batch(num_interactions, company=company)
    CompanyReferralFactory.create_batch(num_referrals, company=company, contact=None)
    OrderFactory.create_batch(num_orders, company=company)
    CompanyListItemFactory.create_batch(num_company_list_items, company=company)
    return company
 def test_str(self):
     """Test __str__()."""
     referral = CompanyReferralFactory.build(
         company__name='Mars Ltd',
         subject='Wants to export to the Far East',
     )
     assert str(referral) == 'Mars Ltd – Wants to export to the Far East'
    def test_returns_items_in_expected_format(self):
        """Test that referrals are returned in expected format."""
        company_referral = CompanyReferralFactory(created_by=self.user)

        response = self.api_client.get(collection_url)
        assert response.status_code == status.HTTP_200_OK

        results = response.json()['results']
        assert len(results) == 1
        assert results[0] == {
            'id': str(company_referral.pk),
            'company': {
                'id': str(company_referral.company.pk),
                'name': company_referral.company.name,
            },
            'completed_by': None,
            'completed_on': None,
            'contact': {
                'id': str(company_referral.contact.pk),
                'name': company_referral.contact.name,
            },
            'created_by': format_expected_adviser(company_referral.created_by),
            'created_on': format_date_or_datetime(company_referral.created_on),
            'interaction': None,
            'recipient': format_expected_adviser(company_referral.recipient),
            'status': company_referral.status,
            'subject': company_referral.subject,
            'notes': company_referral.notes,
        }
Пример #9
0
 def test_with_multiple_records(self, data_flow_api_client):
     """Test that endpoint returns correct number of records"""
     with freeze_time('2019-01-01 12:30:00'):
         referral1 = CompanyReferralFactory()
     with freeze_time('2019-01-03 12:00:00'):
         referral2 = CompanyReferralFactory()
     with freeze_time('2019-01-01 12:00:00'):
         referral3 = CompanyReferralFactory()
         referral4 = CompanyReferralFactory()
     response = data_flow_api_client.get(self.view_url)
     assert response.status_code == status.HTTP_200_OK
     response_results = response.json()['results']
     assert len(response_results) == 4
     expected_list = sorted([referral3, referral4],
                            key=lambda x: x.pk) + [referral1, referral2]
     for index, referral in enumerate(expected_list):
         assert str(referral.id) == response_results[index]['id']
    def test_returns_items_for_sender_and_recipient(self):
        """Test that both sent and received referrals are returned."""
        sender = CompanyReferralFactory(created_by=self.user)
        recipient1 = CompanyReferralFactory(recipient=self.user)
        recipient2 = CompanyReferralFactory(recipient=self.user)

        response = self.api_client.get(collection_url)
        assert response.status_code == status.HTTP_200_OK

        results = response.json()['results']
        assert len(results) == 3

        expected_referrals = {
            str(sender.pk),
            str(recipient1.pk),
            str(recipient2.pk)
        }
        assert {result['id'] for result in results} == expected_referrals
Пример #11
0
    def test_body_validation(self, request_data, expected_response_data):
        """Test validation of the request body in various cases."""
        referral = CompanyReferralFactory()
        url = _complete_url(referral.pk)

        resolved_data = resolve_objects(request_data)
        response = self.api_client.post(url, data=resolved_data)

        assert response.status_code == status.HTTP_400_BAD_REQUEST
        assert response.json() == expected_response_data
Пример #12
0
    def test_permission_checking(self, permission_codenames, expected_status, api_client):
        """Test that the expected status is returned depending on the permissions the user has."""
        user = create_test_user(permission_codenames=permission_codenames)
        api_client = self.create_api_client(user=user)

        referral = CompanyReferralFactory()
        url = _complete_url(referral.pk)
        request_data = _sample_valid_request_data(referral)

        response = api_client.post(url, data=request_data)
        assert response.status_code == expected_status
    def test_permission_checking(self, permission_codenames, expected_status,
                                 api_client):
        """
        Test that the expected status is returned depending on the permissions the user has.
        """
        referral = CompanyReferralFactory()
        user = create_test_user(permission_codenames=permission_codenames)

        url = _item_url(referral.pk)
        api_client = self.create_api_client(user=user)

        response = api_client.get(url)
        assert response.status_code == expected_status
Пример #14
0
 def test_returns_401_if_unauthenticated(self, api_client):
     """Test that a 401 is returned if the user is unauthenticated."""
     referral = CompanyReferralFactory()
     url = _complete_url(referral.pk)
     response = api_client.post(url, data={})
     assert response.status_code == status.HTTP_401_UNAUTHORIZED
Пример #15
0
    def test_creates_an_interaction(self, extra_data):
        """Test that an interaction is created on success."""
        referral = CompanyReferralFactory()
        url = _complete_url(referral.pk)

        contact = ContactFactory(company=referral.company)
        service = random_service()

        request_data = {
            'kind': Interaction.Kind.INTERACTION,
            'subject': 'test subject',
            'date': '2020-02-03',
            'dit_participants': [
                {
                    'adviser': self.user
                },
            ],
            'contacts': [contact],
            'service': service,
            'was_policy_feedback_provided': False,
            **extra_data,
        }

        resolved_request_data = resolve_objects(request_data)

        with freeze_time(FROZEN_DATETIME):
            response = self.api_client.post(url, data=resolved_request_data)

        assert response.status_code == status.HTTP_201_CREATED

        referral.refresh_from_db()

        assert referral.interaction_id
        interaction_data = Interaction.objects.values().get(
            pk=referral.interaction_id)
        expected_interaction_data = {
            # Automatically set fields
            'created_by_id':
            self.user.pk,
            'created_on':
            FROZEN_DATETIME,
            'id':
            referral.interaction_id,
            'modified_by_id':
            self.user.pk,
            'modified_on':
            FROZEN_DATETIME,

            # Fields specified in the request body
            'communication_channel_id':
            resolved_request_data.get('communication_channel'),
            'date':
            datetime(2020, 2, 3, tzinfo=utc),
            'event_id':
            resolved_request_data.get('event'),
            'grant_amount_offered':
            None,
            'investment_project_id':
            None,
            'kind':
            resolved_request_data['kind'],
            'net_company_receipt':
            None,
            'notes':
            '',
            'policy_feedback_notes':
            '',
            'service_answers':
            None,
            'service_delivery_status_id':
            None,
            'service_id':
            service.pk,
            'source':
            None,
            'status':
            Interaction.Status.COMPLETE,
            'subject':
            resolved_request_data['subject'],
            'theme':
            None,
            'was_policy_feedback_provided':
            resolved_request_data['was_policy_feedback_provided'],
            'were_countries_discussed':
            None,

            # Other fields
            'archived':
            False,
            'archived_by_id':
            None,
            'archived_documents_url_path':
            '',
            'archived_on':
            None,
            'archived_reason':
            None,
            'large_capital_opportunity_id':
            None,
            'has_related_trade_agreements':
            None,

            # TODO: a legacy field, remove once interaction.company field is removed
            'company_id':
            referral.company_id,
        }
        assert interaction_data == expected_interaction_data

        assert list(referral.interaction.contacts.all()) == [contact]
        assert list(referral.interaction.companies.all()) == [referral.company]

        participant = referral.interaction.dit_participants.get()
        assert participant.adviser == self.user
        assert participant.team == self.user.dit_team
Пример #16
0
    def test_updates_referral_status(self):
        """Test that the status of the referral is updated on success."""
        referral = CompanyReferralFactory()
        url = _complete_url(referral.pk)

        request_data = _sample_valid_request_data(referral)

        with freeze_time(FROZEN_DATETIME):
            response = self.api_client.post(url, data=request_data)

        assert response.status_code == status.HTTP_201_CREATED

        response_data = response.json()
        referral.refresh_from_db()
        interaction = referral.interaction
        assert response_data == {
            'id':
            response_data['id'],
            'kind':
            Interaction.Kind.INTERACTION.value,
            'status':
            Interaction.Status.COMPLETE.value,
            'theme':
            interaction.theme,
            'is_event':
            None,
            'service_delivery_status':
            None,
            'grant_amount_offered':
            None,
            'net_company_receipt':
            None,
            'policy_areas': [],
            'policy_feedback_notes':
            '',
            'policy_issue_types': [],
            'was_policy_feedback_provided':
            interaction.was_policy_feedback_provided,
            'communication_channel': {
                'id': str(interaction.communication_channel.pk),
                'name': interaction.communication_channel.name,
            },
            'subject':
            interaction.subject,
            'date':
            interaction.date.date().isoformat(),
            'dit_participants':
            [{
                'adviser': {
                    'id': str(dit_participant.adviser.pk),
                    'first_name': dit_participant.adviser.first_name,
                    'last_name': dit_participant.adviser.last_name,
                    'name': dit_participant.adviser.name,
                },
                'team': {
                    'id': str(dit_participant.team.pk),
                    'name': dit_participant.team.name,
                },
            }
             for dit_participant in interaction.dit_participants.order_by('pk')
             ],
            'notes':
            interaction.notes,
            'company': {
                'id': str(interaction.company.pk),
                'name': interaction.company.name,
            },
            'companies': [
                {
                    'id': str(interaction.company.pk),
                    'name': interaction.company.name,
                },
            ],
            'contacts': [{
                'id': str(contact.pk),
                'name': contact.name,
                'first_name': contact.first_name,
                'last_name': contact.last_name,
                'job_title': contact.job_title,
            } for contact in interaction.contacts.order_by('pk')],
            'event':
            None,
            'service': {
                'id': str(interaction.service.pk),
                'name': interaction.service.name,
            },
            'service_answers':
            None,
            'investment_project':
            None,
            'archived_documents_url_path':
            interaction.archived_documents_url_path,
            'were_countries_discussed':
            interaction.were_countries_discussed,
            'export_countries': [],
            'created_by': {
                'id': str(interaction.created_by.pk),
                'first_name': interaction.created_by.first_name,
                'last_name': interaction.created_by.last_name,
                'name': interaction.created_by.name,
            },
            'modified_by': {
                'id': str(interaction.modified_by.pk),
                'first_name': interaction.modified_by.first_name,
                'last_name': interaction.modified_by.last_name,
                'name': interaction.modified_by.name,
            },
            'created_on':
            format_date_or_datetime(FROZEN_DATETIME),
            'modified_on':
            format_date_or_datetime(FROZEN_DATETIME),
            'archived':
            False,
            'archived_by':
            None,
            'archived_on':
            None,
            'archived_reason':
            None,
            'company_referral': {
                'id': str(referral.pk),
                'subject': referral.subject,
                'created_by': format_expected_adviser(referral.created_by),
                'created_on': format_date_or_datetime(referral.created_on),
                'recipient': format_expected_adviser(referral.recipient),
            },
            'large_capital_opportunity':
            None,
            'related_trade_agreements': [],
        }

        assert referral.status == CompanyReferral.Status.COMPLETE
        assert referral.completed_by == self.user
        assert referral.completed_on == FROZEN_DATETIME
        assert referral.modified_by == self.user
        assert referral.modified_on == FROZEN_DATETIME
Пример #17
0
def test_company_referral_activity_without_team_and_contact(api_client):
    """
    Get a list of company referrals and test the returned JSON is valid as per:
    https://www.w3.org/TR/activitystreams-core/
    """
    recipient = AdviserFactory(dit_team=None)
    company_referral = CompanyReferralFactory(recipient=recipient, contact=None)
    response = hawk.get(api_client, get_url('api-v3:activity-stream:company-referrals'))
    assert response.status_code == status.HTTP_200_OK
    assert response.json() == {
        '@context': 'https://www.w3.org/ns/activitystreams',
        'summary': 'Company Referral Activities',
        'type': 'OrderedCollectionPage',
        'id': 'http://testserver/v3/activity-stream/company-referral',
        'partOf': 'http://testserver/v3/activity-stream/company-referral',
        'previous': None,
        'next': None,
        'orderedItems': [
            {
                'id': f'dit:DataHubCompanyReferral:{company_referral.id}:Announce',
                'type': 'Announce',
                'published': format_date_or_datetime(company_referral.modified_on),
                'generator': {'name': 'dit:dataHub', 'type': 'Application'},
                'object': {
                    'id': f'dit:DataHubCompanyReferral:{company_referral.id}',
                    'type': ['dit:CompanyReferral'],
                    'startTime': format_date_or_datetime(company_referral.created_on),
                    'dit:subject': company_referral.subject,
                    'dit:status': str(company_referral.status),
                    'attributedTo': [
                        {
                            'id': f'dit:DataHubCompany:{company_referral.company.pk}',
                            'dit:dunsNumber': company_referral.company.duns_number,
                            'dit:companiesHouseNumber': company_referral.company.company_number,
                            'type': ['Organization', 'dit:Company'],
                            'name': company_referral.company.name,
                        },
                        {
                            'id': f'dit:DataHubAdviser:{company_referral.created_by.pk}',
                            'type': ['Person', 'dit:Adviser'],
                            'dit:emailAddress':
                                company_referral.created_by.contact_email
                                or company_referral.created_by.email,
                            'name': company_referral.created_by.name,
                            'dit:team': {
                                'id': f'dit:DataHubTeam:{company_referral.created_by.dit_team.pk}',
                                'type': ['Group', 'dit:Team'],
                                'name': company_referral.created_by.dit_team.name,
                            },
                            'dit:DataHubCompanyReferral:role': 'sender',
                        },
                        {
                            'id': f'dit:DataHubAdviser:{company_referral.recipient.pk}',
                            'type': ['Person', 'dit:Adviser'],
                            'dit:emailAddress':
                                company_referral.recipient.contact_email
                                or company_referral.recipient.email,
                            'name': company_referral.recipient.name,
                            'dit:DataHubCompanyReferral:role': 'recipient',
                        },
                    ],
                    'url': company_referral.get_absolute_url(),
                },
            },
        ],
    }
Пример #18
0
def test_company_referral_activity(api_client):
    """
    Get a list of company referrals and test the returned JSON is valid as per:
    https://www.w3.org/TR/activitystreams-core/
    """
    start = datetime.datetime(year=2012,
                              month=7,
                              day=12,
                              hour=15,
                              minute=6,
                              second=3)
    with freeze_time(start) as frozen_datetime:
        company_referral = CompanyReferralFactory()
        frozen_datetime.tick(datetime.timedelta(seconds=1, microseconds=1))
        response = hawk.get(
            api_client, get_url('api-v3:activity-stream:company-referrals'))

    assert response.status_code == status.HTTP_200_OK
    assert response.json() == {
        '@context':
        'https://www.w3.org/ns/activitystreams',
        'summary':
        'Company Referral Activities',
        'type':
        'OrderedCollectionPage',
        'next':
        'http://testserver/v3/activity-stream/company-referral' +
        '?cursor=2012-07-12T15%3A06%3A03.000000%2B00%3A00' +
        f'&cursor={str(company_referral.id)}',
        'orderedItems': [
            {
                'id':
                f'dit:DataHubCompanyReferral:{company_referral.id}:Announce',
                'type': 'Announce',
                'published':
                format_date_or_datetime(company_referral.modified_on),
                'generator': {
                    'name': 'dit:dataHub',
                    'type': 'Application'
                },
                'object': {
                    'id':
                    f'dit:DataHubCompanyReferral:{company_referral.id}',
                    'type': ['dit:CompanyReferral'],
                    'startTime':
                    format_date_or_datetime(company_referral.created_on),
                    'dit:subject':
                    company_referral.subject,
                    'dit:status':
                    str(company_referral.status),
                    'attributedTo': [
                        {
                            'id':
                            f'dit:DataHubCompany:{company_referral.company.pk}',
                            'dit:dunsNumber':
                            company_referral.company.duns_number,
                            'dit:companiesHouseNumber':
                            company_referral.company.company_number,
                            'type': ['Organization', 'dit:Company'],
                            'name': company_referral.company.name,
                        },
                        {
                            'id':
                            f'dit:DataHubAdviser:{company_referral.created_by.pk}',
                            'type': ['Person', 'dit:Adviser'],
                            'dit:emailAddress':
                            company_referral.created_by.contact_email
                            or company_referral.created_by.email,
                            'name':
                            company_referral.created_by.name,
                            'dit:team': {
                                'id':
                                f'dit:DataHubTeam:{company_referral.created_by.dit_team.pk}',
                                'type': ['Group', 'dit:Team'],
                                'name':
                                company_referral.created_by.dit_team.name,
                            },
                            'dit:DataHubCompanyReferral:role':
                            'sender',
                        },
                        {
                            'id':
                            f'dit:DataHubAdviser:{company_referral.recipient.pk}',
                            'type': ['Person', 'dit:Adviser'],
                            'dit:emailAddress':
                            company_referral.recipient.contact_email
                            or company_referral.recipient.email,
                            'name':
                            company_referral.recipient.name,
                            'dit:team': {
                                'id':
                                f'dit:DataHubTeam:{company_referral.recipient.dit_team.pk}',
                                'type': ['Group', 'dit:Team'],
                                'name':
                                company_referral.recipient.dit_team.name,
                            },
                            'dit:DataHubCompanyReferral:role':
                            'recipient',
                        },
                        {
                            'id':
                            f'dit:DataHubContact:{company_referral.contact.pk}',
                            'type': ['Person', 'dit:Contact'],
                            'url': company_referral.contact.get_absolute_url(),
                            'dit:emailAddress': company_referral.contact.email,
                            'dit:jobTitle': company_referral.contact.job_title,
                            'name': company_referral.contact.name,
                        },
                    ],
                    'url':
                    company_referral.get_absolute_url(),
                },
            },
        ],
    }