annotate core/tests/test_functions.py @ 1231:bbabbbb80d60 modernize tip

Add unit test for S3 upload of images.
author Brian Neal <bgneal@gmail.com>
date Sun, 20 Apr 2025 19:15:39 -0500
parents c3fad620c08a
children
rev   line source
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')