bgneal@811: """ bgneal@811: Unit tests for the messages application views. bgneal@811: bgneal@811: """ bgneal@812: import datetime bgneal@812: bgneal@811: from django.test import TestCase bgneal@811: from django.core.urlresolvers import reverse bgneal@812: from django.contrib.auth.models import User bgneal@813: from django.core import mail bgneal@811: bgneal@814: import messages bgneal@811: from messages.models import Message, Options, Flag bgneal@811: bgneal@811: bgneal@811: class NotLoggedInTestCase(TestCase): bgneal@811: """Ensure we are redirected to the login page before we can do anything with bgneal@811: this application. bgneal@811: bgneal@811: """ bgneal@811: LOGIN_URL = reverse('accounts-login') bgneal@811: bgneal@811: def _test_get(self, url_name, **kwargs): bgneal@811: url = reverse(url_name, **kwargs) bgneal@811: response = self.client.get(url, follow=True) bgneal@811: self.assertRedirects(response, self.LOGIN_URL + '?next=' + url) bgneal@811: bgneal@811: def _test_post(self, url_name, **kwargs): bgneal@811: url = reverse(url_name, **kwargs) bgneal@811: response = self.client.post(url, follow=True) bgneal@811: self.assertRedirects(response, self.LOGIN_URL + '?next=' + url) bgneal@811: bgneal@811: def test_inbox(self): bgneal@811: self._test_get('messages-inbox') bgneal@811: bgneal@811: def test_compose(self): bgneal@811: url_name = 'messages-compose' bgneal@811: self._test_get(url_name) bgneal@811: self._test_post(url_name) bgneal@811: bgneal@811: def test_outbox(self): bgneal@811: self._test_get('messages-outbox') bgneal@811: bgneal@811: def test_trash(self): bgneal@811: self._test_get('messages-trash') bgneal@811: bgneal@811: def test_options(self): bgneal@811: url_name = 'messages-options' bgneal@811: self._test_get(url_name) bgneal@811: self._test_post(url_name) bgneal@811: bgneal@811: def test_delete(self): bgneal@818: self._test_get('messages-bulk') bgneal@811: bgneal@811: def test_undelete(self): bgneal@811: self._test_get('messages-undelete') bgneal@811: bgneal@811: def test_view(self): bgneal@811: url_name = 'messages-view' bgneal@811: self._test_get(url_name, args=[123]) bgneal@811: self._test_post(url_name, args=[123]) bgneal@811: bgneal@811: def test_report(self): bgneal@811: url_name = 'messages-report' bgneal@811: self._test_get(url_name, args=[123]) bgneal@811: self._test_post(url_name, args=[123]) bgneal@812: bgneal@812: bgneal@812: class BasicTestCase(TestCase): bgneal@812: """Testing a logged in user visiting all the views with no messages.""" bgneal@812: fixtures = ['messages_test_users.json'] bgneal@814: MSG_BOX_LIMIT = 3 bgneal@812: bgneal@812: def setUp(self): bgneal@812: self.users = {} bgneal@812: self.users['pj'] = User.objects.get(username='pj') bgneal@812: self.users['pj'].set_password('12345') bgneal@812: self.users['pj'].save() bgneal@812: self.assertTrue(self.client.login(username='pj', password='12345')) bgneal@812: bgneal@812: self.users['eddie'] = User.objects.get(username='eddie') bgneal@812: self.users['eddie'].set_password('12345') bgneal@812: self.users['eddie'].save() bgneal@812: bgneal@812: self.users['richard'] = User.objects.get(username='richard') bgneal@813: self.users['richard'].set_password('12345') bgneal@813: self.users['richard'].save() bgneal@812: bgneal@814: # To reduce test duration, reduce MSG_BOX_LIMIT bgneal@814: self.saved_msg_box_limit = messages.MSG_BOX_LIMIT bgneal@814: messages.MSG_BOX_LIMIT = self.MSG_BOX_LIMIT bgneal@814: bgneal@814: def tearDown(self): bgneal@814: messages.MSG_BOX_LIMIT = self.saved_msg_box_limit bgneal@814: bgneal@812: def test_simple_gets(self): bgneal@812: view_names = [ bgneal@812: 'messages-inbox', bgneal@812: 'messages-compose', bgneal@812: 'messages-outbox', bgneal@812: 'messages-trash', bgneal@812: 'messages-options', bgneal@812: ] bgneal@812: for view_name in view_names: bgneal@812: response = self.client.get(reverse(view_name)) bgneal@812: self.assertEqual(response.status_code, 200) bgneal@812: bgneal@812: def test_wrong_method(self): bgneal@812: view_names = [ bgneal@818: 'messages-bulk', bgneal@812: 'messages-undelete', bgneal@812: ] bgneal@812: for view_name in view_names: bgneal@812: response = self.client.get(reverse(view_name)) bgneal@812: self.assertEqual(response.status_code, 405) bgneal@812: bgneal@812: def test_nonexistent_pms(self): bgneal@812: view_names = [ bgneal@812: 'messages-view', bgneal@812: 'messages-report', bgneal@812: ] bgneal@812: for view_name in view_names: bgneal@812: response = self.client.get(reverse(view_name, args=[42])) bgneal@812: self.assertEqual(response.status_code, 404) bgneal@812: bgneal@812: response = self.client.post(reverse(view_name, args=[42])) bgneal@812: self.assertEqual(response.status_code, 404) bgneal@812: bgneal@812: def test_options(self): bgneal@812: view_name = 'messages-options' bgneal@812: url = reverse(view_name) bgneal@812: response = self.client.get(url) bgneal@812: self.assertEqual(response.status_code, 200) bgneal@812: bgneal@812: post_data = { bgneal@812: 'opts-attach_signature': 'on', bgneal@812: 'opts-notify_email': 'on', bgneal@812: } bgneal@812: response = self.client.post(url, data=post_data, follow=True) bgneal@812: self.assertRedirects(response, url) bgneal@812: bgneal@812: opts = Options.objects.for_user(self.users['pj']) bgneal@812: self.assertTrue(opts.attach_signature) bgneal@812: self.assertTrue(opts.notify_email) bgneal@812: bgneal@812: post_data = {} bgneal@812: response = self.client.post(url, data=post_data, follow=True) bgneal@812: self.assertRedirects(response, url) bgneal@812: bgneal@812: opts = Options.objects.for_user(self.users['pj']) bgneal@812: self.assertFalse(opts.attach_signature) bgneal@812: self.assertFalse(opts.notify_email) bgneal@812: bgneal@812: def test_send_bogus_user(self): bgneal@812: post_data = { bgneal@812: 'receiver': 'unknown_user', bgneal@812: 'subject': 'hi', bgneal@812: 'message': 'test', bgneal@812: } bgneal@812: view_name = 'messages-compose' bgneal@812: url = reverse(view_name) bgneal@812: response = self.client.post(url, data=post_data) bgneal@812: self.assertContains(response, 'username does not exist', status_code=200) bgneal@812: bgneal@812: qs = Message.objects.filter(sender=self.users['pj']) bgneal@812: self.assertEqual(qs.count(), 0) bgneal@812: bgneal@812: def test_send_to_self(self): bgneal@812: post_data = { bgneal@812: 'receiver': 'pj', bgneal@812: 'subject': 'hi', bgneal@812: 'message': 'test', bgneal@812: } bgneal@812: view_name = 'messages-compose' bgneal@812: url = reverse(view_name) bgneal@812: response = self.client.post(url, data=post_data) bgneal@812: self.assertContains(response, "You can't send a message to yourself", status_code=200) bgneal@812: bgneal@812: qs = Message.objects.filter(sender=self.users['pj']) bgneal@812: self.assertEqual(qs.count(), 0) bgneal@812: bgneal@812: def test_message_cycle(self): bgneal@812: # pj sends message to eddie bgneal@812: now = datetime.datetime.now() bgneal@812: post_data = { bgneal@812: 'receiver': 'eddie', bgneal@812: 'subject': 'Mr. Moto Demo', bgneal@812: 'message': 'Gig at Newport High School', bgneal@812: } bgneal@812: view_name = 'messages-compose' bgneal@812: url = reverse(view_name) bgneal@812: response = self.client.post(url, data=post_data) bgneal@812: self.assertContains(response, "Message sent", status_code=200) bgneal@812: bgneal@812: # see if message got created in database bgneal@812: msg = Message.objects.get(sender=self.users['pj']) bgneal@812: bgneal@812: self.assertEqual(msg.sender, self.users['pj']) bgneal@812: self.assertEqual(msg.receiver, self.users['eddie']) bgneal@812: self.assertTrue(now - msg.send_date < datetime.timedelta(seconds=5)) bgneal@812: self.assertIsNone(msg.read_date) bgneal@812: self.assertIsNone(msg.reply_date) bgneal@812: self.assertEqual(msg.subject, post_data['subject']) bgneal@812: self.assertEqual(msg.message, post_data['message']) bgneal@812: self.assertIsNone(msg.sender_delete_date) bgneal@812: self.assertIsNone(msg.receiver_delete_date) bgneal@812: bgneal@812: # see if shows up in outbox view bgneal@812: view_name = 'messages-outbox' bgneal@812: url = reverse(view_name) bgneal@812: response = self.client.get(url) bgneal@812: self.assertContains(response, post_data['subject'], status_code=200) bgneal@812: bgneal@812: # see if we can view it bgneal@812: view_name = 'messages-view' bgneal@812: url = reverse(view_name, args=[msg.pk]) bgneal@812: response = self.client.get(url) bgneal@812: self.assertContains(response, post_data['subject'], status_code=200) bgneal@812: self.assertContains(response, post_data['message'], status_code=200) bgneal@812: bgneal@812: # eddie logs in and checks various views bgneal@812: self.assertTrue(self.client.login(username='eddie', password='12345')) bgneal@812: view_name = 'messages-inbox' bgneal@812: url = reverse(view_name) bgneal@812: response = self.client.get(url) bgneal@812: self.assertContains(response, post_data['subject'], status_code=200) bgneal@812: view_name = 'messages-outbox' bgneal@812: url = reverse(view_name) bgneal@812: response = self.client.get(url) bgneal@812: self.assertNotContains(response, post_data['subject'], status_code=200) bgneal@812: view_name = 'messages-trash' bgneal@812: url = reverse(view_name) bgneal@812: response = self.client.get(url) bgneal@812: self.assertNotContains(response, post_data['subject'], status_code=200) bgneal@812: bgneal@812: # eddie reads it bgneal@812: view_name = 'messages-view' bgneal@812: url = reverse(view_name, args=[msg.pk]) bgneal@812: response = self.client.get(url) bgneal@812: self.assertContains(response, post_data['subject'], status_code=200) bgneal@812: self.assertContains(response, post_data['message'], status_code=200) bgneal@812: bgneal@812: # see if message got updated in database bgneal@812: msg = Message.objects.get(receiver=self.users['eddie']) bgneal@812: bgneal@812: self.assertEqual(msg.sender, self.users['pj']) bgneal@812: self.assertEqual(msg.receiver, self.users['eddie']) bgneal@812: self.assertTrue(now - msg.send_date < datetime.timedelta(seconds=5)) bgneal@812: self.assertTrue(now - msg.read_date < datetime.timedelta(seconds=5)) bgneal@812: self.assertIsNone(msg.reply_date) bgneal@812: self.assertEqual(msg.subject, post_data['subject']) bgneal@812: self.assertEqual(msg.message, post_data['message']) bgneal@812: self.assertIsNone(msg.sender_delete_date) bgneal@812: self.assertIsNone(msg.receiver_delete_date) bgneal@812: bgneal@812: # eddie replies bgneal@812: post_data2 = { bgneal@812: 'receiver': 'pj', bgneal@812: 'subject': 'Re: Mr. Moto Demo', bgneal@812: 'message': 'South Bay Sound', bgneal@812: 'parent_id': msg.pk, bgneal@812: } bgneal@812: view_name = 'messages-compose' bgneal@812: url = reverse(view_name) bgneal@812: response = self.client.post(url, data=post_data2) bgneal@812: self.assertContains(response, "Message sent", status_code=200) bgneal@812: bgneal@812: self.assertEqual(Message.objects.all().count(), 2) bgneal@812: bgneal@812: msg1 = Message.objects.get(receiver=self.users['eddie']) bgneal@812: bgneal@812: self.assertEqual(msg1.sender, self.users['pj']) bgneal@812: self.assertEqual(msg1.receiver, self.users['eddie']) bgneal@812: self.assertTrue(now - msg1.send_date < datetime.timedelta(seconds=5)) bgneal@812: self.assertTrue(now - msg1.read_date < datetime.timedelta(seconds=5)) bgneal@812: self.assertTrue(now - msg1.reply_date < datetime.timedelta(seconds=5)) bgneal@812: self.assertEqual(msg1.subject, post_data['subject']) bgneal@812: self.assertEqual(msg1.message, post_data['message']) bgneal@812: self.assertIsNone(msg1.sender_delete_date) bgneal@812: self.assertIsNone(msg1.receiver_delete_date) bgneal@812: bgneal@812: msg2 = Message.objects.get(receiver=self.users['pj']) bgneal@812: bgneal@812: self.assertEqual(msg2.sender, self.users['eddie']) bgneal@812: self.assertEqual(msg2.receiver, self.users['pj']) bgneal@812: self.assertTrue(now - msg2.send_date < datetime.timedelta(seconds=5)) bgneal@812: self.assertIsNone(msg2.read_date) bgneal@812: self.assertIsNone(msg2.reply_date) bgneal@812: self.assertEqual(msg2.subject, post_data2['subject']) bgneal@812: self.assertEqual(msg2.message, post_data2['message']) bgneal@812: self.assertIsNone(msg2.sender_delete_date) bgneal@812: self.assertIsNone(msg2.receiver_delete_date) bgneal@812: bgneal@812: # pj logs in and checks various views bgneal@812: self.assertTrue(self.client.login(username='pj', password='12345')) bgneal@812: view_name = 'messages-inbox' bgneal@812: url = reverse(view_name) bgneal@812: response = self.client.get(url) bgneal@812: self.assertContains(response, post_data2['subject'], status_code=200) bgneal@812: view_name = 'messages-outbox' bgneal@812: url = reverse(view_name) bgneal@812: response = self.client.get(url) bgneal@812: self.assertContains(response, post_data['subject'], status_code=200) bgneal@812: view_name = 'messages-trash' bgneal@812: url = reverse(view_name) bgneal@812: response = self.client.get(url) bgneal@812: self.assertNotContains(response, post_data['subject'], status_code=200) bgneal@812: self.assertNotContains(response, post_data2['subject'], status_code=200) bgneal@812: bgneal@812: # pj reads reply bgneal@812: view_name = 'messages-view' bgneal@812: url = reverse(view_name, args=[msg2.pk]) bgneal@812: response = self.client.get(url) bgneal@812: self.assertContains(response, post_data2['subject'], status_code=200) bgneal@812: self.assertContains(response, post_data2['message'], status_code=200) bgneal@812: bgneal@812: msg = Message.objects.get(receiver=self.users['eddie']) bgneal@812: bgneal@812: self.assertEqual(msg.sender, self.users['pj']) bgneal@812: self.assertEqual(msg.receiver, self.users['eddie']) bgneal@812: self.assertTrue(now - msg.send_date < datetime.timedelta(seconds=5)) bgneal@812: self.assertTrue(now - msg.read_date < datetime.timedelta(seconds=5)) bgneal@812: self.assertTrue(now - msg.reply_date < datetime.timedelta(seconds=5)) bgneal@812: self.assertEqual(msg.subject, post_data['subject']) bgneal@812: self.assertEqual(msg.message, post_data['message']) bgneal@812: self.assertIsNone(msg.sender_delete_date) bgneal@812: self.assertIsNone(msg.receiver_delete_date) bgneal@812: bgneal@812: msg2 = Message.objects.get(receiver=self.users['pj']) bgneal@812: bgneal@812: self.assertEqual(msg2.sender, self.users['eddie']) bgneal@812: self.assertEqual(msg2.receiver, self.users['pj']) bgneal@812: self.assertTrue(now - msg2.send_date < datetime.timedelta(seconds=5)) bgneal@812: self.assertTrue(now - msg2.read_date < datetime.timedelta(seconds=5)) bgneal@812: self.assertIsNone(msg2.reply_date) bgneal@812: self.assertEqual(msg2.subject, post_data2['subject']) bgneal@812: self.assertEqual(msg2.message, post_data2['message']) bgneal@812: self.assertIsNone(msg2.sender_delete_date) bgneal@812: self.assertIsNone(msg2.receiver_delete_date) bgneal@812: bgneal@812: # pj deletes message 2 bgneal@812: self.assertEqual(Message.objects.all().count(), 2) bgneal@812: bgneal@812: delete_post_data = { bgneal@812: 'pm_ids': [msg2.pk], bgneal@818: 'action': 'Delete', bgneal@812: } bgneal@818: view_name = 'messages-bulk' bgneal@812: url = reverse(view_name) bgneal@812: response = self.client.post(url, data=delete_post_data, follow=True) bgneal@812: self.assertContains(response, "1 message deleted", status_code=200) bgneal@812: bgneal@812: self.assertEqual(Message.objects.all().count(), 2) bgneal@812: bgneal@812: msg2 = Message.objects.get(receiver=self.users['pj']) bgneal@812: bgneal@812: self.assertEqual(msg2.sender, self.users['eddie']) bgneal@812: self.assertEqual(msg2.receiver, self.users['pj']) bgneal@812: self.assertTrue(now - msg2.send_date < datetime.timedelta(seconds=5)) bgneal@812: self.assertTrue(now - msg2.read_date < datetime.timedelta(seconds=5)) bgneal@812: self.assertIsNone(msg2.reply_date) bgneal@812: self.assertEqual(msg2.subject, post_data2['subject']) bgneal@812: self.assertEqual(msg2.message, post_data2['message']) bgneal@812: self.assertIsNone(msg2.sender_delete_date) bgneal@812: self.assertTrue(now - msg2.receiver_delete_date < datetime.timedelta(seconds=5)) bgneal@812: bgneal@812: # should be in pj's trash now bgneal@812: view_name = 'messages-trash' bgneal@812: url = reverse(view_name) bgneal@812: response = self.client.get(url) bgneal@812: self.assertContains(response, post_data2['subject'], status_code=200) bgneal@812: bgneal@812: # eddie logs in and deletes his copy of message 2 bgneal@812: self.assertTrue(self.client.login(username='eddie', password='12345')) bgneal@812: delete_post_data = { bgneal@812: 'pm_ids': [msg2.pk], bgneal@818: 'action': 'Delete', bgneal@812: } bgneal@818: view_name = 'messages-bulk' bgneal@812: url = reverse(view_name) bgneal@812: response = self.client.post(url, data=delete_post_data, follow=True) bgneal@812: self.assertContains(response, "1 message deleted", status_code=200) bgneal@812: bgneal@812: # should be really deleted now bgneal@812: self.assertEqual(Message.objects.all().count(), 1) bgneal@812: view_name = 'messages-trash' bgneal@812: url = reverse(view_name) bgneal@812: response = self.client.get(url) bgneal@812: self.assertNotContains(response, post_data2['subject'], status_code=200) bgneal@812: bgneal@812: # eddie deletes then undeletes message 1 bgneal@812: delete_post_data = { bgneal@812: 'pm_ids': [msg1.pk], bgneal@818: 'action': 'Delete', bgneal@812: } bgneal@818: view_name = 'messages-bulk' bgneal@812: url = reverse(view_name) bgneal@812: response = self.client.post(url, data=delete_post_data, follow=True) bgneal@812: self.assertContains(response, "1 message deleted", status_code=200) bgneal@812: bgneal@812: # should not be really deleted now bgneal@812: self.assertEqual(Message.objects.all().count(), 1) bgneal@812: view_name = 'messages-trash' bgneal@812: url = reverse(view_name) bgneal@812: response = self.client.get(url) bgneal@812: self.assertContains(response, post_data['subject'], status_code=200) bgneal@812: bgneal@812: msg1 = Message.objects.get(receiver=self.users['eddie']) bgneal@812: bgneal@812: self.assertEqual(msg1.sender, self.users['pj']) bgneal@812: self.assertEqual(msg1.receiver, self.users['eddie']) bgneal@812: self.assertTrue(now - msg1.send_date < datetime.timedelta(seconds=5)) bgneal@812: self.assertTrue(now - msg1.read_date < datetime.timedelta(seconds=5)) bgneal@812: self.assertTrue(now - msg1.reply_date < datetime.timedelta(seconds=5)) bgneal@812: self.assertEqual(msg1.subject, post_data['subject']) bgneal@812: self.assertEqual(msg1.message, post_data['message']) bgneal@812: self.assertIsNone(msg1.sender_delete_date) bgneal@812: self.assertTrue(now - msg1.receiver_delete_date < datetime.timedelta(seconds=5)) bgneal@812: bgneal@812: delete_post_data = { bgneal@812: 'pm_ids': [msg1.pk], bgneal@812: } bgneal@812: view_name = 'messages-undelete' bgneal@812: url = reverse(view_name) bgneal@812: response = self.client.post(url, data=delete_post_data, follow=True) bgneal@812: self.assertContains(response, "1 message undeleted", status_code=200) bgneal@812: bgneal@812: # should not be really deleted now bgneal@812: self.assertEqual(Message.objects.all().count(), 1) bgneal@812: view_name = 'messages-trash' bgneal@812: url = reverse(view_name) bgneal@812: response = self.client.get(url) bgneal@812: self.assertNotContains(response, post_data['subject'], status_code=200) bgneal@812: bgneal@812: msg1 = Message.objects.get(receiver=self.users['eddie']) bgneal@812: bgneal@812: self.assertEqual(msg1.sender, self.users['pj']) bgneal@812: self.assertEqual(msg1.receiver, self.users['eddie']) bgneal@812: self.assertTrue(now - msg1.send_date < datetime.timedelta(seconds=5)) bgneal@812: self.assertTrue(now - msg1.read_date < datetime.timedelta(seconds=5)) bgneal@812: self.assertTrue(now - msg1.reply_date < datetime.timedelta(seconds=5)) bgneal@812: self.assertEqual(msg1.subject, post_data['subject']) bgneal@812: self.assertEqual(msg1.message, post_data['message']) bgneal@812: self.assertIsNone(msg1.sender_delete_date) bgneal@812: self.assertIsNone(msg1.receiver_delete_date) bgneal@812: bgneal@812: def test_read_permission(self): bgneal@812: bgneal@812: now = datetime.datetime.now() bgneal@812: # pj sends a PM to richard bgneal@812: post_data = { bgneal@812: 'receiver': 'richard', bgneal@812: 'subject': 'Mr. Moto Demo', bgneal@812: 'message': 'Gig at Newport High School', bgneal@812: } bgneal@812: view_name = 'messages-compose' bgneal@812: url = reverse(view_name) bgneal@812: response = self.client.post(url, data=post_data) bgneal@812: self.assertContains(response, "Message sent", status_code=200) bgneal@812: bgneal@812: msg = Message.objects.get(sender=self.users['pj']) bgneal@812: bgneal@812: # eddie should not be able to read it bgneal@812: self.assertTrue(self.client.login(username='eddie', password='12345')) bgneal@812: view_name = 'messages-view' bgneal@812: url = reverse(view_name, args=[msg.pk]) bgneal@812: response = self.client.get(url) bgneal@812: self.assertNotContains(response, post_data['subject'], status_code=302) bgneal@812: self.assertNotContains(response, post_data['message'], status_code=302) bgneal@812: bgneal@812: response = self.client.get(url, follow=True) bgneal@812: self.assertNotContains(response, post_data['subject'], status_code=200) bgneal@812: self.assertNotContains(response, post_data['message'], status_code=200) bgneal@812: bgneal@812: msg = Message.objects.get(sender=self.users['pj']) bgneal@812: bgneal@812: self.assertEqual(msg.sender, self.users['pj']) bgneal@812: self.assertEqual(msg.receiver, self.users['richard']) bgneal@812: self.assertTrue(now - msg.send_date < datetime.timedelta(seconds=5)) bgneal@812: self.assertIsNone(msg.read_date) bgneal@812: self.assertIsNone(msg.reply_date) bgneal@812: self.assertEqual(msg.subject, post_data['subject']) bgneal@812: self.assertEqual(msg.message, post_data['message']) bgneal@812: self.assertIsNone(msg.sender_delete_date) bgneal@812: self.assertIsNone(msg.receiver_delete_date) bgneal@813: bgneal@813: def test_report_message(self): bgneal@813: post_data = { bgneal@813: 'receiver': 'eddie', bgneal@813: 'subject': 'Mr. Moto Demo', bgneal@813: 'message': 'Gig at Newport High School', bgneal@813: } bgneal@813: view_name = 'messages-compose' bgneal@813: url = reverse(view_name) bgneal@813: response = self.client.post(url, data=post_data) bgneal@813: self.assertContains(response, "Message sent", status_code=200) bgneal@813: bgneal@813: msg = Message.objects.get(sender=self.users['pj']) bgneal@813: bgneal@813: # Ensure non-recipients can't report a message bgneal@813: view_name = 'messages-report' bgneal@813: url = reverse(view_name, args=[msg.pk]) bgneal@813: response = self.client.post(url, data={}, follow=True) bgneal@813: self.assertContains(response, "You can't report this message", status_code=200) bgneal@813: self.assertEqual(Flag.objects.count(), 0) bgneal@813: bgneal@813: self.assertTrue(self.client.login(username='richard', password='12345')) bgneal@813: response = self.client.post(url, data={}, follow=True) bgneal@813: self.assertContains(response, "You can't report this message", status_code=200) bgneal@813: self.assertEqual(Flag.objects.count(), 0) bgneal@813: bgneal@813: # Test bogus report bgneal@813: self.assertTrue(self.client.login(username='eddie', password='12345')) bgneal@813: bad_url = reverse(view_name, args=[msg.pk + 1]) bgneal@813: response = self.client.post(bad_url, data={}) bgneal@813: self.assertEqual(response.status_code, 404) bgneal@813: self.assertEqual(Flag.objects.count(), 0) bgneal@813: bgneal@813: # Test get of report view bgneal@813: response = self.client.get(url) bgneal@813: self.assertEqual(response.status_code, 200) bgneal@813: bgneal@813: # Test posting to report view bgneal@813: post_data = { bgneal@813: 'comments': 'This is abuse!', bgneal@813: } bgneal@813: now = datetime.datetime.now() bgneal@813: response = self.client.post(url, data=post_data, follow=True) bgneal@813: self.assertContains(response, "Message reported", status_code=200) bgneal@813: bgneal@813: self.assertEqual(Flag.objects.count(), 1) bgneal@813: msg = Message.objects.get(receiver=self.users['eddie']) bgneal@813: bgneal@813: try: bgneal@813: flag = msg.flag bgneal@813: except Flag.DoesNotExist: bgneal@813: self.fail("msg.flag does not exist!") bgneal@813: bgneal@813: self.assertEqual(flag.message, msg) bgneal@813: self.assertTrue(now - flag.flag_date < datetime.timedelta(seconds=2)) bgneal@813: self.assertEqual(flag.comments, post_data['comments']) bgneal@813: bgneal@813: # Admin should have been sent an email bgneal@813: self.assertEqual(len(mail.outbox), 1) bgneal@813: email = mail.outbox[0] bgneal@813: self.assertEqual(len(email.recipients()), 1) bgneal@813: self.assertEqual(email.recipients()[0], 'admin@surfguitar101.com') bgneal@813: self.assertTrue(email.subject.endswith('A user has flagged a private message')) bgneal@813: bgneal@814: def test_inbox_full(self): bgneal@814: bgneal@814: post_data = { bgneal@814: 'receiver': 'eddie', bgneal@814: 'subject': 'Mr. Moto Demo', bgneal@814: 'message': 'Gig at Newport High School', bgneal@814: } bgneal@814: view_name = 'messages-compose' bgneal@814: url = reverse(view_name) bgneal@814: for n in range(self.MSG_BOX_LIMIT): bgneal@814: response = self.client.post(url, data=post_data) bgneal@814: self.assertEqual(Message.objects.all().count(), self.MSG_BOX_LIMIT) bgneal@814: bgneal@814: # pj deletes a message so we can make sure we are testing inbox full bgneal@814: msg = Message.objects.filter(receiver=self.users['eddie']).last() bgneal@814: msg.sender_delete_date = datetime.datetime.now() bgneal@814: msg.save() bgneal@814: self.assertEqual(Message.objects.all().count(), self.MSG_BOX_LIMIT) bgneal@814: self.assertEqual(Message.objects.outbox(self.users['pj']).count(), bgneal@814: self.MSG_BOX_LIMIT - 1) bgneal@814: self.assertEqual(Message.objects.inbox(self.users['eddie']).count(), bgneal@814: self.MSG_BOX_LIMIT) bgneal@814: bgneal@814: # pj should not be able to send another bgneal@814: response = self.client.post(url, data=post_data) bgneal@814: self.assertNotContains(response, "Message sent", status_code=200) bgneal@814: self.assertContains(response, "inbox is full", status_code=200) bgneal@814: self.assertEqual(Message.objects.all().count(), self.MSG_BOX_LIMIT) bgneal@814: bgneal@814: def test_outbox_full(self): bgneal@814: bgneal@814: post_data = { bgneal@814: 'receiver': 'eddie', bgneal@814: 'subject': 'Mr. Moto Demo', bgneal@814: 'message': 'Gig at Newport High School', bgneal@814: } bgneal@814: view_name = 'messages-compose' bgneal@814: url = reverse(view_name) bgneal@814: for n in range(self.MSG_BOX_LIMIT): bgneal@814: response = self.client.post(url, data=post_data) bgneal@814: self.assertContains(response, "Message sent", status_code=200) bgneal@814: self.assertEqual(Message.objects.all().count(), self.MSG_BOX_LIMIT) bgneal@814: bgneal@814: # eddie deletes a message so we can make sure we are testing outbox full bgneal@814: msg = Message.objects.filter(receiver=self.users['eddie']).last() bgneal@814: msg.read_date = datetime.datetime.now() bgneal@814: msg.receiver_delete_date = msg.read_date bgneal@814: msg.save() bgneal@814: self.assertEqual(Message.objects.all().count(), self.MSG_BOX_LIMIT) bgneal@814: self.assertEqual(Message.objects.outbox(self.users['pj']).count(), bgneal@814: self.MSG_BOX_LIMIT) bgneal@814: self.assertEqual(Message.objects.inbox(self.users['eddie']).count(), bgneal@814: self.MSG_BOX_LIMIT - 1) bgneal@814: bgneal@814: # pj should not be able to send another bgneal@814: response = self.client.post(url, data=post_data) bgneal@814: self.assertNotContains(response, "Message sent", status_code=200) bgneal@814: self.assertContains(response, "Your outbox is full", status_code=200) bgneal@814: self.assertEqual(Message.objects.all().count(), self.MSG_BOX_LIMIT) bgneal@814: bgneal@818: def test_email_export(self): bgneal@818: bgneal@818: post_data = { bgneal@818: 'receiver': 'eddie', bgneal@818: 'subject': 'Mr. Moto Demo', bgneal@818: 'message': 'Gig at Newport High School', bgneal@818: } bgneal@818: view_name = 'messages-compose' bgneal@818: url = reverse(view_name) bgneal@818: response = self.client.post(url, data=post_data) bgneal@818: self.assertContains(response, "Message sent", status_code=200) bgneal@818: bgneal@818: msg = Message.objects.get(receiver=self.users['eddie']) bgneal@818: post_data = { bgneal@818: 'pm_ids': [msg.id], bgneal@818: 'action': 'Email', bgneal@818: } bgneal@818: view_name = 'messages-bulk' bgneal@818: url = reverse(view_name) bgneal@818: response = self.client.post(url, data=post_data, follow=True) bgneal@818: self.assertContains(response, "1 message sent to email", status_code=200) bgneal@818: bgneal@818: # Ensure email sent bgneal@818: self.assertEqual(len(mail.outbox), 1) bgneal@818: bgneal@818: if len(mail.outbox) == 1: bgneal@818: email = mail.outbox[0] bgneal@818: self.assertEqual(len(email.recipients()), 1) bgneal@818: self.assertEqual(email.recipients()[0], 'pj@example.com') bgneal@818: self.assertTrue(email.subject.startswith('Private messages from')) bgneal@818: bgneal@813: bgneal@813: class EmailTestCase(TestCase): bgneal@813: """Testing to ensure email is sent when PM is sent if options allow.""" bgneal@813: fixtures = ['messages_test_users.json'] bgneal@813: bgneal@813: def setUp(self): bgneal@813: self.users = {} bgneal@813: self.users['pj'] = User.objects.get(username='pj') bgneal@813: self.users['pj'].set_password('12345') bgneal@813: self.users['pj'].save() bgneal@813: self.assertTrue(self.client.login(username='pj', password='12345')) bgneal@813: bgneal@813: self.users['eddie'] = User.objects.get(username='eddie') bgneal@813: self.users['eddie'].set_password('12345') bgneal@813: self.users['eddie'].save() bgneal@813: bgneal@813: def _test_email(self, email_expected): bgneal@813: # pj sends message to eddie bgneal@813: post_data = { bgneal@813: 'receiver': 'eddie', bgneal@813: 'subject': 'Mr. Moto Demo', bgneal@813: 'message': 'Gig at Newport High School', bgneal@813: } bgneal@813: view_name = 'messages-compose' bgneal@813: url = reverse(view_name) bgneal@813: response = self.client.post(url, data=post_data) bgneal@813: self.assertContains(response, "Message sent", status_code=200) bgneal@813: bgneal@813: # Ensure notification email sent bgneal@813: count = 1 if email_expected else 0 bgneal@813: self.assertEqual(len(mail.outbox), count) bgneal@813: bgneal@813: if count == 1: bgneal@813: email = mail.outbox[0] bgneal@813: self.assertEqual(len(email.recipients()), 1) bgneal@813: self.assertEqual(email.recipients()[0], 'eddie@example.com') bgneal@813: self.assertTrue(email.subject.startswith('New private message')) bgneal@813: bgneal@813: def test_email_sent(self): bgneal@813: # eddie elects to receive email notifications bgneal@813: # Note: testing the options view is done above. bgneal@813: opts = Options.objects.for_user(self.users['eddie']) bgneal@813: opts.notify_email = True bgneal@813: opts.save() bgneal@813: self._test_email(True) bgneal@813: bgneal@813: def test_no_email(self): bgneal@813: # eddie does not to elect to receive email notifications bgneal@813: opts = Options.objects.for_user(self.users['eddie']) bgneal@813: opts.notify_email = False bgneal@813: opts.save() bgneal@813: self._test_email(False)