def test_settings_view(self) -> None: self.set_tenant(0) user = self.users[0] factory = TenantsAPIRequestFactory(force_authenticate=user) request = factory.post('', data=dict(name='testing settings')) response = CampaignsViewSet.as_view({'post': 'create'})(request) self.assertEqual(response.status_code, status.HTTP_201_CREATED, str(response.data)) campaign_data = response.data campaign = Campaign.objects.get(id=campaign_data['id']) self.assertTrue(campaign.settings) request = factory.get('') response = CampaignSettingsViewSet.as_view({'get': 'retrieve_single'})(request, campaign=campaign_data['id']) self.assertEqual(response.status_code, status.HTTP_200_OK, str(response.data)) response.render() # render just in case settings_data = response.data self.assertEqual(campaign.settings.step_max_number, settings_data['step_max_number']) email_send_delay = datetime.timedelta(**dict(zip( ['hours', 'minutes', 'seconds'], map(int, settings_data['email_send_delay'].split(':', 2)) ))) self.assertEqual(campaign.settings.email_send_delay, email_send_delay)
def test_simple_email_provider_view(self, mock_cached_delay_call): config_data = { 'name': 'GMail', 'incoming': { 'host': 'imap.gmail.com', 'port': 993, 'encryption': 'SSL', 'username': '******', 'authentication': 'OAUTH2', 'provider': 'google', }, 'outgoing': { 'host': 'smtp.gmail.com', 'port': 465, 'encryption': 'SSL', 'username': '******', 'authentication': 'OAUTH2', 'provider': 'google', } } mock_cached_delay_call.return_value = TaskResult(config_data, None) factory = TenantsAPIRequestFactory(force_authenticate=self.user) test_data = {'email': '*****@*****.**'} request = factory.post('/api/whatever/', test_data, format='json') response = EmailAccountViewSet.as_view({'post': 'create'})(request) self.assertEqual(response.status_code, 201, str(response.data)) account = response.data self.assertEqual(test_data['email'], account['email']) self.assertEqual('Pretty Smart', account['sender_name']) self.assertIn('Pretty Smart', account['signature']) # self.assertTrue(account['default']) for conf in ( 'incoming', 'outgoing', ): test_dir = config_data[conf] account_dir = account[conf] for name in ( 'host', 'port', 'encryption', 'username', 'authentication', ): self.assertEqual(test_dir[name], account_dir[name]) email_account = EmailAccount.objects.get(pk=account['id']) self.assertEqual(email_account.from_email(), "Pretty Smart <{0}>".format(test_data['email']))
def test_settings_view(self) -> None: self.set_tenant(0) factory = TenantsAPIRequestFactory(force_authenticate=self.user) request = factory.get('') response = NoticeSettingsViewSet.as_view({'get': 'list'})(request) contact_data = response.data self.assertEqual(response.status_code, status.HTTP_200_OK, str(contact_data)) self.assertEqual(2, len(contact_data))
def test_campaign_state_default(self) -> None: self.set_tenant(0) user = self.users[0] factory = TenantsAPIRequestFactory(force_authenticate=user) request = factory.post('', data=dict(name='testing settings')) response = CampaignsViewSet.as_view({'post': 'create'})(request) self.assertEqual(response.status_code, status.HTTP_201_CREATED, str(response.data)) campaign_data = response.data campaign = Campaign.objects.get(id=campaign_data['id']) self.assertEqual(CampaignStatus.DRAFT, campaign.status) self.assertEqual(CampaignStatus.DRAFT.value, campaign_data['status'])
def setUpClass(cls) -> None: super().setUpClass() cls.user = cls.create_superuser('first', '*****@*****.**', 'p', tenant=0) factory = TenantsAPIRequestFactory(force_authenticate=cls.user) request = factory.patch('', data=dict()) view = MagicMock() view.request.return_value = request cls.serializer_context = dict( view=view, request=request, )
def test_email_sending(self) -> None: self.set_tenant(0) user = self.users[0] kwargs = _generate_email_account_kwargs() EmailAccount.objects.create(user=user, email='*****@*****.**', **kwargs) contact = Contact.objects.create(email='*****@*****.**', first_name='Bob', last_name='Smith') factory = TenantsAPIRequestFactory(force_authenticate=user) request = factory.post('', data=dict( subject='single email', sender='some name', html_content='{{first_name}}, <b>thank</b> you for reply!', track_opening=True )) with patch( 'campaigns.providers.models.SmtpConnectionSettings.get_connection' ) as mocked_get_connection: mocked_get_connection.return_value = LocmemEmailBackend() response = NestedContactEmailMessageViewSet.as_view( {'post': 'create'} )(request, **{compose_parent_pk_kwarg_name('contact'): contact.id}) self.assertEqual(status.HTTP_201_CREATED, response.status_code, str(response.data)) self.assertEqual(len(mail.outbox), 1) msg = mail.outbox[0] self.assertEqual('single email', msg.subject) self.assertEqual('some name <*****@*****.**>', msg.from_email) self.assertListEqual(['*****@*****.**'], msg.to) msg_id = msg.extra_headers.get('Message-ID') self.assertIsNotNone(msg_id) inbox_message = Message.objects.get(message_id=msg_id) email_data = response.data self.assertEqual('single email', email_data['subject']) self.assertEqual('some name <*****@*****.**>', email_data['from_header']) self.assertEqual('*****@*****.**', email_data['to_header']) self.assertEqual(inbox_message.id, email_data['id']) self.assertTrue(email_data['outgoing']) self.assertIsNone(email_data['in_reply_to']) r = r'<html><body>Bob, <b>thank</b> you for reply!<img src="http://127.0.0.1:8000/.*"></body></html>' self.assertRegex(email_data['html_content'], r)
def test_steps_validation_during_patching(self) -> None: self.set_tenant(0) user = self.users[0] campaign = Campaign.objects.create(name='start/stop validation', owner=user) step = Step.objects.create(campaign=campaign, start=datetime.time(9, 45), end=datetime.time(18, 30)) factory = TenantsAPIRequestFactory(force_authenticate=user) request = factory.patch('', data=dict(timezone='UTC-0300')) response = StepViewSet.as_view({'patch': 'partial_update'})(request, **{ compose_parent_pk_kwarg_name('campaign'): campaign.id, 'pk': step.pk }) self.assertEqual(response.status_code, status.HTTP_200_OK, str(response.data)) step_data = response.data self.assertEqual(step.id, step_data['id']) self.assertEqual('UTC-0300', step_data['timezone'])
def test_contact_view(self) -> None: self.set_tenant(0) contact = Contact.objects.create(email='*****@*****.**', first_name='James', last_name='Bond') factory = TenantsAPIRequestFactory(force_authenticate=self.user) request = factory.get('') response = ContactViewSet.as_view({'get': 'list'})(request) contact_data = response.data self.assertEqual(response.status_code, status.HTTP_200_OK, str(contact_data)) self.assertEqual(1, len(contact_data)) self.assertEqual(contact.id, contact_data[0]['id']) self.assertEqual(contact.first_name, contact_data[0]['first_name']) self.assertEqual(contact.last_name, contact_data[0]['last_name'])
def campaign_move_out_of_drafts(self) -> None: self.set_tenant(0) user = self.users[0] factory = TenantsAPIRequestFactory(force_authenticate=user) request = factory.post('', data=dict(name='testing settings')) response = CampaignsViewSet.as_view({'post': 'create'})(request) self.assertEqual(response.status_code, status.HTTP_201_CREATED, str(response.data)) campaign_data = response.data self.assertSetEqual({CampaignProblems.NO_CONTACTS.value, CampaignProblems.NO_STEPS.value}, {p['code'] for p in campaign_data['problems']}) campaign = Campaign.objects.get(id=campaign_data['id']) self.assertSetEqual({CampaignProblems.NO_CONTACTS, CampaignProblems.NO_STEPS}, set(campaign.problems)) contact = Contact.objects.create(email='*****@*****.**') request = factory.post('', data=dict(contact=contact.id)) response = CampaignsParticipationViewSet.as_view({'post': 'create'})( request, **{compose_parent_pk_kwarg_name('campaign'): campaign_data['id']} ) self.assertEqual(response.status_code, status.HTTP_201_CREATED, str(response.data)) participation_data = response.data self.assertEqual(ParticipationStatus.ACTIVE.value, participation_data['status']) campaign.refresh_from_db() self.assertListEqual([CampaignProblems.NO_STEPS], campaign.problems) request = factory.post('', data=dict( weekdays=[Weekdays.Monday.value, ], start=datetime.time(8, 0, 0, 0), end=datetime.time(18, 0, 0, 0), )) response = StepViewSet.as_view({'post': 'create'})( request, **{compose_parent_pk_kwarg_name('campaign'): campaign.id, } ) self.assertEqual(response.status_code, status.HTTP_201_CREATED, str(response.data)) step_data = response.data self.assertListEqual([StepProblems.EMPTY_STEP.value], [p['code'] for p in step_data['problems']]) campaign.refresh_from_db() self.assertListEqual([CampaignProblems.EMPTY_STEP], campaign.problems) request = factory.post('', data=dict( subject='Hi {{first_name}}', html_content='{{first_name|default:"Human"}}, where are you? ', )) response = EmailStageViewSet.as_view({'post': 'create'})( request, **{ compose_parent_pk_kwarg_name('step__campaign'): campaign.id, compose_parent_pk_kwarg_name('step'): step_data['id'], } ) self.assertEqual(response.status_code, status.HTTP_201_CREATED, str(response.data)) campaign.refresh_from_db() self.assertFalse(campaign.problems) self.assertFalse(any([s.problems for s in campaign.steps.all()])) self.assertEqual(CampaignStatus.PAUSED, campaign.status)
def test_campaign_with_steps_creation_responses(self) -> None: self.set_tenant(0) user = self.users[0] campaign = Campaign.objects.create(name='this gonna be great', owner=user) factory = TenantsAPIRequestFactory(force_authenticate=user) request = factory.get('') response = CampaignsViewSet.as_view({'get': 'list'})(request) self.assertEqual(response.status_code, status.HTTP_200_OK, str(response.data)) campaigns_data = response.data self.assertEqual(1, len(campaigns_data)) campaign_data = campaigns_data[0] self.assertEqual(campaign.id, campaign_data['id']) self.assertEqual(campaign.name, campaign_data['name']) self.assertEqual(user.id, campaign_data['owner']) contact = Contact.objects.create(email='*****@*****.**') Participation.objects.create(campaign=campaign, contact=contact) request = factory.get('') response = CampaignsViewSet.as_view({'get': 'retrieve'})(request, pk=campaign_data['id']) self.assertEqual(response.status_code, status.HTTP_200_OK, str(response.data)) campaign_data = response.data self.assertEqual(1, campaign_data['contacts_count']) step = Step.objects.create(campaign=campaign, start=datetime.time(9, 45), end=datetime.time(18, 30)) request = factory.get('') response = CampaignsViewSet.as_view({'get': 'retrieve'})(request, pk=campaign_data['id']) self.assertEqual(response.status_code, status.HTTP_200_OK, str(response.data)) campaign_data = response.data steps_data = campaign_data['steps'] self.assertEqual(1, len(steps_data)) step_data = steps_data[0] self.assertEqual(step.pk, step_data)
def test_sample_emails_preview(self) -> None: self.set_tenant(0) user = self.users[0] kwargs = _generate_email_account_kwargs() provider = EmailAccount.objects.create(user=user, email='*****@*****.**', **kwargs) first_contact = Contact.objects.create(email='*****@*****.**', first_name='First', last_name='Smith') second_contact = Contact.objects.create(email='*****@*****.**', first_name='Second', last_name='Smith') campaign = Campaign.objects.create(name='cool campaign', owner=user, provider=provider, ) step = Step.objects.create(campaign=campaign, start=datetime.time(9, 45), end=datetime.time(18, 30)) EmailStage.objects.create( step=step, name='first email for second campaign', subject='My dear {{ first_name|default:"cousin" }}!', html_content='Please, send me some money, <b>{{ first_name|default:"dude" }}</b>!') Participation.objects.bulk_create([ Participation(campaign=campaign, contact=first_contact), Participation(campaign=campaign, contact=second_contact), ]) factory = TenantsAPIRequestFactory(force_authenticate=user) request = factory.get('', data=dict(contact=second_contact.id)) response = CampaignsViewSet.as_view({'get': 'preview'})(request, pk=campaign.id) self.assertEqual(status.HTTP_200_OK, response.status_code, str(response.data)) emails_list = response.data self.assertEqual(1, len(emails_list)) email_data = emails_list[0] self.assertEqual(second_contact.id, email_data['contact']) self.assertEqual(step.id, email_data['step']) self.assertListEqual([second_contact.email], email_data['to']) self.assertEqual('Please, send me some money, <b>Second</b>!', email_data['html_message']) self.assertEqual('My dear Second!', email_data['subject'])
def test_unable_to_set_different_tenant_user_as_campaign_owner(self) -> None: self.set_tenant(0) user = self.users[0] campaign = Campaign.objects.create(name='this gonna be great', owner=user) factory = TenantsAPIRequestFactory(force_authenticate=user) request = factory.get('') response = CampaignsViewSet.as_view({'get': 'retrieve'})(request, pk=campaign.pk) self.assertEqual(response.status_code, status.HTTP_200_OK, str(response.data)) other_user = self.users[2] self.assertNotEqual(other_user.profile.tenant, user.profile.tenant) factory = TenantsAPIRequestFactory(force_authenticate=user) request = factory.patch('', data=dict(owner=other_user.pk)) response = CampaignsViewSet.as_view({'patch': 'partial_update'})(request, pk=campaign.pk) self.assertEqual(status.HTTP_400_BAD_REQUEST, response.status_code, str(response.data)) self.assertDictEqual({'owner': [ 'Invalid pk "%s" - object does not exist.' % other_user.pk ]}, response.data)