1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
|
import os
import unittest
from unittest import mock
from django.conf import settings
from django.core import mail
from django.test import RequestFactory, TestCase
from django_contact_form.forms import AkismetContactForm, ContactForm
class ContactFormTests(TestCase):
"""
Tests the base ContactForm.
"""
valid_data = {"name": "Test", "email": "test@example.com", "body": "Test message"}
def request(self):
return RequestFactory().request()
def test_request_required(self):
"""
Can't instantiate without an HttpRequest.
"""
self.assertRaises(TypeError, ContactForm)
def test_valid_data_required(self):
"""
Can't try to build the message dict unless data is valid.
"""
data = {"name": "Test", "body": "Test message"}
form = ContactForm(request=self.request(), data=data)
self.assertRaises(ValueError, form.get_message_dict)
self.assertRaises(ValueError, form.get_message_context)
def test_send(self):
"""
Valid form can and does in fact send email.
"""
form = ContactForm(request=self.request(), data=self.valid_data)
self.assertTrue(form.is_valid())
form.save()
self.assertEqual(1, len(mail.outbox))
message = mail.outbox[0]
self.assertTrue(self.valid_data["body"] in message.body)
self.assertEqual(settings.DEFAULT_FROM_EMAIL, message.from_email)
self.assertEqual(form.recipient_list, message.recipients())
def test_no_sites(self):
"""
Sites integration works with or without installed
contrib.sites.
"""
with self.modify_settings(INSTALLED_APPS={"remove": ["django.contrib.sites"]}):
form = ContactForm(request=self.request(), data=self.valid_data)
self.assertTrue(form.is_valid())
form.save()
self.assertEqual(1, len(mail.outbox))
def test_recipient_list(self):
"""
Passing recipient_list when instantiating ContactForm properly
overrides the list of recipients.
"""
recipient_list = ["recipient_list@example.com"]
form = ContactForm(
request=self.request(), data=self.valid_data, recipient_list=recipient_list
)
self.assertTrue(form.is_valid())
form.save()
self.assertEqual(1, len(mail.outbox))
message = mail.outbox[0]
self.assertEqual(recipient_list, message.recipients())
def test_callable_template_name(self):
"""
When a template_name() method is defined, it is used and
preferred over a 'template_name' attribute.
"""
class CallableTemplateName(ContactForm):
def template_name(self):
return "django_contact_form/test_callable_template_name.html"
form = CallableTemplateName(request=self.request(), data=self.valid_data)
self.assertTrue(form.is_valid())
form.save()
self.assertEqual(1, len(mail.outbox))
message = mail.outbox[0]
self.assertTrue("Callable template_name used." in message.body)
def test_callable_message_parts(self):
"""
Message parts implemented as methods are called and preferred
over attributes.
"""
overridden_data = {
"from_email": "override@example.com",
"message": "Overridden message.",
"recipient_list": ["override_recpt@example.com"],
"subject": "Overridden subject",
}
class CallableMessageParts(ContactForm):
def from_email(self):
return overridden_data["from_email"]
def message(self):
return overridden_data["message"]
def recipient_list(self):
return overridden_data["recipient_list"]
def subject(self):
return overridden_data["subject"]
form = CallableMessageParts(request=self.request(), data=self.valid_data)
self.assertTrue(form.is_valid())
self.assertEqual(overridden_data, form.get_message_dict())
@unittest.skipUnless(
getattr(settings, "AKISMET_API_KEY", os.getenv("PYTHON_AKISMET_API_KEY"))
is not None,
"AkismetContactForm requires Akismet configuration",
)
class AkismetContactFormTests(TestCase):
"""
Tests the Akismet contact form.
"""
def request(self):
return RequestFactory().request()
def test_akismet_form_spam(self):
"""
The Akismet contact form correctly rejects spam.
"""
data = {
"name": "viagra-test-123",
"email": "email@example.com",
"body": "This is spam.",
}
with mock.patch("akismet.Akismet", autospec=True) as akismet_mock:
instance = akismet_mock.return_value
instance.verify_key.return_value = True
instance.comment_check.return_value = True
form = AkismetContactForm(request=self.request(), data=data)
self.assertFalse(form.is_valid())
self.assertTrue(str(form.SPAM_MESSAGE) in form.errors["body"])
def test_akismet_form_ham(self):
"""
The Akismet contact form correctly accepts non-spam.
"""
data = {"name": "Test", "email": "email@example.com", "body": "Test message."}
with mock.patch("akismet.Akismet", autospec=True) as akismet_mock:
instance = akismet_mock.return_value
instance.verify_key.return_value = True
instance.comment_check.return_value = False
form = AkismetContactForm(request=self.request(), data=data)
self.assertTrue(form.is_valid())
def test_akismet_form_no_body(self):
"""
The Akismet contact form correctly skips validation when no email
body is provided.
"""
data = {"name": "Test", "email": "email@example.com"}
with mock.patch("akismet.Akismet", autospec=True) as akismet_mock:
form = AkismetContactForm(request=self.request(), data=data)
self.assertFalse(form.is_valid())
akismet_mock.assert_not_called()
self.assertFalse(form.is_valid())
|