from time import sleep from django.core import mail from django.test import TestCase, TransactionTestCase from wagtail.rich_text import RichText from wagtail.test.utils import WagtailTestUtils from wagtail.test.utils.form_data import (nested_form_data, rich_text, streamfield) from birdsong.models import CampaignStatus from tests.app.models import ExtendedContact, SaleCampaign class TestCampaignAdmin(WagtailTestUtils, TestCase): def setUp(self): self.campaign = SaleCampaign.objects.create( name="Test campaign", subject="The subject", body=[("rich_text", RichText("

The body

"))], ) self.login() def post_data(self, overrides={}): post_data = { "name": "Created campaign", "subject": "New subject", "body": streamfield([("rich_text", rich_text("

Just some content

"))]), } post_data.update(overrides) return nested_form_data(post_data) def test_create(self): response = self.client.post( "/admin/app/salecampaign/create/", self.post_data(), follow=True ) self.assertEqual(response.status_code, 200) def test_edit(self): response = self.client.post( f"/admin/app/salecampaign/edit/{self.campaign.id}/", self.post_data(overrides={"name": "A Different Name"}), follow=True, ) self.assertEqual(response.status_code, 200) self.assertContains(response, "A Different Name") def test_preview(self): response = self.client.get( f"/admin/app/salecampaign/preview/{self.campaign.id}/", ) self.assertEqual(response.status_code, 200) self.assertContains(response, "

The body

") def test_live_preview(self): # TODO (post with ajax headers?) pass class TestSending(WagtailTestUtils, TransactionTestCase): def setUp(self): self.campaign = SaleCampaign.objects.create( name="Test campaign", subject="The subject", body=[("rich_text", RichText("

The body

"))], ) for person in [ ("Terry", "Testington", "North", "terry@tests.com"), ("Wag", "Tail", "South", "wag@tail.com"), ]: ExtendedContact.objects.create( first_name=person[0], last_name=person[1], location=person[2], email=person[3], ) self.login() def test_send_test(self): self.client.post( f"/admin/app/salecampaign/send_test/{self.campaign.id}/", { "email": "have@email.com", "first_name": "Find", "last_name": "Me", "location": "Moon", }, ) sleep(3) # Allow time to send self.assertEqual(len(mail.outbox), 1) self.assertTrue("Hi Find Me" in str(mail.outbox[0].message())) self.campaign.refresh_from_db() self.assertNotEqual(self.campaign.status, CampaignStatus.SENT) def test_send(self): self.client.get(f"/admin/app/salecampaign/send_campaign/{self.campaign.id}/") sleep(3) # Allow time to send self.assertEqual(len(mail.outbox), 2) self.assertEqual(self.campaign.receipts.all().count(), 2) # Get fresh from db (altered in a thread) self.campaign.refresh_from_db() self.assertEqual(self.campaign.status, CampaignStatus.SENT)