PageRenderTime 99ms CodeModel.GetById 84ms RepoModel.GetById 1ms app.codeStats 0ms

/tests/regressiontests/signals_regress/tests.py

https://code.google.com/p/mango-py/
Python | 96 lines | 72 code | 16 blank | 8 comment | 5 complexity | 8f66b7e3487875d96827d5164204718a MD5 | raw file
Possible License(s): BSD-3-Clause
  1. import sys
  2. from StringIO import StringIO
  3. from django.test import TestCase
  4. from django.db import models
  5. from regressiontests.signals_regress.models import Author, Book
  6. signal_output = []
  7. def pre_save_test(signal, sender, instance, **kwargs):
  8. signal_output.append('pre_save signal, %s' % instance)
  9. if kwargs.get('raw'):
  10. signal_output.append('Is raw')
  11. def post_save_test(signal, sender, instance, **kwargs):
  12. signal_output.append('post_save signal, %s' % instance)
  13. if 'created' in kwargs:
  14. if kwargs['created']:
  15. signal_output.append('Is created')
  16. else:
  17. signal_output.append('Is updated')
  18. if kwargs.get('raw'):
  19. signal_output.append('Is raw')
  20. def pre_delete_test(signal, sender, instance, **kwargs):
  21. signal_output.append('pre_save signal, %s' % instance)
  22. signal_output.append('instance.id is not None: %s' % (instance.id != None))
  23. def post_delete_test(signal, sender, instance, **kwargs):
  24. signal_output.append('post_delete signal, %s' % instance)
  25. signal_output.append('instance.id is not None: %s' % (instance.id != None))
  26. class SignalsRegressTests(TestCase):
  27. """
  28. Testing signals before/after saving and deleting.
  29. """
  30. def get_signal_output(self, fn, *args, **kwargs):
  31. # Flush any existing signal output
  32. global signal_output
  33. signal_output = []
  34. fn(*args, **kwargs)
  35. return signal_output
  36. def setUp(self):
  37. # Save up the number of connected signals so that we can check at the end
  38. # that all the signals we register get properly unregistered (#9989)
  39. self.pre_signals = (len(models.signals.pre_save.receivers),
  40. len(models.signals.post_save.receivers),
  41. len(models.signals.pre_delete.receivers),
  42. len(models.signals.post_delete.receivers))
  43. models.signals.pre_save.connect(pre_save_test)
  44. models.signals.post_save.connect(post_save_test)
  45. models.signals.pre_delete.connect(pre_delete_test)
  46. models.signals.post_delete.connect(post_delete_test)
  47. def tearDown(self):
  48. models.signals.post_delete.disconnect(post_delete_test)
  49. models.signals.pre_delete.disconnect(pre_delete_test)
  50. models.signals.post_save.disconnect(post_save_test)
  51. models.signals.pre_save.disconnect(pre_save_test)
  52. # Check that all our signals got disconnected properly.
  53. post_signals = (len(models.signals.pre_save.receivers),
  54. len(models.signals.post_save.receivers),
  55. len(models.signals.pre_delete.receivers),
  56. len(models.signals.post_delete.receivers))
  57. self.assertEqual(self.pre_signals, post_signals)
  58. def test_model_signals(self):
  59. """ Model saves should throw some signals. """
  60. a1 = Author(name='Neal Stephenson')
  61. self.assertEqual(self.get_signal_output(a1.save), [
  62. "pre_save signal, Neal Stephenson",
  63. "post_save signal, Neal Stephenson",
  64. "Is created"
  65. ])
  66. b1 = Book(name='Snow Crash')
  67. self.assertEqual(self.get_signal_output(b1.save), [
  68. "pre_save signal, Snow Crash",
  69. "post_save signal, Snow Crash",
  70. "Is created"
  71. ])
  72. def test_m2m_signals(self):
  73. """ Assigning and removing to/from m2m shouldn't generate an m2m signal """
  74. b1 = Book(name='Snow Crash')
  75. self.get_signal_output(b1.save)
  76. a1 = Author(name='Neal Stephenson')
  77. self.get_signal_output(a1.save)
  78. self.assertEqual(self.get_signal_output(setattr, b1, 'authors', [a1]), [])
  79. self.assertEqual(self.get_signal_output(setattr, b1, 'authors', []), [])