/plone/app/contentrules/tests/test_rule_management_views.py

https://github.com/plone/plone.app.contentrules
Python | 156 lines | 126 code | 27 blank | 3 comment | 2 complexity | 4cf7b4d240061281600b6e0309ed6391 MD5 | raw file
  1. from .dummy import DummyAction
  2. from .dummy import DummyCondition
  3. from plone.app.contentrules.browser.rule import RuleEditFormView
  4. from plone.app.contentrules.rule import Rule
  5. from plone.app.contentrules.tests.base import ContentRulesTestCase
  6. from plone.contentrules.engine.interfaces import IRuleStorage
  7. from zope.component import getMultiAdapter
  8. from zope.component import getUtility
  9. from zope.lifecycleevent.interfaces import IObjectModifiedEvent
  10. class DummyModifiedRule(Rule):
  11. title = "My test rule"
  12. description = "Test my rule"
  13. event = IObjectModifiedEvent
  14. enabled = True
  15. class TestRuleManagementViews(ContentRulesTestCase):
  16. def testRuleAdding(self):
  17. adding = getMultiAdapter((self.portal, self.portal.REQUEST), name="+rule")
  18. storage = getUtility(IRuleStorage)
  19. self.assertEqual(0, len(storage))
  20. r = Rule()
  21. adding.add(r)
  22. self.assertEqual(1, len(storage))
  23. self.assertTrue(list(storage.values())[0] is r)
  24. def testRuleAddView(self):
  25. adding = getMultiAdapter((self.portal, self.portal.REQUEST), name="+rule")
  26. addview = getMultiAdapter(
  27. (adding, self.portal.REQUEST), name="plone.ContentRule"
  28. )
  29. storage = getUtility(IRuleStorage)
  30. self.assertEqual(0, len(storage))
  31. addview.form_instance.update()
  32. content = addview.form_instance.create(
  33. {"title": "foo", "description": "bar", "event": None}
  34. ) # noqa
  35. addview.form_instance.add(content)
  36. self.assertEqual(1, len(storage))
  37. self.assertEqual("foo", list(storage.values())[0].title)
  38. def testRuleEditView(self):
  39. r = Rule()
  40. editview = getMultiAdapter((r, self.portal.REQUEST), name="edit")
  41. self.assertTrue(isinstance(editview, RuleEditFormView))
  42. class TestRuleElementManagementViews(ContentRulesTestCase):
  43. def afterSetUp(self):
  44. self.setRoles(("Manager",))
  45. def testRuleStopModification(self):
  46. storage = getUtility(IRuleStorage)
  47. storage["foo"] = Rule()
  48. rule = self.portal.restrictedTraverse("++rule++foo")
  49. view = rule.restrictedTraverse("manage-elements")
  50. view.template = lambda: "No template thanks"
  51. self.portal.REQUEST.form["stopExecuting"] = "on"
  52. self.portal.REQUEST.form["form.button.Save"] = True
  53. self.addAuthToRequest()
  54. self.assertEqual(False, rule.stop)
  55. view()
  56. self.assertEqual(True, rule.stop)
  57. def testRuleConditionAdding(self):
  58. storage = getUtility(IRuleStorage)
  59. storage["foo"] = Rule()
  60. rule = self.portal.restrictedTraverse("++rule++foo")
  61. adding = getMultiAdapter((rule, self.portal.REQUEST), name="+condition")
  62. d = DummyCondition()
  63. self.assertEqual(0, len(rule.conditions))
  64. adding.add(d)
  65. self.assertEqual(1, len(rule.conditions))
  66. self.assertTrue(rule.conditions[0] is d)
  67. def testRuleActionAdding(self):
  68. storage = getUtility(IRuleStorage)
  69. storage["foo"] = Rule()
  70. rule = self.portal.restrictedTraverse("++rule++foo")
  71. adding = getMultiAdapter((rule, self.portal.REQUEST), name="+action")
  72. d = DummyAction()
  73. self.assertEqual(0, len(rule.actions))
  74. adding.add(d)
  75. self.assertEqual(1, len(rule.actions))
  76. self.assertTrue(rule.actions[0] is d)
  77. def testRulesControlPanel(self):
  78. portal = self.portal
  79. storage = getUtility(IRuleStorage)
  80. storage["foo"] = DummyModifiedRule()
  81. controlpanel = portal.restrictedTraverse("@@rules-controlpanel")
  82. registered_rules = controlpanel.registeredRules()
  83. self.assertEqual(1, len(registered_rules))
  84. registered_rule = registered_rules[0]
  85. self.assertEqual(
  86. registered_rule["row_class"],
  87. "trigger-iobjectmodifiedevent state-enabled assignment-unassigned",
  88. )
  89. self.assertEqual(registered_rule["trigger"], "Object modified")
  90. self.assertTrue(registered_rule["enabled"])
  91. self.assertFalse(registered_rule["assigned"])
  92. rule_types = controlpanel.ruleTypesToShow()
  93. rule_types_ids = [r["id"] for r in rule_types]
  94. self.assertTrue("trigger-iobjectmodifiedevent" in rule_types_ids)
  95. self.assertFalse("trigger-iobjectaddedevent" in rule_types_ids)
  96. rule_states = controlpanel.statesToShow()
  97. rule_states_ids = [r["id"] for r in rule_states]
  98. self.assertTrue("state-enabled" in rule_states_ids)
  99. self.assertTrue("state-disabled" in rule_states_ids)
  100. # enable rule
  101. portal.REQUEST["rule-id"] = "foo"
  102. self.addAuthToRequest()
  103. portal.restrictedTraverse("@@contentrule-disable").disable_rule()
  104. registered_rules = controlpanel.registeredRules()
  105. self.assertFalse(registered_rules[0]["enabled"])
  106. portal.restrictedTraverse("@@contentrule-enable").enable_rule()
  107. registered_rules = controlpanel.registeredRules()
  108. self.assertTrue(registered_rules[0]["enabled"])
  109. # works without ajax
  110. portal.REQUEST.form["rule-id"] = "foo"
  111. portal.REQUEST.form["form.button.DisableRule"] = "1"
  112. portal.restrictedTraverse("@@rules-controlpanel")()
  113. registered_rules = controlpanel.registeredRules()
  114. self.assertFalse(registered_rules[0]["enabled"])
  115. portal.restrictedTraverse("@@contentrule-delete").delete_rule()
  116. registered_rules = controlpanel.registeredRules()
  117. self.assertEqual(0, len(registered_rules))
  118. def testChangeGloballyEnable(self):
  119. storage = getUtility(IRuleStorage)
  120. portal = self.portal
  121. self.addAuthToRequest()
  122. portal.restrictedTraverse("@@contentrule-globally-enable").globally_enable()
  123. self.assertTrue(storage.active)
  124. portal.restrictedTraverse("@@contentrule-globally-disable").globally_disable()
  125. self.assertFalse(storage.active)
  126. portal.restrictedTraverse("@@contentrule-globally-enable").globally_enable()
  127. self.assertTrue(storage.active)
  128. # without ajax
  129. self.portal.REQUEST.form