def test_validates_input(self, request_data, expected_response_data):
        """Test validation for various scenarios."""
        resolved_request_data = resolve_objects(request_data)
        response = self.api_client.post(collection_url,
                                        data=resolved_request_data)

        assert response.status_code == status.HTTP_400_BAD_REQUEST
        assert response.json() == expected_response_data
Exemplo n.º 2
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
Exemplo n.º 3
0
def resolve_data(data):
    """
    Given a value:

    - if it's a callable, it resolves it
    - if it's an object with a 'pk' attribute, it uses that instead
    - if it's a sequence it resolves each of the sequence's values
    - if it's a dict it resolves each value of the dict

    The resolved value is returned.
    """
    return resolve_objects(data, object_resolver=_resolve_model_object)
Exemplo n.º 4
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