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
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
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)
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