test_patch.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. from __future__ import unicode_literals
  2. from django.test import TestCase
  3. from misago.api.patch import ApiPatch, InvalidAction
  4. class MockObject(object):
  5. def __init__(self, pk):
  6. self.id = pk
  7. self.pk = pk
  8. class ApiPatchTests(TestCase):
  9. def test_add(self):
  10. """add method adds function to patch object"""
  11. patch = ApiPatch()
  12. def mock_function():
  13. pass
  14. patch.add('test-add', mock_function)
  15. self.assertEqual(len(patch._actions), 1)
  16. self.assertEqual(patch._actions[0]['op'], 'add')
  17. self.assertEqual(patch._actions[0]['path'], 'test-add')
  18. self.assertEqual(patch._actions[0]['handler'], mock_function)
  19. def test_remove(self):
  20. """remove method adds function to patch object"""
  21. patch = ApiPatch()
  22. def mock_function():
  23. pass
  24. patch.remove('test-remove', mock_function)
  25. self.assertEqual(len(patch._actions), 1)
  26. self.assertEqual(patch._actions[0]['op'], 'remove')
  27. self.assertEqual(patch._actions[0]['path'], 'test-remove')
  28. self.assertEqual(patch._actions[0]['handler'], mock_function)
  29. def test_replace(self):
  30. """replace method adds function to patch object"""
  31. patch = ApiPatch()
  32. def mock_function():
  33. pass
  34. patch.replace('test-replace', mock_function)
  35. self.assertEqual(len(patch._actions), 1)
  36. self.assertEqual(patch._actions[0]['op'], 'replace')
  37. self.assertEqual(patch._actions[0]['path'], 'test-replace')
  38. self.assertEqual(patch._actions[0]['handler'], mock_function)
  39. def test_validate_actions(self):
  40. """validate_actions method validates action dict"""
  41. patch = ApiPatch()
  42. VALID_ACTIONS = [
  43. {
  44. 'op': 'add',
  45. 'path': 'test',
  46. 'value': 42
  47. },
  48. {
  49. 'op': 'remove',
  50. 'path': 'other-test',
  51. 'value': 'Lorem'
  52. },
  53. {
  54. 'op': 'replace',
  55. 'path': 'false-test',
  56. 'value': None
  57. },
  58. ]
  59. for action in VALID_ACTIONS:
  60. patch.validate_actions([action])
  61. # undefined op
  62. UNSUPPORTED_ACTIONS = ({}, {'op': ''}, {'no': 'op'}, )
  63. for action in UNSUPPORTED_ACTIONS:
  64. try:
  65. patch.validate_actions([action])
  66. except InvalidAction as e:
  67. self.assertEqual(e.args[0], '"op" parameter must be defined.')
  68. # unsupported op
  69. try:
  70. patch.validate_actions([{'op': 'nope'}])
  71. except InvalidAction as e:
  72. self.assertEqual(e.args[0], '"nope" op is unsupported.')
  73. # op lacking patch
  74. try:
  75. patch.validate_actions([{'op': 'add'}])
  76. except InvalidAction as e:
  77. self.assertEqual(e.args[0], '"add" op has to specify path.')
  78. # op lacking value
  79. try:
  80. patch.validate_actions([{
  81. 'op': 'add',
  82. 'path': 'yolo',
  83. }])
  84. except InvalidAction as e:
  85. self.assertEqual(e.args[0], '"add" op has to specify value.')
  86. # empty value is forbidden
  87. try:
  88. patch.validate_actions([{
  89. 'op': 'add',
  90. 'path': 'yolo',
  91. 'value': '',
  92. }])
  93. except InvalidAction as e:
  94. self.assertEqual(e.args[0], '"add" op has to specify value.')
  95. # duplicated actions are forbidden
  96. try:
  97. patch.validate_actions([
  98. {'op': 'add', 'path': 'like', 'value': True},
  99. {'op': 'add', 'path': 'like', 'value': False},
  100. ])
  101. except InvalidAction as e:
  102. self.assertEqual(e.args[0], '"add" op for "like" path is repeated.')
  103. def test_dispatch_action(self):
  104. """dispatch_action calls specified actions"""
  105. patch = ApiPatch()
  106. mock_target = MockObject(13)
  107. def action_a(request, target, value):
  108. self.assertEqual(request, 'request')
  109. self.assertEqual(target, mock_target)
  110. return {'a': value * 2, 'b': 111}
  111. patch.replace('abc', action_a)
  112. def action_b(request, target, value):
  113. self.assertEqual(request, 'request')
  114. self.assertEqual(target, mock_target)
  115. return {'b': value * 10}
  116. patch.replace('abc', action_b)
  117. def action_fail(request, target, value):
  118. self.fail("unrequired action was called")
  119. patch.add('c', action_fail)
  120. patch.remove('c', action_fail)
  121. patch.replace('c', action_fail)
  122. patch_dict = {'id': 123}
  123. patch.dispatch_action(
  124. patch_dict, 'request', mock_target, {
  125. 'op': 'replace',
  126. 'path': 'abc',
  127. 'value': 5,
  128. }
  129. )
  130. self.assertEqual(len(patch_dict), 3)
  131. self.assertEqual(patch_dict['id'], 123)
  132. self.assertEqual(patch_dict['a'], 10)
  133. self.assertEqual(patch_dict['b'], 50)