[IMP] Base Action Rule (only filter conditions)
[odoo/odoo.git] / addons / base_action_rule / tests / base_action_rule_test.py
diff --git a/addons/base_action_rule/tests/base_action_rule_test.py b/addons/base_action_rule/tests/base_action_rule_test.py
new file mode 100644 (file)
index 0000000..6f1c885
--- /dev/null
@@ -0,0 +1,142 @@
+import tools
+from openerp.tests import common
+from .. import test_models
+
+class base_action_rule_test(common.TransactionCase):
+
+    def setUp(self):
+        """*****setUp*****"""
+        super(base_action_rule_test, self).setUp()
+        cr, uid = self.cr, self.uid
+        self.demo_user = self.registry('ir.model.data').get_object_reference(cr, uid, 'base', 'user_demo')
+        self.admin_user = self.registry('ir.model.data').get_object_reference(cr, uid, 'base', 'user_admin')
+
+    def create_filter_done(self, cr, uid, context=None):
+        filter_pool = self.registry('ir.filters')
+        return filter_pool.create(cr, uid, {
+            'name': "Lead is in done state",
+            'is_default': False,
+            'model_id': 'base.action.rule.lead.test',
+            'domain' : "[('state','=','done')]",
+            }, context=context)
+
+    def create_filter_draft(self, cr, uid, context=None):
+        filter_pool = self.registry('ir.filters')
+        return filter_pool.create(cr, uid, {
+            'name': "Lead is in draft state",
+            'is_default': False,
+            'model_id': "base.action.rule.lead.test",
+            'domain' : "[('state','=','draft')]",
+            }, context=context)
+
+    def create_lead_test_1(self, cr, uid, context=None):
+        """
+            Create a new lead_test
+        """
+        lead_pool = self.registry('base.action.rule.lead.test')
+        return lead_pool.create(cr, uid, {
+            'name': "Lead Test 1",
+            'user_id': self.admin_user[1],
+            }, context=context)
+
+    def create_rule(self, cr, uid, filter_id=None, filter_post_id=None, context=None):
+        """
+            The "Rule 1" says that when a lead goes to the 'draft' state, the responsible for that lead changes to "demo_user"
+        """
+        self.action_pool = self.registry('base.action.rule')
+        return self.action_pool.create(cr,uid,{
+            'name' : "Rule 1",
+            'model_id': self.registry('ir.model').search(cr, uid, [('model','=','base.action.rule.lead.test')], context=context)[0],
+            'active' : 1,
+            'trg_date_type' : 'none',
+            'filter_post_id' : filter_post_id,
+            'filter_id' : filter_id,
+            'act_user_id': self.demo_user[1],
+            }, context=context)
+
+    def test_00_check_to_state_draft_pre(self):
+        """
+        Check that a new record (with state = draft) doesn't change its responsible when there is a precondition filter which check that the state is draft.
+        """
+        cr, uid = self.cr, self.uid
+        context = {}
+        filter_draft = self.create_filter_draft(cr, uid, context=context)
+        rule_1_id = self.create_rule(cr, uid, filter_id=filter_draft, context=context)
+        new_lead_id = self.create_lead_test_1(cr,uid,context=context)
+        new_lead = self.registry('base.action.rule.lead.test').browse(cr, uid, new_lead_id, context=context)
+        self.assertTrue(new_lead.state=='draft')
+        self.assertTrue(new_lead.user_id==self.registry('res.users').browse(cr, uid, self.admin_user[1], context=context))
+
+    def test_01_check_to_state_draft_post(self):
+        """
+        Check that a new record (with state = draft) changes its responsible when there is a postcondition filter which check that the state is draft.
+        """
+        cr, uid = self.cr, self.uid
+        context = {}
+        filter_draft = self.create_filter_draft(cr, uid, context=context)
+        rule_1_id = self.create_rule(cr, uid, filter_post_id=filter_draft, context=context)
+        new_lead_id = self.create_lead_test_1(cr,uid,context=context)
+        new_lead = self.registry('base.action.rule.lead.test').browse(cr, uid, new_lead_id, context=context)
+        self.assertTrue(new_lead.state=='draft')
+        self.assertTrue(new_lead.user_id==self.registry('res.users').browse(cr, uid, self.demo_user[1], context=context))
+
+    def test_02_check_from_draft_to_done_with_steps(self):
+        """
+        A new record will be created and will goes from draft to done state via the other states (open, pending and cancel)
+        We will create a rule that says in precondition that the record must be in the "draft" state while a postcondition filter says
+        that the record will be done. If the state goes from 'draft' to 'done' the responsible will change. If those two conditions aren't
+        verified, the responsible will stay the same
+        The responsible in that test will never change
+        """
+        cr, uid = self.cr, self.uid
+        context = {}
+        filter_draft = self.create_filter_draft(cr, uid, context=context)
+        filter_done = self.create_filter_done(cr, uid, context=context)
+        self.create_rule(cr, uid, filter_id=filter_draft, filter_post_id=filter_done, context=context)
+        new_lead_id = self.create_lead_test_1(cr,uid,context=context)
+        new_lead = self.registry('base.action.rule.lead.test').browse(cr, uid, new_lead_id, context=context)
+        self.assertTrue(new_lead.state=='draft')
+        self.assertTrue(new_lead.user_id==self.registry('res.users').browse(cr, uid, self.admin_user[1], context=context))
+        """ change the state of new_lead to open and check that responsible doen't change"""
+        new_lead.write({'state': 'open'}, context=context)
+        new_lead = self.registry('base.action.rule.lead.test').browse(cr, uid, new_lead_id, context=context)
+        self.assertTrue(new_lead.state=='open')
+        self.assertTrue(new_lead.user_id==self.registry('res.users').browse(cr, uid, self.admin_user[1], context=context))
+        """ change the state of new_lead to pending and check that responsible doen't change"""
+        new_lead.write({'state': 'pending'}, context=context)
+        new_lead = self.registry('base.action.rule.lead.test').browse(cr, uid, new_lead_id, context=context)
+        self.assertTrue(new_lead.state=='pending')
+        self.assertTrue(new_lead.user_id==self.registry('res.users').browse(cr, uid, self.admin_user[1], context=context))
+        """ change the state of new_lead to cancel and check that responsible doen't change"""
+        new_lead.write({'state': 'cancel'}, context=context)
+        new_lead = self.registry('base.action.rule.lead.test').browse(cr, uid, new_lead_id, context=context)
+        self.assertTrue(new_lead.state=='cancel')
+        self.assertTrue(new_lead.user_id==self.registry('res.users').browse(cr, uid, self.admin_user[1], context=context))
+        """ change the state of new_lead to done and check that responsible doen't change """
+        new_lead.write({'state': 'done'}, context=context)
+        new_lead = self.registry('base.action.rule.lead.test').browse(cr, uid, new_lead_id, context=context)
+        self.assertTrue(new_lead.state=='done')
+        self.assertTrue(new_lead.user_id==self.registry('res.users').browse(cr, uid, self.admin_user[1], context=context))
+
+    def test_02_check_from_draft_to_done_without_steps(self):
+        """
+        A new record will be created and will goes from draft to done in one operation
+        We will create a rule that says in precondition that the record must be in the "draft" state while a postcondition filter says
+        that the record will be done. If the state goes from 'draft' to 'done' the responsible will change. If those two conditions aren't
+        verified, the responsible will stay the same
+        The responsible in that test will change to "demo_user"
+        """
+        cr, uid = self.cr, self.uid
+        context = {}
+        filter_draft = self.create_filter_draft(cr, uid, context=context)
+        filter_done = self.create_filter_done(cr, uid, context=context)
+        self.create_rule(cr, uid, filter_id=filter_draft, filter_post_id=filter_done, context=context)
+        new_lead_id = self.create_lead_test_1(cr,uid,context=context)
+        new_lead = self.registry('base.action.rule.lead.test').browse(cr, uid, new_lead_id, context=context)
+        self.assertTrue(new_lead.state=='draft')
+        self.assertTrue(new_lead.user_id==self.registry('res.users').browse(cr, uid, self.admin_user[1], context=context))
+        """ change the state of new_lead to done and check that responsible change to Demo_user"""
+        new_lead.write({'state': 'done'}, context=context)
+        new_lead = self.registry('base.action.rule.lead.test').browse(cr, uid, new_lead_id, context=context)
+        self.assertTrue(new_lead.state=='done')
+        self.assertTrue(new_lead.user_id==self.registry('res.users').browse(cr, uid, self.demo_user[1], context=context))
\ No newline at end of file