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