File: test_views.py

package info (click to toggle)
python-django-contact-form 2.0.1-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 320 kB
  • sloc: python: 473; makefile: 142
file content (122 lines) | stat: -rw-r--r-- 4,388 bytes parent folder | download
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
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.test.utils import override_settings
from django.urls import reverse

from django_contact_form.forms import ContactForm


@override_settings(ROOT_URLCONF="tests.test_urls")
class ContactFormViewTests(TestCase):
    def test_get(self):
        """
        HTTP GET on the form view just shows the form.

        """
        contact_url = reverse("django_contact_form")

        response = self.client.get(contact_url)
        self.assertEqual(200, response.status_code)
        self.assertTemplateUsed(response, "django_contact_form/contact_form.html")

    def test_send(self):
        """
        Valid data through the view results in a successful send.

        """
        contact_url = reverse("django_contact_form")
        data = {"name": "Test", "email": "test@example.com", "body": "Test message"}

        response = self.client.post(contact_url, data=data)

        self.assertRedirects(response, reverse("django_contact_form_sent"))

        self.assertEqual(1, len(mail.outbox))

        message = mail.outbox[0]
        self.assertTrue(data["body"] in message.body)
        self.assertEqual(settings.DEFAULT_FROM_EMAIL, message.from_email)
        form = ContactForm(request=RequestFactory().request)
        self.assertEqual(form.recipient_list, message.recipients())

    def test_invalid(self):
        """
        Invalid data doesn't work.

        """
        contact_url = reverse("django_contact_form")
        data = {"name": "Test", "body": "Test message"}

        response = self.client.post(contact_url, data=data)

        self.assertEqual(200, response.status_code)
        self.assertFormError(response, "form", "email", "This field is required.")
        self.assertEqual(0, len(mail.outbox))

    def test_recipient_list(self):
        """
        Passing recipient_list when instantiating ContactFormView
        properly overrides the list of recipients.

        """
        contact_url = reverse("test_recipient_list")
        data = {"name": "Test", "email": "test@example.com", "body": "Test message"}

        response = self.client.post(contact_url, data=data)
        self.assertRedirects(response, reverse("django_contact_form_sent"))
        self.assertEqual(1, len(mail.outbox))

        message = mail.outbox[0]
        self.assertEqual(["recipient_list@example.com"], message.recipients())


@unittest.skipUnless(
    getattr(settings, "AKISMET_API_KEY", os.getenv("PYTHON_AKISMET_API_KEY"))
    is not None,
    "AkismetContactForm requires Akismet configuration",
)
@override_settings(ROOT_URLCONF="django_contact_form.akismet_urls")
class AkismetContactFormViewTests(TestCase):
    """
    Tests the views with the Akismet contact form.

    """

    def test_akismet_view_spam(self):
        """
        The Akismet contact form errors on spam.

        """
        contact_url = reverse("django_contact_form")
        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
            response = self.client.post(contact_url, data=data)
            self.assertEqual(200, response.status_code)
            self.assertFalse(response.context["form"].is_valid())
            self.assertTrue(response.context["form"].has_error("body"))

    def test_akismet_view_ham(self):
        contact_url = reverse("django_contact_form")
        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
            response = self.client.post(contact_url, data=data)
            self.assertRedirects(response, reverse("django_contact_form_sent"))
            self.assertEqual(1, len(mail.outbox))

            message = mail.outbox[0]
            self.assertEqual(["noreply@example.com"], message.recipients())