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