changeset 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 c901261c6ce8
children 51172fb756f4
files core/tests/test_functions.py
diffstat 1 files changed, 203 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/tests/test_functions.py	Mon Apr 14 19:07:56 2025 -0500
@@ -0,0 +1,203 @@
+from datetime import datetime
+import unittest
+
+from django.http.request import HttpRequest
+from mock import call, patch, mock_open, Mock
+
+from core.functions import (TemporaryFile, remove_file, send_mail, email_admins,
+    email_managers, get_full_name, copyright_str, get_ip, get_page,
+    quote_message)
+
+
+class TemporaryFileTestCase(unittest.TestCase):
+    @patch('core.functions.tempfile')
+    @patch('core.functions.os')
+    def test_basic_operation(self, os_mock, tempfile_mock):
+        tempfile_mock.mkstemp.return_value = (42, 'temp.txt')
+
+        with TemporaryFile(suffix='.txt') as temp:
+            temp.file.write('contents')
+            self.assertEqual(temp.fd, 42)
+            self.assertEqual(temp.filename, 'temp.txt')
+
+        self.assertEqual(tempfile_mock.mkstemp.mock_calls, [
+            call(suffix='.txt'),
+        ])
+        self.assertEqual(os_mock.fdopen.mock_calls, [
+            call(42, 'w+b'), call().write('contents'), call().close(),
+        ])
+        self.assertEqual(os_mock.remove.mock_calls, [
+            call('temp.txt'),
+        ])
+
+
+class RemoveFileContextManagerTestCase(unittest.TestCase):
+    @patch('core.functions.os')
+    def test_basic_operation(self, os_mock):
+
+        path = '/tmp/temp.txt'
+        with remove_file(path):
+            pass
+
+        self.assertEqual(os_mock.remove.mock_calls, [
+            call(path),
+        ])
+
+
+class SendMailTestCase(unittest.TestCase):
+    @patch('core.functions.send_mail_task')
+    def test_no_recipients(self, task_mock):
+        send_mail('Subject', 'Message', 'From', [])
+        self.assertFalse(task_mock.delay.mock_calls)
+
+    @patch('core.functions.send_mail_task')
+    def test_task_case(self, task_mock):
+        send_mail('Subject', 'Message', 'From', ['bob@example.com'],
+                  reply_to='admin@example.com', defer=True)
+
+        self.assertEqual(task_mock.delay.mock_calls, [
+            call(body='Message', to=['bob@example.com'], from_email='From',
+                 headers={'Reply-To': 'admin@example.com'}, subject='Subject'),
+        ])
+
+    @patch('core.functions.django.core.mail')
+    def test_django_case(self, mail_mock):
+        send_mail('Subject', 'Message', 'From', ['bob@example.com'],
+                  reply_to='admin@example.com', defer=True)
+
+        self.assertEqual(mail_mock.EmailMessage.mock_calls, [
+            call(body='Message', to=['bob@example.com'], from_email='From',
+                 headers={'Reply-To': 'admin@example.com'}, subject='Subject'),
+            call().send(),
+        ])
+
+
+class EmailAdminsTestCase(unittest.TestCase):
+    @patch('core.functions.send_mail')
+    @patch('core.functions.settings')
+    @patch('core.functions.Site.objects.get_current')
+    def test_email_admins(self, current_mock, settings_mock, send_mail_mock):
+        settings_mock.GPP_NO_REPLY_EMAIL = 'nope'
+        settings_mock.ADMINS = [
+            ('Alice', 'alice@example.com'),
+            ('Bob', 'bob@example.com'),
+        ]
+        site_mock = Mock()
+        site_mock.configure_mock(name='Site', domain='site.com')
+        current_mock.return_value = site_mock
+
+        email_admins(subject='Subject', message='Message')
+
+        self.assertEqual(send_mail_mock.mock_calls, [
+            call('[Site] Subject', 'Message', 'nope@site.com',
+                 ['alice@example.com', 'bob@example.com']),
+        ])
+
+
+class EmailManagersTestCase(unittest.TestCase):
+    @patch('core.functions.send_mail')
+    @patch('core.functions.settings')
+    @patch('core.functions.Site.objects.get_current')
+    def test_email_admins(self, current_mock, settings_mock, send_mail_mock):
+        settings_mock.GPP_NO_REPLY_EMAIL = 'nope'
+        settings_mock.MANAGERS = [
+            ('Alice', 'alice@example.com'),
+            ('Bob', 'bob@example.com'),
+        ]
+        site_mock = Mock()
+        site_mock.configure_mock(name='Site', domain='site.com')
+        current_mock.return_value = site_mock
+
+        email_managers(subject='Subject', message='Message')
+
+        self.assertEqual(send_mail_mock.mock_calls, [
+            call('[Site] Subject', 'Message', 'nope@site.com',
+                 ['alice@example.com', 'bob@example.com']),
+        ])
+
+
+class GetFullNameTestCase(unittest.TestCase):
+    def test_no_full_name(self):
+        user = Mock()
+        user.get_full_name.return_value = None
+        user.username = 'pjmoto'
+
+        name = get_full_name(user)
+
+        self.assertEqual(name, 'pjmoto')
+
+    def test_has_full_name(self):
+        user = Mock()
+        user.get_full_name.return_value = 'Paul'
+        user.username = 'pjmoto'
+
+        name = get_full_name(user)
+
+        self.assertEqual(name, 'Paul')
+
+
+class CopyrightStrTestCase(unittest.TestCase):
+    def test_year_range(self):
+        result = copyright_str()
+        now = datetime.now()
+        expected = 'Copyright (C) 2010 - {}, SurfGuitar101.com'.format(now.year)
+        self.assertEqual(result, expected)
+
+
+class GetIpTestCase(unittest.TestCase):
+    def setUp(self):
+        self.request = HttpRequest()
+
+    def test_no_ip(self):
+        ip = get_ip(self.request)
+        self.assertIsNone(ip)
+
+    def test_found_in_forwarded_for(self):
+        self.request.META['HTTP_X_FORWARDED_FOR'] = '127.0.0.1'
+        ip = get_ip(self.request)
+        self.assertEqual(ip, '127.0.0.1')
+
+    def test_found_in_remote_addr(self):
+        self.request.META['REMOTE_ADDR'] = '127.0.0.1'
+        ip = get_ip(self.request)
+        self.assertEqual(ip, '127.0.0.1')
+
+    def test_invalid_found_in_remote_addr(self):
+        self.request.META['REMOTE_ADDR'] = 'xyz'
+        ip = get_ip(self.request)
+        self.assertIsNone(ip)
+
+    def test_invalid_found_in_forwarded_for(self):
+        self.request.META['HTTP_X_FORWARDED_FOR'] = '$%#!'
+        ip = get_ip(self.request)
+        self.assertIsNone(ip)
+
+
+class GetPageTestCase(unittest.TestCase):
+    def setUp(self):
+        self.qdict = {}
+
+    def test_valid_page(self):
+        self.qdict = {'page': 42}
+        result = get_page(self.qdict)
+        self.assertEqual(result, 42)
+
+    def test_page_not_found(self):
+        result = get_page(self.qdict)
+        self.assertEqual(result, 1)
+
+    def test_invalid_page(self):
+        self.qdict = {'page': 'wut'}
+        result = get_page(self.qdict)
+        self.assertEqual(result, 1)
+
+
+class QuoteMessageTestCase(unittest.TestCase):
+    def test_single_line(self):
+        result = quote_message('pjmoto', 'I have a new album.')
+        self.assertEqual(result, '*pjmoto wrote:*\n\n> I have a new album.\n\n')
+
+    def test_multi_line(self):
+        result = quote_message('pjmoto', 'I have a new album.\nAAA\nBBB\n')
+        self.assertEqual(result,
+                '*pjmoto wrote:*\n\n> I have a new album.\n> AAA\n> BBB\n\n')