annotate messages/tests/test_views.py @ 989:2908859c2fe4

Smilies now use relative links. This is for upcoming switch to SSL. Currently we do not need absolute URLs for smilies. If this changes we can add it later.
author Brian Neal <bgneal@gmail.com>
date Thu, 29 Oct 2015 20:54:34 -0500
parents cf486a8e8b43
children
rev   line source
bgneal@811 1 """
bgneal@811 2 Unit tests for the messages application views.
bgneal@811 3
bgneal@811 4 """
bgneal@812 5 import datetime
bgneal@812 6
bgneal@811 7 from django.test import TestCase
bgneal@811 8 from django.core.urlresolvers import reverse
bgneal@812 9 from django.contrib.auth.models import User
bgneal@813 10 from django.core import mail
bgneal@811 11
bgneal@814 12 import messages
bgneal@811 13 from messages.models import Message, Options, Flag
bgneal@811 14
bgneal@811 15
bgneal@811 16 class NotLoggedInTestCase(TestCase):
bgneal@811 17 """Ensure we are redirected to the login page before we can do anything with
bgneal@811 18 this application.
bgneal@811 19
bgneal@811 20 """
bgneal@811 21 LOGIN_URL = reverse('accounts-login')
bgneal@811 22
bgneal@811 23 def _test_get(self, url_name, **kwargs):
bgneal@811 24 url = reverse(url_name, **kwargs)
bgneal@811 25 response = self.client.get(url, follow=True)
bgneal@811 26 self.assertRedirects(response, self.LOGIN_URL + '?next=' + url)
bgneal@811 27
bgneal@811 28 def _test_post(self, url_name, **kwargs):
bgneal@811 29 url = reverse(url_name, **kwargs)
bgneal@811 30 response = self.client.post(url, follow=True)
bgneal@811 31 self.assertRedirects(response, self.LOGIN_URL + '?next=' + url)
bgneal@811 32
bgneal@811 33 def test_inbox(self):
bgneal@811 34 self._test_get('messages-inbox')
bgneal@811 35
bgneal@811 36 def test_compose(self):
bgneal@811 37 url_name = 'messages-compose'
bgneal@811 38 self._test_get(url_name)
bgneal@811 39 self._test_post(url_name)
bgneal@811 40
bgneal@811 41 def test_outbox(self):
bgneal@811 42 self._test_get('messages-outbox')
bgneal@811 43
bgneal@811 44 def test_trash(self):
bgneal@811 45 self._test_get('messages-trash')
bgneal@811 46
bgneal@811 47 def test_options(self):
bgneal@811 48 url_name = 'messages-options'
bgneal@811 49 self._test_get(url_name)
bgneal@811 50 self._test_post(url_name)
bgneal@811 51
bgneal@811 52 def test_delete(self):
bgneal@818 53 self._test_get('messages-bulk')
bgneal@811 54
bgneal@811 55 def test_undelete(self):
bgneal@811 56 self._test_get('messages-undelete')
bgneal@811 57
bgneal@811 58 def test_view(self):
bgneal@811 59 url_name = 'messages-view'
bgneal@811 60 self._test_get(url_name, args=[123])
bgneal@811 61 self._test_post(url_name, args=[123])
bgneal@811 62
bgneal@811 63 def test_report(self):
bgneal@811 64 url_name = 'messages-report'
bgneal@811 65 self._test_get(url_name, args=[123])
bgneal@811 66 self._test_post(url_name, args=[123])
bgneal@812 67
bgneal@812 68
bgneal@812 69 class BasicTestCase(TestCase):
bgneal@812 70 """Testing a logged in user visiting all the views with no messages."""
bgneal@812 71 fixtures = ['messages_test_users.json']
bgneal@814 72 MSG_BOX_LIMIT = 3
bgneal@812 73
bgneal@812 74 def setUp(self):
bgneal@812 75 self.users = {}
bgneal@812 76 self.users['pj'] = User.objects.get(username='pj')
bgneal@812 77 self.users['pj'].set_password('12345')
bgneal@812 78 self.users['pj'].save()
bgneal@812 79 self.assertTrue(self.client.login(username='pj', password='12345'))
bgneal@812 80
bgneal@812 81 self.users['eddie'] = User.objects.get(username='eddie')
bgneal@812 82 self.users['eddie'].set_password('12345')
bgneal@812 83 self.users['eddie'].save()
bgneal@812 84
bgneal@812 85 self.users['richard'] = User.objects.get(username='richard')
bgneal@813 86 self.users['richard'].set_password('12345')
bgneal@813 87 self.users['richard'].save()
bgneal@812 88
bgneal@814 89 # To reduce test duration, reduce MSG_BOX_LIMIT
bgneal@814 90 self.saved_msg_box_limit = messages.MSG_BOX_LIMIT
bgneal@814 91 messages.MSG_BOX_LIMIT = self.MSG_BOX_LIMIT
bgneal@814 92
bgneal@814 93 def tearDown(self):
bgneal@814 94 messages.MSG_BOX_LIMIT = self.saved_msg_box_limit
bgneal@814 95
bgneal@812 96 def test_simple_gets(self):
bgneal@812 97 view_names = [
bgneal@812 98 'messages-inbox',
bgneal@812 99 'messages-compose',
bgneal@812 100 'messages-outbox',
bgneal@812 101 'messages-trash',
bgneal@812 102 'messages-options',
bgneal@812 103 ]
bgneal@812 104 for view_name in view_names:
bgneal@812 105 response = self.client.get(reverse(view_name))
bgneal@812 106 self.assertEqual(response.status_code, 200)
bgneal@812 107
bgneal@812 108 def test_wrong_method(self):
bgneal@812 109 view_names = [
bgneal@818 110 'messages-bulk',
bgneal@812 111 'messages-undelete',
bgneal@812 112 ]
bgneal@812 113 for view_name in view_names:
bgneal@812 114 response = self.client.get(reverse(view_name))
bgneal@812 115 self.assertEqual(response.status_code, 405)
bgneal@812 116
bgneal@812 117 def test_nonexistent_pms(self):
bgneal@812 118 view_names = [
bgneal@812 119 'messages-view',
bgneal@812 120 'messages-report',
bgneal@812 121 ]
bgneal@812 122 for view_name in view_names:
bgneal@812 123 response = self.client.get(reverse(view_name, args=[42]))
bgneal@812 124 self.assertEqual(response.status_code, 404)
bgneal@812 125
bgneal@812 126 response = self.client.post(reverse(view_name, args=[42]))
bgneal@812 127 self.assertEqual(response.status_code, 404)
bgneal@812 128
bgneal@812 129 def test_options(self):
bgneal@812 130 view_name = 'messages-options'
bgneal@812 131 url = reverse(view_name)
bgneal@812 132 response = self.client.get(url)
bgneal@812 133 self.assertEqual(response.status_code, 200)
bgneal@812 134
bgneal@812 135 post_data = {
bgneal@812 136 'opts-attach_signature': 'on',
bgneal@812 137 'opts-notify_email': 'on',
bgneal@812 138 }
bgneal@812 139 response = self.client.post(url, data=post_data, follow=True)
bgneal@812 140 self.assertRedirects(response, url)
bgneal@812 141
bgneal@812 142 opts = Options.objects.for_user(self.users['pj'])
bgneal@812 143 self.assertTrue(opts.attach_signature)
bgneal@812 144 self.assertTrue(opts.notify_email)
bgneal@812 145
bgneal@812 146 post_data = {}
bgneal@812 147 response = self.client.post(url, data=post_data, follow=True)
bgneal@812 148 self.assertRedirects(response, url)
bgneal@812 149
bgneal@812 150 opts = Options.objects.for_user(self.users['pj'])
bgneal@812 151 self.assertFalse(opts.attach_signature)
bgneal@812 152 self.assertFalse(opts.notify_email)
bgneal@812 153
bgneal@812 154 def test_send_bogus_user(self):
bgneal@812 155 post_data = {
bgneal@812 156 'receiver': 'unknown_user',
bgneal@812 157 'subject': 'hi',
bgneal@812 158 'message': 'test',
bgneal@812 159 }
bgneal@812 160 view_name = 'messages-compose'
bgneal@812 161 url = reverse(view_name)
bgneal@812 162 response = self.client.post(url, data=post_data)
bgneal@812 163 self.assertContains(response, 'username does not exist', status_code=200)
bgneal@812 164
bgneal@812 165 qs = Message.objects.filter(sender=self.users['pj'])
bgneal@812 166 self.assertEqual(qs.count(), 0)
bgneal@812 167
bgneal@812 168 def test_send_to_self(self):
bgneal@812 169 post_data = {
bgneal@812 170 'receiver': 'pj',
bgneal@812 171 'subject': 'hi',
bgneal@812 172 'message': 'test',
bgneal@812 173 }
bgneal@812 174 view_name = 'messages-compose'
bgneal@812 175 url = reverse(view_name)
bgneal@812 176 response = self.client.post(url, data=post_data)
bgneal@812 177 self.assertContains(response, "You can&#39;t send a message to yourself", status_code=200)
bgneal@812 178
bgneal@812 179 qs = Message.objects.filter(sender=self.users['pj'])
bgneal@812 180 self.assertEqual(qs.count(), 0)
bgneal@812 181
bgneal@812 182 def test_message_cycle(self):
bgneal@812 183 # pj sends message to eddie
bgneal@812 184 now = datetime.datetime.now()
bgneal@812 185 post_data = {
bgneal@812 186 'receiver': 'eddie',
bgneal@812 187 'subject': 'Mr. Moto Demo',
bgneal@812 188 'message': 'Gig at Newport High School',
bgneal@812 189 }
bgneal@812 190 view_name = 'messages-compose'
bgneal@812 191 url = reverse(view_name)
bgneal@812 192 response = self.client.post(url, data=post_data)
bgneal@812 193 self.assertContains(response, "Message sent", status_code=200)
bgneal@812 194
bgneal@812 195 # see if message got created in database
bgneal@812 196 msg = Message.objects.get(sender=self.users['pj'])
bgneal@812 197
bgneal@812 198 self.assertEqual(msg.sender, self.users['pj'])
bgneal@812 199 self.assertEqual(msg.receiver, self.users['eddie'])
bgneal@812 200 self.assertTrue(now - msg.send_date < datetime.timedelta(seconds=5))
bgneal@812 201 self.assertIsNone(msg.read_date)
bgneal@812 202 self.assertIsNone(msg.reply_date)
bgneal@812 203 self.assertEqual(msg.subject, post_data['subject'])
bgneal@812 204 self.assertEqual(msg.message, post_data['message'])
bgneal@812 205 self.assertIsNone(msg.sender_delete_date)
bgneal@812 206 self.assertIsNone(msg.receiver_delete_date)
bgneal@812 207
bgneal@812 208 # see if shows up in outbox view
bgneal@812 209 view_name = 'messages-outbox'
bgneal@812 210 url = reverse(view_name)
bgneal@812 211 response = self.client.get(url)
bgneal@812 212 self.assertContains(response, post_data['subject'], status_code=200)
bgneal@812 213
bgneal@812 214 # see if we can view it
bgneal@812 215 view_name = 'messages-view'
bgneal@812 216 url = reverse(view_name, args=[msg.pk])
bgneal@812 217 response = self.client.get(url)
bgneal@812 218 self.assertContains(response, post_data['subject'], status_code=200)
bgneal@812 219 self.assertContains(response, post_data['message'], status_code=200)
bgneal@812 220
bgneal@812 221 # eddie logs in and checks various views
bgneal@812 222 self.assertTrue(self.client.login(username='eddie', password='12345'))
bgneal@812 223 view_name = 'messages-inbox'
bgneal@812 224 url = reverse(view_name)
bgneal@812 225 response = self.client.get(url)
bgneal@812 226 self.assertContains(response, post_data['subject'], status_code=200)
bgneal@812 227 view_name = 'messages-outbox'
bgneal@812 228 url = reverse(view_name)
bgneal@812 229 response = self.client.get(url)
bgneal@812 230 self.assertNotContains(response, post_data['subject'], status_code=200)
bgneal@812 231 view_name = 'messages-trash'
bgneal@812 232 url = reverse(view_name)
bgneal@812 233 response = self.client.get(url)
bgneal@812 234 self.assertNotContains(response, post_data['subject'], status_code=200)
bgneal@812 235
bgneal@812 236 # eddie reads it
bgneal@812 237 view_name = 'messages-view'
bgneal@812 238 url = reverse(view_name, args=[msg.pk])
bgneal@812 239 response = self.client.get(url)
bgneal@812 240 self.assertContains(response, post_data['subject'], status_code=200)
bgneal@812 241 self.assertContains(response, post_data['message'], status_code=200)
bgneal@812 242
bgneal@812 243 # see if message got updated in database
bgneal@812 244 msg = Message.objects.get(receiver=self.users['eddie'])
bgneal@812 245
bgneal@812 246 self.assertEqual(msg.sender, self.users['pj'])
bgneal@812 247 self.assertEqual(msg.receiver, self.users['eddie'])
bgneal@812 248 self.assertTrue(now - msg.send_date < datetime.timedelta(seconds=5))
bgneal@812 249 self.assertTrue(now - msg.read_date < datetime.timedelta(seconds=5))
bgneal@812 250 self.assertIsNone(msg.reply_date)
bgneal@812 251 self.assertEqual(msg.subject, post_data['subject'])
bgneal@812 252 self.assertEqual(msg.message, post_data['message'])
bgneal@812 253 self.assertIsNone(msg.sender_delete_date)
bgneal@812 254 self.assertIsNone(msg.receiver_delete_date)
bgneal@812 255
bgneal@812 256 # eddie replies
bgneal@812 257 post_data2 = {
bgneal@812 258 'receiver': 'pj',
bgneal@812 259 'subject': 'Re: Mr. Moto Demo',
bgneal@812 260 'message': 'South Bay Sound',
bgneal@812 261 'parent_id': msg.pk,
bgneal@812 262 }
bgneal@812 263 view_name = 'messages-compose'
bgneal@812 264 url = reverse(view_name)
bgneal@812 265 response = self.client.post(url, data=post_data2)
bgneal@812 266 self.assertContains(response, "Message sent", status_code=200)
bgneal@812 267
bgneal@812 268 self.assertEqual(Message.objects.all().count(), 2)
bgneal@812 269
bgneal@812 270 msg1 = Message.objects.get(receiver=self.users['eddie'])
bgneal@812 271
bgneal@812 272 self.assertEqual(msg1.sender, self.users['pj'])
bgneal@812 273 self.assertEqual(msg1.receiver, self.users['eddie'])
bgneal@812 274 self.assertTrue(now - msg1.send_date < datetime.timedelta(seconds=5))
bgneal@812 275 self.assertTrue(now - msg1.read_date < datetime.timedelta(seconds=5))
bgneal@812 276 self.assertTrue(now - msg1.reply_date < datetime.timedelta(seconds=5))
bgneal@812 277 self.assertEqual(msg1.subject, post_data['subject'])
bgneal@812 278 self.assertEqual(msg1.message, post_data['message'])
bgneal@812 279 self.assertIsNone(msg1.sender_delete_date)
bgneal@812 280 self.assertIsNone(msg1.receiver_delete_date)
bgneal@812 281
bgneal@812 282 msg2 = Message.objects.get(receiver=self.users['pj'])
bgneal@812 283
bgneal@812 284 self.assertEqual(msg2.sender, self.users['eddie'])
bgneal@812 285 self.assertEqual(msg2.receiver, self.users['pj'])
bgneal@812 286 self.assertTrue(now - msg2.send_date < datetime.timedelta(seconds=5))
bgneal@812 287 self.assertIsNone(msg2.read_date)
bgneal@812 288 self.assertIsNone(msg2.reply_date)
bgneal@812 289 self.assertEqual(msg2.subject, post_data2['subject'])
bgneal@812 290 self.assertEqual(msg2.message, post_data2['message'])
bgneal@812 291 self.assertIsNone(msg2.sender_delete_date)
bgneal@812 292 self.assertIsNone(msg2.receiver_delete_date)
bgneal@812 293
bgneal@812 294 # pj logs in and checks various views
bgneal@812 295 self.assertTrue(self.client.login(username='pj', password='12345'))
bgneal@812 296 view_name = 'messages-inbox'
bgneal@812 297 url = reverse(view_name)
bgneal@812 298 response = self.client.get(url)
bgneal@812 299 self.assertContains(response, post_data2['subject'], status_code=200)
bgneal@812 300 view_name = 'messages-outbox'
bgneal@812 301 url = reverse(view_name)
bgneal@812 302 response = self.client.get(url)
bgneal@812 303 self.assertContains(response, post_data['subject'], status_code=200)
bgneal@812 304 view_name = 'messages-trash'
bgneal@812 305 url = reverse(view_name)
bgneal@812 306 response = self.client.get(url)
bgneal@812 307 self.assertNotContains(response, post_data['subject'], status_code=200)
bgneal@812 308 self.assertNotContains(response, post_data2['subject'], status_code=200)
bgneal@812 309
bgneal@812 310 # pj reads reply
bgneal@812 311 view_name = 'messages-view'
bgneal@812 312 url = reverse(view_name, args=[msg2.pk])
bgneal@812 313 response = self.client.get(url)
bgneal@812 314 self.assertContains(response, post_data2['subject'], status_code=200)
bgneal@812 315 self.assertContains(response, post_data2['message'], status_code=200)
bgneal@812 316
bgneal@812 317 msg = Message.objects.get(receiver=self.users['eddie'])
bgneal@812 318
bgneal@812 319 self.assertEqual(msg.sender, self.users['pj'])
bgneal@812 320 self.assertEqual(msg.receiver, self.users['eddie'])
bgneal@812 321 self.assertTrue(now - msg.send_date < datetime.timedelta(seconds=5))
bgneal@812 322 self.assertTrue(now - msg.read_date < datetime.timedelta(seconds=5))
bgneal@812 323 self.assertTrue(now - msg.reply_date < datetime.timedelta(seconds=5))
bgneal@812 324 self.assertEqual(msg.subject, post_data['subject'])
bgneal@812 325 self.assertEqual(msg.message, post_data['message'])
bgneal@812 326 self.assertIsNone(msg.sender_delete_date)
bgneal@812 327 self.assertIsNone(msg.receiver_delete_date)
bgneal@812 328
bgneal@812 329 msg2 = Message.objects.get(receiver=self.users['pj'])
bgneal@812 330
bgneal@812 331 self.assertEqual(msg2.sender, self.users['eddie'])
bgneal@812 332 self.assertEqual(msg2.receiver, self.users['pj'])
bgneal@812 333 self.assertTrue(now - msg2.send_date < datetime.timedelta(seconds=5))
bgneal@812 334 self.assertTrue(now - msg2.read_date < datetime.timedelta(seconds=5))
bgneal@812 335 self.assertIsNone(msg2.reply_date)
bgneal@812 336 self.assertEqual(msg2.subject, post_data2['subject'])
bgneal@812 337 self.assertEqual(msg2.message, post_data2['message'])
bgneal@812 338 self.assertIsNone(msg2.sender_delete_date)
bgneal@812 339 self.assertIsNone(msg2.receiver_delete_date)
bgneal@812 340
bgneal@812 341 # pj deletes message 2
bgneal@812 342 self.assertEqual(Message.objects.all().count(), 2)
bgneal@812 343
bgneal@812 344 delete_post_data = {
bgneal@812 345 'pm_ids': [msg2.pk],
bgneal@818 346 'action': 'Delete',
bgneal@812 347 }
bgneal@818 348 view_name = 'messages-bulk'
bgneal@812 349 url = reverse(view_name)
bgneal@812 350 response = self.client.post(url, data=delete_post_data, follow=True)
bgneal@812 351 self.assertContains(response, "1 message deleted", status_code=200)
bgneal@812 352
bgneal@812 353 self.assertEqual(Message.objects.all().count(), 2)
bgneal@812 354
bgneal@812 355 msg2 = Message.objects.get(receiver=self.users['pj'])
bgneal@812 356
bgneal@812 357 self.assertEqual(msg2.sender, self.users['eddie'])
bgneal@812 358 self.assertEqual(msg2.receiver, self.users['pj'])
bgneal@812 359 self.assertTrue(now - msg2.send_date < datetime.timedelta(seconds=5))
bgneal@812 360 self.assertTrue(now - msg2.read_date < datetime.timedelta(seconds=5))
bgneal@812 361 self.assertIsNone(msg2.reply_date)
bgneal@812 362 self.assertEqual(msg2.subject, post_data2['subject'])
bgneal@812 363 self.assertEqual(msg2.message, post_data2['message'])
bgneal@812 364 self.assertIsNone(msg2.sender_delete_date)
bgneal@812 365 self.assertTrue(now - msg2.receiver_delete_date < datetime.timedelta(seconds=5))
bgneal@812 366
bgneal@812 367 # should be in pj's trash now
bgneal@812 368 view_name = 'messages-trash'
bgneal@812 369 url = reverse(view_name)
bgneal@812 370 response = self.client.get(url)
bgneal@812 371 self.assertContains(response, post_data2['subject'], status_code=200)
bgneal@812 372
bgneal@812 373 # eddie logs in and deletes his copy of message 2
bgneal@812 374 self.assertTrue(self.client.login(username='eddie', password='12345'))
bgneal@812 375 delete_post_data = {
bgneal@812 376 'pm_ids': [msg2.pk],
bgneal@818 377 'action': 'Delete',
bgneal@812 378 }
bgneal@818 379 view_name = 'messages-bulk'
bgneal@812 380 url = reverse(view_name)
bgneal@812 381 response = self.client.post(url, data=delete_post_data, follow=True)
bgneal@812 382 self.assertContains(response, "1 message deleted", status_code=200)
bgneal@812 383
bgneal@812 384 # should be really deleted now
bgneal@812 385 self.assertEqual(Message.objects.all().count(), 1)
bgneal@812 386 view_name = 'messages-trash'
bgneal@812 387 url = reverse(view_name)
bgneal@812 388 response = self.client.get(url)
bgneal@812 389 self.assertNotContains(response, post_data2['subject'], status_code=200)
bgneal@812 390
bgneal@812 391 # eddie deletes then undeletes message 1
bgneal@812 392 delete_post_data = {
bgneal@812 393 'pm_ids': [msg1.pk],
bgneal@818 394 'action': 'Delete',
bgneal@812 395 }
bgneal@818 396 view_name = 'messages-bulk'
bgneal@812 397 url = reverse(view_name)
bgneal@812 398 response = self.client.post(url, data=delete_post_data, follow=True)
bgneal@812 399 self.assertContains(response, "1 message deleted", status_code=200)
bgneal@812 400
bgneal@812 401 # should not be really deleted now
bgneal@812 402 self.assertEqual(Message.objects.all().count(), 1)
bgneal@812 403 view_name = 'messages-trash'
bgneal@812 404 url = reverse(view_name)
bgneal@812 405 response = self.client.get(url)
bgneal@812 406 self.assertContains(response, post_data['subject'], status_code=200)
bgneal@812 407
bgneal@812 408 msg1 = Message.objects.get(receiver=self.users['eddie'])
bgneal@812 409
bgneal@812 410 self.assertEqual(msg1.sender, self.users['pj'])
bgneal@812 411 self.assertEqual(msg1.receiver, self.users['eddie'])
bgneal@812 412 self.assertTrue(now - msg1.send_date < datetime.timedelta(seconds=5))
bgneal@812 413 self.assertTrue(now - msg1.read_date < datetime.timedelta(seconds=5))
bgneal@812 414 self.assertTrue(now - msg1.reply_date < datetime.timedelta(seconds=5))
bgneal@812 415 self.assertEqual(msg1.subject, post_data['subject'])
bgneal@812 416 self.assertEqual(msg1.message, post_data['message'])
bgneal@812 417 self.assertIsNone(msg1.sender_delete_date)
bgneal@812 418 self.assertTrue(now - msg1.receiver_delete_date < datetime.timedelta(seconds=5))
bgneal@812 419
bgneal@812 420 delete_post_data = {
bgneal@812 421 'pm_ids': [msg1.pk],
bgneal@812 422 }
bgneal@812 423 view_name = 'messages-undelete'
bgneal@812 424 url = reverse(view_name)
bgneal@812 425 response = self.client.post(url, data=delete_post_data, follow=True)
bgneal@812 426 self.assertContains(response, "1 message undeleted", status_code=200)
bgneal@812 427
bgneal@812 428 # should not be really deleted now
bgneal@812 429 self.assertEqual(Message.objects.all().count(), 1)
bgneal@812 430 view_name = 'messages-trash'
bgneal@812 431 url = reverse(view_name)
bgneal@812 432 response = self.client.get(url)
bgneal@812 433 self.assertNotContains(response, post_data['subject'], status_code=200)
bgneal@812 434
bgneal@812 435 msg1 = Message.objects.get(receiver=self.users['eddie'])
bgneal@812 436
bgneal@812 437 self.assertEqual(msg1.sender, self.users['pj'])
bgneal@812 438 self.assertEqual(msg1.receiver, self.users['eddie'])
bgneal@812 439 self.assertTrue(now - msg1.send_date < datetime.timedelta(seconds=5))
bgneal@812 440 self.assertTrue(now - msg1.read_date < datetime.timedelta(seconds=5))
bgneal@812 441 self.assertTrue(now - msg1.reply_date < datetime.timedelta(seconds=5))
bgneal@812 442 self.assertEqual(msg1.subject, post_data['subject'])
bgneal@812 443 self.assertEqual(msg1.message, post_data['message'])
bgneal@812 444 self.assertIsNone(msg1.sender_delete_date)
bgneal@812 445 self.assertIsNone(msg1.receiver_delete_date)
bgneal@812 446
bgneal@812 447 def test_read_permission(self):
bgneal@812 448
bgneal@812 449 now = datetime.datetime.now()
bgneal@812 450 # pj sends a PM to richard
bgneal@812 451 post_data = {
bgneal@812 452 'receiver': 'richard',
bgneal@812 453 'subject': 'Mr. Moto Demo',
bgneal@812 454 'message': 'Gig at Newport High School',
bgneal@812 455 }
bgneal@812 456 view_name = 'messages-compose'
bgneal@812 457 url = reverse(view_name)
bgneal@812 458 response = self.client.post(url, data=post_data)
bgneal@812 459 self.assertContains(response, "Message sent", status_code=200)
bgneal@812 460
bgneal@812 461 msg = Message.objects.get(sender=self.users['pj'])
bgneal@812 462
bgneal@812 463 # eddie should not be able to read it
bgneal@812 464 self.assertTrue(self.client.login(username='eddie', password='12345'))
bgneal@812 465 view_name = 'messages-view'
bgneal@812 466 url = reverse(view_name, args=[msg.pk])
bgneal@812 467 response = self.client.get(url)
bgneal@812 468 self.assertNotContains(response, post_data['subject'], status_code=302)
bgneal@812 469 self.assertNotContains(response, post_data['message'], status_code=302)
bgneal@812 470
bgneal@812 471 response = self.client.get(url, follow=True)
bgneal@812 472 self.assertNotContains(response, post_data['subject'], status_code=200)
bgneal@812 473 self.assertNotContains(response, post_data['message'], status_code=200)
bgneal@812 474
bgneal@812 475 msg = Message.objects.get(sender=self.users['pj'])
bgneal@812 476
bgneal@812 477 self.assertEqual(msg.sender, self.users['pj'])
bgneal@812 478 self.assertEqual(msg.receiver, self.users['richard'])
bgneal@812 479 self.assertTrue(now - msg.send_date < datetime.timedelta(seconds=5))
bgneal@812 480 self.assertIsNone(msg.read_date)
bgneal@812 481 self.assertIsNone(msg.reply_date)
bgneal@812 482 self.assertEqual(msg.subject, post_data['subject'])
bgneal@812 483 self.assertEqual(msg.message, post_data['message'])
bgneal@812 484 self.assertIsNone(msg.sender_delete_date)
bgneal@812 485 self.assertIsNone(msg.receiver_delete_date)
bgneal@813 486
bgneal@813 487 def test_report_message(self):
bgneal@813 488 post_data = {
bgneal@813 489 'receiver': 'eddie',
bgneal@813 490 'subject': 'Mr. Moto Demo',
bgneal@813 491 'message': 'Gig at Newport High School',
bgneal@813 492 }
bgneal@813 493 view_name = 'messages-compose'
bgneal@813 494 url = reverse(view_name)
bgneal@813 495 response = self.client.post(url, data=post_data)
bgneal@813 496 self.assertContains(response, "Message sent", status_code=200)
bgneal@813 497
bgneal@813 498 msg = Message.objects.get(sender=self.users['pj'])
bgneal@813 499
bgneal@813 500 # Ensure non-recipients can't report a message
bgneal@813 501 view_name = 'messages-report'
bgneal@813 502 url = reverse(view_name, args=[msg.pk])
bgneal@813 503 response = self.client.post(url, data={}, follow=True)
bgneal@813 504 self.assertContains(response, "You can&#39;t report this message", status_code=200)
bgneal@813 505 self.assertEqual(Flag.objects.count(), 0)
bgneal@813 506
bgneal@813 507 self.assertTrue(self.client.login(username='richard', password='12345'))
bgneal@813 508 response = self.client.post(url, data={}, follow=True)
bgneal@813 509 self.assertContains(response, "You can&#39;t report this message", status_code=200)
bgneal@813 510 self.assertEqual(Flag.objects.count(), 0)
bgneal@813 511
bgneal@813 512 # Test bogus report
bgneal@813 513 self.assertTrue(self.client.login(username='eddie', password='12345'))
bgneal@813 514 bad_url = reverse(view_name, args=[msg.pk + 1])
bgneal@813 515 response = self.client.post(bad_url, data={})
bgneal@813 516 self.assertEqual(response.status_code, 404)
bgneal@813 517 self.assertEqual(Flag.objects.count(), 0)
bgneal@813 518
bgneal@813 519 # Test get of report view
bgneal@813 520 response = self.client.get(url)
bgneal@813 521 self.assertEqual(response.status_code, 200)
bgneal@813 522
bgneal@813 523 # Test posting to report view
bgneal@813 524 post_data = {
bgneal@813 525 'comments': 'This is abuse!',
bgneal@813 526 }
bgneal@813 527 now = datetime.datetime.now()
bgneal@813 528 response = self.client.post(url, data=post_data, follow=True)
bgneal@813 529 self.assertContains(response, "Message reported", status_code=200)
bgneal@813 530
bgneal@813 531 self.assertEqual(Flag.objects.count(), 1)
bgneal@813 532 msg = Message.objects.get(receiver=self.users['eddie'])
bgneal@813 533
bgneal@813 534 try:
bgneal@813 535 flag = msg.flag
bgneal@813 536 except Flag.DoesNotExist:
bgneal@813 537 self.fail("msg.flag does not exist!")
bgneal@813 538
bgneal@813 539 self.assertEqual(flag.message, msg)
bgneal@813 540 self.assertTrue(now - flag.flag_date < datetime.timedelta(seconds=2))
bgneal@813 541 self.assertEqual(flag.comments, post_data['comments'])
bgneal@813 542
bgneal@813 543 # Admin should have been sent an email
bgneal@813 544 self.assertEqual(len(mail.outbox), 1)
bgneal@813 545 email = mail.outbox[0]
bgneal@813 546 self.assertEqual(len(email.recipients()), 1)
bgneal@813 547 self.assertEqual(email.recipients()[0], 'admin@surfguitar101.com')
bgneal@813 548 self.assertTrue(email.subject.endswith('A user has flagged a private message'))
bgneal@813 549
bgneal@814 550 def test_inbox_full(self):
bgneal@814 551
bgneal@814 552 post_data = {
bgneal@814 553 'receiver': 'eddie',
bgneal@814 554 'subject': 'Mr. Moto Demo',
bgneal@814 555 'message': 'Gig at Newport High School',
bgneal@814 556 }
bgneal@814 557 view_name = 'messages-compose'
bgneal@814 558 url = reverse(view_name)
bgneal@814 559 for n in range(self.MSG_BOX_LIMIT):
bgneal@814 560 response = self.client.post(url, data=post_data)
bgneal@814 561 self.assertEqual(Message.objects.all().count(), self.MSG_BOX_LIMIT)
bgneal@814 562
bgneal@814 563 # pj deletes a message so we can make sure we are testing inbox full
bgneal@814 564 msg = Message.objects.filter(receiver=self.users['eddie']).last()
bgneal@814 565 msg.sender_delete_date = datetime.datetime.now()
bgneal@814 566 msg.save()
bgneal@814 567 self.assertEqual(Message.objects.all().count(), self.MSG_BOX_LIMIT)
bgneal@814 568 self.assertEqual(Message.objects.outbox(self.users['pj']).count(),
bgneal@814 569 self.MSG_BOX_LIMIT - 1)
bgneal@814 570 self.assertEqual(Message.objects.inbox(self.users['eddie']).count(),
bgneal@814 571 self.MSG_BOX_LIMIT)
bgneal@814 572
bgneal@814 573 # pj should not be able to send another
bgneal@814 574 response = self.client.post(url, data=post_data)
bgneal@814 575 self.assertNotContains(response, "Message sent", status_code=200)
bgneal@814 576 self.assertContains(response, "inbox is full", status_code=200)
bgneal@814 577 self.assertEqual(Message.objects.all().count(), self.MSG_BOX_LIMIT)
bgneal@814 578
bgneal@814 579 def test_outbox_full(self):
bgneal@814 580
bgneal@814 581 post_data = {
bgneal@814 582 'receiver': 'eddie',
bgneal@814 583 'subject': 'Mr. Moto Demo',
bgneal@814 584 'message': 'Gig at Newport High School',
bgneal@814 585 }
bgneal@814 586 view_name = 'messages-compose'
bgneal@814 587 url = reverse(view_name)
bgneal@814 588 for n in range(self.MSG_BOX_LIMIT):
bgneal@814 589 response = self.client.post(url, data=post_data)
bgneal@814 590 self.assertContains(response, "Message sent", status_code=200)
bgneal@814 591 self.assertEqual(Message.objects.all().count(), self.MSG_BOX_LIMIT)
bgneal@814 592
bgneal@814 593 # eddie deletes a message so we can make sure we are testing outbox full
bgneal@814 594 msg = Message.objects.filter(receiver=self.users['eddie']).last()
bgneal@814 595 msg.read_date = datetime.datetime.now()
bgneal@814 596 msg.receiver_delete_date = msg.read_date
bgneal@814 597 msg.save()
bgneal@814 598 self.assertEqual(Message.objects.all().count(), self.MSG_BOX_LIMIT)
bgneal@814 599 self.assertEqual(Message.objects.outbox(self.users['pj']).count(),
bgneal@814 600 self.MSG_BOX_LIMIT)
bgneal@814 601 self.assertEqual(Message.objects.inbox(self.users['eddie']).count(),
bgneal@814 602 self.MSG_BOX_LIMIT - 1)
bgneal@814 603
bgneal@814 604 # pj should not be able to send another
bgneal@814 605 response = self.client.post(url, data=post_data)
bgneal@814 606 self.assertNotContains(response, "Message sent", status_code=200)
bgneal@814 607 self.assertContains(response, "Your outbox is full", status_code=200)
bgneal@814 608 self.assertEqual(Message.objects.all().count(), self.MSG_BOX_LIMIT)
bgneal@814 609
bgneal@818 610 def test_email_export(self):
bgneal@818 611
bgneal@818 612 post_data = {
bgneal@818 613 'receiver': 'eddie',
bgneal@818 614 'subject': 'Mr. Moto Demo',
bgneal@818 615 'message': 'Gig at Newport High School',
bgneal@818 616 }
bgneal@818 617 view_name = 'messages-compose'
bgneal@818 618 url = reverse(view_name)
bgneal@818 619 response = self.client.post(url, data=post_data)
bgneal@818 620 self.assertContains(response, "Message sent", status_code=200)
bgneal@818 621
bgneal@818 622 msg = Message.objects.get(receiver=self.users['eddie'])
bgneal@818 623 post_data = {
bgneal@818 624 'pm_ids': [msg.id],
bgneal@818 625 'action': 'Email',
bgneal@818 626 }
bgneal@818 627 view_name = 'messages-bulk'
bgneal@818 628 url = reverse(view_name)
bgneal@818 629 response = self.client.post(url, data=post_data, follow=True)
bgneal@818 630 self.assertContains(response, "1 message sent to email", status_code=200)
bgneal@818 631
bgneal@818 632 # Ensure email sent
bgneal@818 633 self.assertEqual(len(mail.outbox), 1)
bgneal@818 634
bgneal@818 635 if len(mail.outbox) == 1:
bgneal@818 636 email = mail.outbox[0]
bgneal@818 637 self.assertEqual(len(email.recipients()), 1)
bgneal@818 638 self.assertEqual(email.recipients()[0], 'pj@example.com')
bgneal@818 639 self.assertTrue(email.subject.startswith('Private messages from'))
bgneal@818 640
bgneal@813 641
bgneal@813 642 class EmailTestCase(TestCase):
bgneal@813 643 """Testing to ensure email is sent when PM is sent if options allow."""
bgneal@813 644 fixtures = ['messages_test_users.json']
bgneal@813 645
bgneal@813 646 def setUp(self):
bgneal@813 647 self.users = {}
bgneal@813 648 self.users['pj'] = User.objects.get(username='pj')
bgneal@813 649 self.users['pj'].set_password('12345')
bgneal@813 650 self.users['pj'].save()
bgneal@813 651 self.assertTrue(self.client.login(username='pj', password='12345'))
bgneal@813 652
bgneal@813 653 self.users['eddie'] = User.objects.get(username='eddie')
bgneal@813 654 self.users['eddie'].set_password('12345')
bgneal@813 655 self.users['eddie'].save()
bgneal@813 656
bgneal@813 657 def _test_email(self, email_expected):
bgneal@813 658 # pj sends message to eddie
bgneal@813 659 post_data = {
bgneal@813 660 'receiver': 'eddie',
bgneal@813 661 'subject': 'Mr. Moto Demo',
bgneal@813 662 'message': 'Gig at Newport High School',
bgneal@813 663 }
bgneal@813 664 view_name = 'messages-compose'
bgneal@813 665 url = reverse(view_name)
bgneal@813 666 response = self.client.post(url, data=post_data)
bgneal@813 667 self.assertContains(response, "Message sent", status_code=200)
bgneal@813 668
bgneal@813 669 # Ensure notification email sent
bgneal@813 670 count = 1 if email_expected else 0
bgneal@813 671 self.assertEqual(len(mail.outbox), count)
bgneal@813 672
bgneal@813 673 if count == 1:
bgneal@813 674 email = mail.outbox[0]
bgneal@813 675 self.assertEqual(len(email.recipients()), 1)
bgneal@813 676 self.assertEqual(email.recipients()[0], 'eddie@example.com')
bgneal@813 677 self.assertTrue(email.subject.startswith('New private message'))
bgneal@813 678
bgneal@813 679 def test_email_sent(self):
bgneal@813 680 # eddie elects to receive email notifications
bgneal@813 681 # Note: testing the options view is done above.
bgneal@813 682 opts = Options.objects.for_user(self.users['eddie'])
bgneal@813 683 opts.notify_email = True
bgneal@813 684 opts.save()
bgneal@813 685 self._test_email(True)
bgneal@813 686
bgneal@813 687 def test_no_email(self):
bgneal@813 688 # eddie does not to elect to receive email notifications
bgneal@813 689 opts = Options.objects.for_user(self.users['eddie'])
bgneal@813 690 opts.notify_email = False
bgneal@813 691 opts.save()
bgneal@813 692 self._test_email(False)