Mercurial > public > sg101
comparison core/tests/test_functions.py @ 1228:c3fad620c08a modernize
Add unit tests for core.functions.
author | Brian Neal <bgneal@gmail.com> |
---|---|
date | Mon, 14 Apr 2025 19:07:56 -0500 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
1225:c901261c6ce8 | 1228:c3fad620c08a |
---|---|
1 from datetime import datetime | |
2 import unittest | |
3 | |
4 from django.http.request import HttpRequest | |
5 from mock import call, patch, mock_open, Mock | |
6 | |
7 from core.functions import (TemporaryFile, remove_file, send_mail, email_admins, | |
8 email_managers, get_full_name, copyright_str, get_ip, get_page, | |
9 quote_message) | |
10 | |
11 | |
12 class TemporaryFileTestCase(unittest.TestCase): | |
13 @patch('core.functions.tempfile') | |
14 @patch('core.functions.os') | |
15 def test_basic_operation(self, os_mock, tempfile_mock): | |
16 tempfile_mock.mkstemp.return_value = (42, 'temp.txt') | |
17 | |
18 with TemporaryFile(suffix='.txt') as temp: | |
19 temp.file.write('contents') | |
20 self.assertEqual(temp.fd, 42) | |
21 self.assertEqual(temp.filename, 'temp.txt') | |
22 | |
23 self.assertEqual(tempfile_mock.mkstemp.mock_calls, [ | |
24 call(suffix='.txt'), | |
25 ]) | |
26 self.assertEqual(os_mock.fdopen.mock_calls, [ | |
27 call(42, 'w+b'), call().write('contents'), call().close(), | |
28 ]) | |
29 self.assertEqual(os_mock.remove.mock_calls, [ | |
30 call('temp.txt'), | |
31 ]) | |
32 | |
33 | |
34 class RemoveFileContextManagerTestCase(unittest.TestCase): | |
35 @patch('core.functions.os') | |
36 def test_basic_operation(self, os_mock): | |
37 | |
38 path = '/tmp/temp.txt' | |
39 with remove_file(path): | |
40 pass | |
41 | |
42 self.assertEqual(os_mock.remove.mock_calls, [ | |
43 call(path), | |
44 ]) | |
45 | |
46 | |
47 class SendMailTestCase(unittest.TestCase): | |
48 @patch('core.functions.send_mail_task') | |
49 def test_no_recipients(self, task_mock): | |
50 send_mail('Subject', 'Message', 'From', []) | |
51 self.assertFalse(task_mock.delay.mock_calls) | |
52 | |
53 @patch('core.functions.send_mail_task') | |
54 def test_task_case(self, task_mock): | |
55 send_mail('Subject', 'Message', 'From', ['bob@example.com'], | |
56 reply_to='admin@example.com', defer=True) | |
57 | |
58 self.assertEqual(task_mock.delay.mock_calls, [ | |
59 call(body='Message', to=['bob@example.com'], from_email='From', | |
60 headers={'Reply-To': 'admin@example.com'}, subject='Subject'), | |
61 ]) | |
62 | |
63 @patch('core.functions.django.core.mail') | |
64 def test_django_case(self, mail_mock): | |
65 send_mail('Subject', 'Message', 'From', ['bob@example.com'], | |
66 reply_to='admin@example.com', defer=True) | |
67 | |
68 self.assertEqual(mail_mock.EmailMessage.mock_calls, [ | |
69 call(body='Message', to=['bob@example.com'], from_email='From', | |
70 headers={'Reply-To': 'admin@example.com'}, subject='Subject'), | |
71 call().send(), | |
72 ]) | |
73 | |
74 | |
75 class EmailAdminsTestCase(unittest.TestCase): | |
76 @patch('core.functions.send_mail') | |
77 @patch('core.functions.settings') | |
78 @patch('core.functions.Site.objects.get_current') | |
79 def test_email_admins(self, current_mock, settings_mock, send_mail_mock): | |
80 settings_mock.GPP_NO_REPLY_EMAIL = 'nope' | |
81 settings_mock.ADMINS = [ | |
82 ('Alice', 'alice@example.com'), | |
83 ('Bob', 'bob@example.com'), | |
84 ] | |
85 site_mock = Mock() | |
86 site_mock.configure_mock(name='Site', domain='site.com') | |
87 current_mock.return_value = site_mock | |
88 | |
89 email_admins(subject='Subject', message='Message') | |
90 | |
91 self.assertEqual(send_mail_mock.mock_calls, [ | |
92 call('[Site] Subject', 'Message', 'nope@site.com', | |
93 ['alice@example.com', 'bob@example.com']), | |
94 ]) | |
95 | |
96 | |
97 class EmailManagersTestCase(unittest.TestCase): | |
98 @patch('core.functions.send_mail') | |
99 @patch('core.functions.settings') | |
100 @patch('core.functions.Site.objects.get_current') | |
101 def test_email_admins(self, current_mock, settings_mock, send_mail_mock): | |
102 settings_mock.GPP_NO_REPLY_EMAIL = 'nope' | |
103 settings_mock.MANAGERS = [ | |
104 ('Alice', 'alice@example.com'), | |
105 ('Bob', 'bob@example.com'), | |
106 ] | |
107 site_mock = Mock() | |
108 site_mock.configure_mock(name='Site', domain='site.com') | |
109 current_mock.return_value = site_mock | |
110 | |
111 email_managers(subject='Subject', message='Message') | |
112 | |
113 self.assertEqual(send_mail_mock.mock_calls, [ | |
114 call('[Site] Subject', 'Message', 'nope@site.com', | |
115 ['alice@example.com', 'bob@example.com']), | |
116 ]) | |
117 | |
118 | |
119 class GetFullNameTestCase(unittest.TestCase): | |
120 def test_no_full_name(self): | |
121 user = Mock() | |
122 user.get_full_name.return_value = None | |
123 user.username = 'pjmoto' | |
124 | |
125 name = get_full_name(user) | |
126 | |
127 self.assertEqual(name, 'pjmoto') | |
128 | |
129 def test_has_full_name(self): | |
130 user = Mock() | |
131 user.get_full_name.return_value = 'Paul' | |
132 user.username = 'pjmoto' | |
133 | |
134 name = get_full_name(user) | |
135 | |
136 self.assertEqual(name, 'Paul') | |
137 | |
138 | |
139 class CopyrightStrTestCase(unittest.TestCase): | |
140 def test_year_range(self): | |
141 result = copyright_str() | |
142 now = datetime.now() | |
143 expected = 'Copyright (C) 2010 - {}, SurfGuitar101.com'.format(now.year) | |
144 self.assertEqual(result, expected) | |
145 | |
146 | |
147 class GetIpTestCase(unittest.TestCase): | |
148 def setUp(self): | |
149 self.request = HttpRequest() | |
150 | |
151 def test_no_ip(self): | |
152 ip = get_ip(self.request) | |
153 self.assertIsNone(ip) | |
154 | |
155 def test_found_in_forwarded_for(self): | |
156 self.request.META['HTTP_X_FORWARDED_FOR'] = '127.0.0.1' | |
157 ip = get_ip(self.request) | |
158 self.assertEqual(ip, '127.0.0.1') | |
159 | |
160 def test_found_in_remote_addr(self): | |
161 self.request.META['REMOTE_ADDR'] = '127.0.0.1' | |
162 ip = get_ip(self.request) | |
163 self.assertEqual(ip, '127.0.0.1') | |
164 | |
165 def test_invalid_found_in_remote_addr(self): | |
166 self.request.META['REMOTE_ADDR'] = 'xyz' | |
167 ip = get_ip(self.request) | |
168 self.assertIsNone(ip) | |
169 | |
170 def test_invalid_found_in_forwarded_for(self): | |
171 self.request.META['HTTP_X_FORWARDED_FOR'] = '$%#!' | |
172 ip = get_ip(self.request) | |
173 self.assertIsNone(ip) | |
174 | |
175 | |
176 class GetPageTestCase(unittest.TestCase): | |
177 def setUp(self): | |
178 self.qdict = {} | |
179 | |
180 def test_valid_page(self): | |
181 self.qdict = {'page': 42} | |
182 result = get_page(self.qdict) | |
183 self.assertEqual(result, 42) | |
184 | |
185 def test_page_not_found(self): | |
186 result = get_page(self.qdict) | |
187 self.assertEqual(result, 1) | |
188 | |
189 def test_invalid_page(self): | |
190 self.qdict = {'page': 'wut'} | |
191 result = get_page(self.qdict) | |
192 self.assertEqual(result, 1) | |
193 | |
194 | |
195 class QuoteMessageTestCase(unittest.TestCase): | |
196 def test_single_line(self): | |
197 result = quote_message('pjmoto', 'I have a new album.') | |
198 self.assertEqual(result, '*pjmoto wrote:*\n\n> I have a new album.\n\n') | |
199 | |
200 def test_multi_line(self): | |
201 result = quote_message('pjmoto', 'I have a new album.\nAAA\nBBB\n') | |
202 self.assertEqual(result, | |
203 '*pjmoto wrote:*\n\n> I have a new album.\n> AAA\n> BBB\n\n') |