summaryrefslogtreecommitdiff
path: root/contact/tests.py
blob: cf5f0b5028e15981696a17d89e0939c8698643f4 (plain)
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
from unittest import skipIf

import requests
from django.core import mail
from django.http import HttpRequest
from django.test import TestCase
from django.test.utils import override_settings

from djangoproject.tests import ReleaseMixin

from .views import FoundationContactForm


def check_network_connection():
    try:
        requests.get("https://djangoproject.com")
    except requests.exceptions.ConnectionError:
        return False
    return True


has_network_connection = check_network_connection()


@override_settings(AKISMET_TESTING=True)
class ContactFormTests(ReleaseMixin, TestCase):
    def setUp(self):
        self.url = "/contact/foundation/"

    @override_settings(AKISMET_API_KEY="")  # Disable Akismet in tests
    def test_invalid_email(self):
        response = self.client.post(
            self.url,
            {
                "name": "A. Random Hacker",
                "email": "xxx",
                "message_subject": "Hello",
                "body": "Hello, World!",
            },
        )
        self.assertEqual(response.status_code, 200)
        self.assertFormError(
            response.context["form"], "email", ["Enter a valid email address."]
        )

    @override_settings(AKISMET_API_KEY="")  # Disable Akismet in tests
    def test_without_akismet(self):
        response = self.client.post(
            self.url,
            {
                "name": "A. Random Hacker",
                "email": "a.random@example.com",
                "message_subject": "Hello",
                "body": "Hello, World!",
                "captcha": "TESTING",
            },
        )
        self.assertRedirects(response, "/contact/sent/")
        self.assertEqual(mail.outbox[-1].subject, "[Contact form] Hello")

    @skipIf(not has_network_connection, "Requires a network connection")
    def test_empty_name(self):
        response = self.client.post(
            self.url,
            {
                "name": "",
                "email": "a.random@example.com",
                "message_subject": "Hello",
                "body": "Hello, World!",
            },
        )
        self.assertFormError(
            response.context["form"], "name", ["This field is required."]
        )

    @skipIf(not has_network_connection, "Requires a network connection")
    def test_akismet_detect_spam(self):
        response = self.client.post(
            self.url,
            {
                # according to akismet this should flag as spam
                "name": "viagra-test-123",
                "email": "a.random@example.com",
                "message_subject": "Hello",
                "body": "Hello, World!",
            },
        )
        self.assertContains(response, "Akismet thinks this message is spam")
        self.assertEqual(len(mail.outbox), 0)

    @skipIf(not has_network_connection, "Requires a network connection")
    def test_akismet_not_spam(self):
        response = self.client.post(
            self.url,
            {
                "name": "administrator",
                "email": "a.random@example.com",
                "message_subject": "Hello",
                "body": "Hello, World!",
                "captcha": "TESTING",
            },
        )
        self.assertRedirects(response, "/contact/sent/")
        self.assertEqual(mail.outbox[-1].subject, "[Contact form] Hello")

    @skipIf(not has_network_connection, "Requires a network connection")
    def test_captcha_token_required(self):
        form = FoundationContactForm(
            data={
                "name": "administrator",
                "email": "a.random@example.com",
                "message_subject": "Hello",
                "body": "Hello, World!",
            },
            request=HttpRequest(),
        )
        self.assertFalse(form.is_valid())
        self.assertIn("captcha", form.errors)