def test_list(self): list_url = reverse("notifications.notification_list") # simulate an export finishing export = ExportContactsTask.create(self.org, self.editor) Notification.export_finished(export) # not access for anon self.assertLoginRedirect(self.client.get(list_url)) # check for user with no notifications self.login(self.user) response = self.client.get(list_url) self.assertEqual({"results": []}, response.json()) # check for editor who should have an export completed notification self.login(self.editor) response = self.client.get(list_url) self.assertEqual( { "results": [{ "type": "export:finished", "created_on": matchers.ISODate(), "target_url": f"/assets/download/contact_export/{export.id}/", "is_seen": False, "export": { "type": "contact" }, }] }, response.json(), )
def test_contact_export_finished(self): export = ExportContactsTask.create(self.org, self.editor) export.perform() Notification.export_finished(export) self.assertFalse( self.editor.notifications.get(contact_export=export).is_seen) # we only notify the user that started the export self.assert_notifications( after=export.created_on, expected_json={ "type": "export:finished", "created_on": matchers.ISODate(), "target_url": f"/assets/download/contact_export/{export.id}/", "is_seen": False, "export": { "type": "contact" }, }, expected_users={self.editor}, email=True, ) send_notification_emails() self.assertEqual(1, len(mail.outbox)) self.assertEqual("[Temba] Your contact export is ready", mail.outbox[0].subject) self.assertEqual(["*****@*****.**"], mail.outbox[0].recipients()) # calling task again won't send more emails send_notification_emails() self.assertEqual(1, len(mail.outbox)) # if a user visits the export download page, their notification for that export is now read self.login(self.editor) self.client.get(export.get_download_url()) self.assertTrue( self.editor.notifications.get(contact_export=export).is_seen)
def test_download(self): # create a message export message_export_task = ExportMessagesTask.create( self.org, self.admin, SystemLabel.TYPE_INBOX) response = self.client.get( reverse("assets.download", kwargs=dict(type="message_export", pk=message_export_task.pk))) self.assertLoginRedirect(response) self.login(self.admin) # asset doesn't exist yet response = self.client.get( reverse("assets.download", kwargs=dict(type="message_export", pk=message_export_task.pk))) self.assertContains(response, "File not found", status_code=200) # specify wrong asset type so db object won't exist response = self.client.get( reverse("assets.download", kwargs=dict(type="contact_export", pk=message_export_task.pk))) self.assertContains(response, "File not found", status_code=200) # create asset and request again with correct type message_export_task.perform() response = self.client.get( reverse("assets.download", kwargs=dict(type="message_export", pk=message_export_task.pk))) self.assertContains(response, "Your download should start automatically", status_code=200) # check direct download stream response = self.client.get( reverse("assets.stream", kwargs=dict(type="message_export", pk=message_export_task.pk))) self.assertEqual(response.status_code, 200) # create contact export and check that we can access it contact_export_task = ExportContactsTask.create(self.org, self.admin) contact_export_task.perform() response = self.client.get( reverse("assets.download", kwargs=dict(type="contact_export", pk=contact_export_task.pk))) self.assertContains(response, "Your download should start automatically", status_code=200) # create flow results export and check that we can access it flow = self.create_flow() results_export_task = ExportFlowResultsTask.objects.create( org=self.org, created_by=self.admin, modified_by=self.admin) results_export_task.flows.add(flow) results_export_task.perform() response = self.client.get( reverse("assets.download", kwargs=dict(type="results_export", pk=results_export_task.pk))) self.assertContains(response, "Your download should start automatically", status_code=200) # add our admin to another org self.setUpSecondaryOrg() self.org2.administrators.add(self.admin) self.admin.set_org(self.org2) s = self.client.session s["org_id"] = self.org2.pk s.save() # as this asset belongs to org #1, request will have that context response = self.client.get( reverse("assets.download", kwargs=dict(type="message_export", pk=message_export_task.pk))) self.assertEqual(200, response.status_code) user = response.context_data["view"].request.user self.assertEqual(user, self.admin) self.assertEqual(user.get_org(), self.org)
def test_download(self): # create a message export message_export_task = ExportMessagesTask.create(self.org, self.admin, SystemLabel.TYPE_INBOX) response = self.client.get( reverse("assets.download", kwargs=dict(type="message_export", pk=message_export_task.pk)) ) self.assertLoginRedirect(response) self.login(self.admin) # asset doesn't exist yet response = self.client.get( reverse("assets.download", kwargs=dict(type="message_export", pk=message_export_task.pk)) ) self.assertContains(response, "File not found", status_code=200) # specify wrong asset type so db object won't exist response = self.client.get( reverse("assets.download", kwargs=dict(type="contact_export", pk=message_export_task.pk)) ) self.assertContains(response, "File not found", status_code=200) # create asset and request again with correct type message_export_task.perform() response = self.client.get( reverse("assets.download", kwargs=dict(type="message_export", pk=message_export_task.pk)) ) self.assertContains(response, "Your download should start automatically", status_code=200) # check direct download stream response = self.client.get( reverse("assets.stream", kwargs=dict(type="message_export", pk=message_export_task.pk)) ) self.assertEqual(response.status_code, 200) # create contact export and check that we can access it contact_export_task = ExportContactsTask.create(self.org, self.admin) contact_export_task.perform() response = self.client.get( reverse("assets.download", kwargs=dict(type="contact_export", pk=contact_export_task.pk)) ) self.assertContains(response, "Your download should start automatically", status_code=200) # create flow results export and check that we can access it flow = self.create_flow() results_export_task = ExportFlowResultsTask.objects.create( org=self.org, created_by=self.admin, modified_by=self.admin ) results_export_task.flows.add(flow) results_export_task.perform() response = self.client.get( reverse("assets.download", kwargs=dict(type="results_export", pk=results_export_task.pk)) ) self.assertContains(response, "Your download should start automatically", status_code=200) # add our admin to another org self.create_secondary_org() self.org2.administrators.add(self.admin) self.admin.set_org(self.org2) s = self.client.session s["org_id"] = self.org2.pk s.save() # as this asset belongs to org #1, request will have that context response = self.client.get( reverse("assets.download", kwargs=dict(type="message_export", pk=message_export_task.pk)) ) self.assertEqual(200, response.status_code) user = response.context_data["view"].request.user self.assertEqual(user, self.admin) self.assertEqual(user.get_org(), self.org)