|
|
|
@@ -1,3 +1,127 @@
|
|
|
|
|
from django.test import TestCase
|
|
|
|
|
from unittest.mock import patch
|
|
|
|
|
|
|
|
|
|
# Create your tests here.
|
|
|
|
|
from django.test import Client, TestCase, override_settings
|
|
|
|
|
from django.urls import reverse
|
|
|
|
|
|
|
|
|
|
from .models import Contact
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@override_settings(
|
|
|
|
|
DEBUG=True,
|
|
|
|
|
EMAIL_BACKEND="django.core.mail.backends.locmem.EmailBackend",
|
|
|
|
|
)
|
|
|
|
|
class ContactViewTests(TestCase):
|
|
|
|
|
def setUp(self):
|
|
|
|
|
self.client = Client()
|
|
|
|
|
self.url = reverse("contact")
|
|
|
|
|
self.valid_payload = {
|
|
|
|
|
"name": "Jane Doe",
|
|
|
|
|
"email": "jane@example.com",
|
|
|
|
|
"subject": "Automation inquiry",
|
|
|
|
|
"message": "We need help automating our workflow.",
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
def test_contact_get_renders_form(self):
|
|
|
|
|
response = self.client.get(self.url)
|
|
|
|
|
|
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
self.assertContains(response, "Send Us a Message")
|
|
|
|
|
self.assertContains(response, 'name="name"')
|
|
|
|
|
self.assertContains(response, 'name="email"')
|
|
|
|
|
self.assertContains(response, 'name="subject"')
|
|
|
|
|
|
|
|
|
|
@patch("public.views.send_contact_email")
|
|
|
|
|
def test_contact_post_success_saves_contact_and_sends_email(self, mock_send_email):
|
|
|
|
|
response = self.client.post(self.url, self.valid_payload)
|
|
|
|
|
|
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
self.assertContains(response, "We'll be in contact shortly!")
|
|
|
|
|
|
|
|
|
|
contact = Contact.objects.get()
|
|
|
|
|
self.assertEqual(contact.name, "Jane Doe")
|
|
|
|
|
self.assertEqual(contact.email, "jane@example.com")
|
|
|
|
|
self.assertEqual(contact.subject, "Automation inquiry")
|
|
|
|
|
self.assertEqual(contact.blurb, "We need help automating our workflow.")
|
|
|
|
|
self.assertFalse(contact.contacted)
|
|
|
|
|
|
|
|
|
|
mock_send_email.assert_called_once_with(
|
|
|
|
|
"jane@example.com",
|
|
|
|
|
"Automation inquiry",
|
|
|
|
|
"We need help automating our workflow.",
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
@patch("public.views.send_contact_email")
|
|
|
|
|
def test_contact_post_without_message_still_succeeds(self, mock_send_email):
|
|
|
|
|
payload = {**self.valid_payload, "message": ""}
|
|
|
|
|
|
|
|
|
|
response = self.client.post(self.url, payload)
|
|
|
|
|
|
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
self.assertContains(response, "We'll be in contact shortly!")
|
|
|
|
|
self.assertEqual(Contact.objects.count(), 1)
|
|
|
|
|
self.assertEqual(Contact.objects.get().blurb, "")
|
|
|
|
|
mock_send_email.assert_called_once()
|
|
|
|
|
|
|
|
|
|
def test_contact_post_missing_name_shows_error(self):
|
|
|
|
|
payload = {**self.valid_payload, "name": ""}
|
|
|
|
|
|
|
|
|
|
response = self.client.post(self.url, payload)
|
|
|
|
|
|
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
self.assertContains(response, "Name is required")
|
|
|
|
|
self.assertEqual(Contact.objects.count(), 0)
|
|
|
|
|
|
|
|
|
|
def test_contact_post_missing_email_shows_error(self):
|
|
|
|
|
payload = {**self.valid_payload, "email": ""}
|
|
|
|
|
|
|
|
|
|
response = self.client.post(self.url, payload)
|
|
|
|
|
|
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
self.assertContains(response, "Email is required")
|
|
|
|
|
self.assertEqual(Contact.objects.count(), 0)
|
|
|
|
|
|
|
|
|
|
def test_contact_post_missing_name_and_email_shows_error(self):
|
|
|
|
|
payload = {**self.valid_payload, "name": "", "email": ""}
|
|
|
|
|
|
|
|
|
|
response = self.client.post(self.url, payload)
|
|
|
|
|
|
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
self.assertContains(response, "Both name and email are required")
|
|
|
|
|
self.assertEqual(Contact.objects.count(), 0)
|
|
|
|
|
|
|
|
|
|
def test_contact_post_missing_subject_does_not_save(self):
|
|
|
|
|
payload = {**self.valid_payload, "subject": ""}
|
|
|
|
|
|
|
|
|
|
response = self.client.post(self.url, payload)
|
|
|
|
|
|
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
self.assertNotContains(response, "We'll be in contact shortly!")
|
|
|
|
|
self.assertEqual(Contact.objects.count(), 0)
|
|
|
|
|
|
|
|
|
|
@override_settings(DEBUG=False)
|
|
|
|
|
@patch("public.views.FormWithCaptcha.is_valid", return_value=False)
|
|
|
|
|
def test_contact_post_invalid_captcha_shows_error(self, _mock_is_valid):
|
|
|
|
|
response = self.client.post(self.url, self.valid_payload)
|
|
|
|
|
|
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
self.assertContains(response, "There was an error submitting. Try again")
|
|
|
|
|
self.assertEqual(Contact.objects.count(), 0)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@override_settings(DEBUG=True, TIANJI_ENABLED=True)
|
|
|
|
|
class TianjiTrackingTests(TestCase):
|
|
|
|
|
def test_homepage_includes_consent_banner_when_enabled(self):
|
|
|
|
|
response = self.client.get(reverse("public_index"))
|
|
|
|
|
|
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
self.assertContains(response, "cookie-consent-banner")
|
|
|
|
|
self.assertContains(response, "tianji-config")
|
|
|
|
|
self.assertContains(response, "tianji-consent.js")
|
|
|
|
|
|
|
|
|
|
@override_settings(TIANJI_ENABLED=False)
|
|
|
|
|
def test_homepage_omits_consent_banner_when_disabled(self):
|
|
|
|
|
response = self.client.get(reverse("public_index"))
|
|
|
|
|
|
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
|
|
|
self.assertNotContains(response, "cookie-consent-banner")
|
|
|
|
|
self.assertNotContains(response, "tianji-config")
|
|
|
|
|