コード例 #1
0
    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)
コード例 #2
0
    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']))
コード例 #3
0
    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))
コード例 #4
0
    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'])
コード例 #5
0
    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,
        )
コード例 #6
0
    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)
コード例 #7
0
    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'])
コード例 #8
0
    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'])
コード例 #9
0
    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)
コード例 #10
0
    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)
コード例 #11
0
    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'])
コード例 #12
0
    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)