entities/test/unittest_wfobjs.py
author Julien Cristau <julien.cristau@logilab.fr>
Tue, 04 Nov 2014 14:10:02 +0100
changeset 10024 2a08247b57fb
parent 9752 5df3ac51a91a
child 10092 f0363da0b5a0
permissions -rw-r--r--
[server] commit after serializing schema Use separate transactions for schema serialization and postcreate scripts execution, so that the latter can rely on the schema being persistently stored. This matters e.g. if something in a postcreate violates a unique_together constraint, we need the constraint persisted in order to raise a meaningful error. See #4525069.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
     1
# copyright 2003-2014 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5056
diff changeset
     2
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5056
diff changeset
     3
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5056
diff changeset
     4
# This file is part of CubicWeb.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5056
diff changeset
     5
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5056
diff changeset
     6
# CubicWeb is free software: you can redistribute it and/or modify it under the
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5056
diff changeset
     7
# terms of the GNU Lesser General Public License as published by the Free
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5056
diff changeset
     8
# Software Foundation, either version 2.1 of the License, or (at your option)
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5056
diff changeset
     9
# any later version.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5056
diff changeset
    10
#
5424
8ecbcbff9777 replace logilab-common by CubicWeb in disclaimer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5421
diff changeset
    11
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5056
diff changeset
    12
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5056
diff changeset
    13
# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5056
diff changeset
    14
# details.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5056
diff changeset
    15
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5056
diff changeset
    16
# You should have received a copy of the GNU Lesser General Public License along
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5056
diff changeset
    17
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
6796
e70ca9abfc51 [unittest2] update to unittest2 assertRaises api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6410
diff changeset
    18
6868
2d40f3c48f31 [tests] use migration api to create workflow
Julien Jehannet <julien@smaf.org>
parents: 6796
diff changeset
    19
from cubicweb import ValidationError
2968
0e3460341023 somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2954
diff changeset
    20
from cubicweb.devtools.testlib import CubicWebTC
2920
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    21
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    22
def add_wf(shell, etype, name=None, default=False):
2949
a2aa2c51f3be test and implements workflow changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2939
diff changeset
    23
    if name is None:
2992
a5b8bf107a1a [wf] test and hooks for WorkflowTransition support
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2985
diff changeset
    24
        name = etype
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    25
    return shell.add_workflow(name, etype, default=default,
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    26
                              ensure_workflowable=False)
2949
a2aa2c51f3be test and implements workflow changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2939
diff changeset
    27
a2aa2c51f3be test and implements workflow changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2939
diff changeset
    28
def parse_hist(wfhist):
a2aa2c51f3be test and implements workflow changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2939
diff changeset
    29
    return [(ti.previous_state.name, ti.new_state.name,
a2aa2c51f3be test and implements workflow changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2939
diff changeset
    30
             ti.transition and ti.transition.name, ti.comment)
a2aa2c51f3be test and implements workflow changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2939
diff changeset
    31
            for ti in wfhist]
a2aa2c51f3be test and implements workflow changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2939
diff changeset
    32
a2aa2c51f3be test and implements workflow changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2939
diff changeset
    33
2968
0e3460341023 somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2954
diff changeset
    34
class WorkflowBuildingTC(CubicWebTC):
2939
a613cc003ab7 make state/transition name unique within a workflow
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2920
diff changeset
    35
a613cc003ab7 make state/transition name unique within a workflow
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2920
diff changeset
    36
    def test_wf_construction(self):
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    37
        with self.admin_access.shell() as shell:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    38
            wf = add_wf(shell, 'Company')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    39
            foo = wf.add_state(u'foo', initial=True)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    40
            bar = wf.add_state(u'bar')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    41
            self.assertEqual(wf.state_by_name('bar').eid, bar.eid)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    42
            self.assertEqual(wf.state_by_name('barrr'), None)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    43
            baz = wf.add_transition(u'baz', (foo,), bar, ('managers',))
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    44
            self.assertEqual(wf.transition_by_name('baz').eid, baz.eid)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    45
            self.assertEqual(len(baz.require_group), 1)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    46
            self.assertEqual(baz.require_group[0].name, 'managers')
2939
a613cc003ab7 make state/transition name unique within a workflow
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2920
diff changeset
    47
a613cc003ab7 make state/transition name unique within a workflow
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2920
diff changeset
    48
    def test_duplicated_state(self):
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    49
        with self.admin_access.shell() as shell:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    50
            wf = add_wf(shell, 'Company')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    51
            wf.add_state(u'foo', initial=True)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    52
            shell.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    53
            wf.add_state(u'foo')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    54
            with self.assertRaises(ValidationError) as cm:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    55
                shell.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    56
            self.assertEqual({'name-subject': 'workflow already has a state of that name'},
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    57
                             cm.exception.errors)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    58
            # no pb if not in the same workflow
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    59
            wf2 = add_wf(shell, 'Company')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    60
            foo = wf2.add_state(u'foo', initial=True)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    61
            shell.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    62
            # gnark gnark
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    63
            bar = wf.add_state(u'bar')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    64
            shell.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    65
            bar.cw_set(name=u'foo')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    66
            with self.assertRaises(ValidationError) as cm:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    67
                shell.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    68
            self.assertEqual({'name-subject': 'workflow already has a state of that name'},
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    69
                             cm.exception.errors)
2939
a613cc003ab7 make state/transition name unique within a workflow
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2920
diff changeset
    70
a613cc003ab7 make state/transition name unique within a workflow
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2920
diff changeset
    71
    def test_duplicated_transition(self):
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    72
        with self.admin_access.shell() as shell:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    73
            wf = add_wf(shell, 'Company')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    74
            foo = wf.add_state(u'foo', initial=True)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    75
            bar = wf.add_state(u'bar')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    76
            wf.add_transition(u'baz', (foo,), bar, ('managers',))
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    77
            wf.add_transition(u'baz', (bar,), foo)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    78
            with self.assertRaises(ValidationError) as cm:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    79
                shell.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    80
            self.assertEqual(cm.exception.errors, {'name-subject': 'workflow already has a transition of that name'})
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    81
            # no pb if not in the same workflow
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    82
            wf2 = add_wf(shell, 'Company')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    83
            foo = wf.add_state(u'foo', initial=True)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    84
            bar = wf.add_state(u'bar')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    85
            wf.add_transition(u'baz', (foo,), bar, ('managers',))
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    86
            shell.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    87
            # gnark gnark
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    88
            biz = wf.add_transition(u'biz', (bar,), foo)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    89
            shell.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    90
            biz.cw_set(name=u'baz')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    91
            with self.assertRaises(ValidationError) as cm:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    92
                shell.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
    93
            self.assertEqual(cm.exception.errors, {'name-subject': 'workflow already has a transition of that name'})
2939
a613cc003ab7 make state/transition name unique within a workflow
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2920
diff changeset
    94
a613cc003ab7 make state/transition name unique within a workflow
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2920
diff changeset
    95
2968
0e3460341023 somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2954
diff changeset
    96
class WorkflowTC(CubicWebTC):
2920
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    97
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    98
    def setup_database(self):
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
    99
        rschema = self.schema['in_state']
8696
0bb18407c053 [toward py3k] rewrite dict.keys() and dict.values() (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8694
diff changeset
   100
        for rdef in rschema.rdefs.itervalues():
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5557
diff changeset
   101
            self.assertEqual(rdef.cardinality, '1*')
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   102
        with self.admin_access.client_cnx() as cnx:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   103
            self.member_eid = self.create_user(cnx, 'member').eid
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   104
            cnx.commit()
2920
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   105
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   106
    def test_workflow_base(self):
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   107
        with self.admin_access.web_request() as req:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   108
            e = self.create_user(req, 'toto')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   109
            iworkflowable = e.cw_adapt_to('IWorkflowable')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   110
            self.assertEqual(iworkflowable.state, 'activated')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   111
            iworkflowable.change_state('deactivated', u'deactivate 1')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   112
            req.cnx.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   113
            iworkflowable.change_state('activated', u'activate 1')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   114
            req.cnx.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   115
            iworkflowable.change_state('deactivated', u'deactivate 2')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   116
            req.cnx.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   117
            e.cw_clear_relation_cache('wf_info_for', 'object')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   118
            self.assertEqual([tr.comment for tr in e.reverse_wf_info_for],
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   119
                              ['deactivate 1', 'activate 1', 'deactivate 2'])
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   120
            self.assertEqual(iworkflowable.latest_trinfo().comment, 'deactivate 2')
2920
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   121
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   122
    def test_possible_transitions(self):
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   123
        with self.admin_access.web_request() as req:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   124
            user = req.execute('CWUser X').get_entity(0, 0)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   125
            iworkflowable = user.cw_adapt_to('IWorkflowable')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   126
            trs = list(iworkflowable.possible_transitions())
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   127
            self.assertEqual(len(trs), 1)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   128
            self.assertEqual(trs[0].name, u'deactivate')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   129
            self.assertEqual(trs[0].destination(None).name, u'deactivated')
2920
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   130
        # test a std user get no possible transition
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   131
        with self.new_access('member').web_request() as req:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   132
            # fetch the entity using the new session
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   133
            trs = list(req.user.cw_adapt_to('IWorkflowable').possible_transitions())
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   134
            self.assertEqual(len(trs), 0)
2920
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   135
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   136
    def _test_manager_deactivate(self, user):
5556
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5538
diff changeset
   137
        iworkflowable = user.cw_adapt_to('IWorkflowable')
5557
1a534c596bff [entity] continue cleanup of Entity/AnyEntity namespace
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5556
diff changeset
   138
        user.cw_clear_relation_cache('in_state', 'subject')
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5557
diff changeset
   139
        self.assertEqual(len(user.in_state), 1)
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5557
diff changeset
   140
        self.assertEqual(iworkflowable.state, 'deactivated')
5556
9ab2b4c74baf [entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5538
diff changeset
   141
        trinfo = iworkflowable.latest_trinfo()
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5557
diff changeset
   142
        self.assertEqual(trinfo.previous_state.name, 'activated')
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5557
diff changeset
   143
        self.assertEqual(trinfo.new_state.name, 'deactivated')
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5557
diff changeset
   144
        self.assertEqual(trinfo.comment, 'deactivate user')
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5557
diff changeset
   145
        self.assertEqual(trinfo.comment_format, 'text/plain')
2920
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   146
        return trinfo
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   147
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   148
    def test_change_state(self):
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   149
        with self.admin_access.client_cnx() as cnx:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   150
            user = cnx.user
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   151
            iworkflowable = user.cw_adapt_to('IWorkflowable')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   152
            iworkflowable.change_state('deactivated', comment=u'deactivate user')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   153
            trinfo = self._test_manager_deactivate(user)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   154
            self.assertEqual(trinfo.transition, None)
2920
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   155
2983
b458631fe347 [wf] test in_state consistency
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2982
diff changeset
   156
    def test_set_in_state_bad_wf(self):
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   157
        with self.admin_access.shell() as shell:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   158
            wf = add_wf(shell, 'CWUser')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   159
            s = wf.add_state(u'foo', initial=True)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   160
            shell.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   161
        with self.admin_access.repo_cnx() as cnx:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   162
            with cnx.security_enabled(write=False):
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   163
                with self.assertRaises(ValidationError) as cm:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   164
                    cnx.execute('SET X in_state S WHERE X eid %(x)s, S eid %(s)s',
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   165
                                {'x': cnx.user.eid, 's': s.eid})
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   166
                self.assertEqual(cm.exception.errors, {'in_state-subject': "state doesn't belong to entity's workflow. "
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   167
                                          "You may want to set a custom workflow for this entity first."})
2983
b458631fe347 [wf] test in_state consistency
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2982
diff changeset
   168
2920
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   169
    def test_fire_transition(self):
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   170
        with self.admin_access.client_cnx() as cnx:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   171
            user = cnx.user
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   172
            iworkflowable = user.cw_adapt_to('IWorkflowable')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   173
            iworkflowable.fire_transition('deactivate', comment=u'deactivate user')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   174
            user.cw_clear_all_caches()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   175
            self.assertEqual(iworkflowable.state, 'deactivated')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   176
            self._test_manager_deactivate(user)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   177
            trinfo = self._test_manager_deactivate(user)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   178
            self.assertEqual(trinfo.transition.name, 'deactivate')
2920
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   179
4644
021035b9a7ab introduce 'go back' transition: transition without destination state will go to the state we were coming from
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4030
diff changeset
   180
    def test_goback_transition(self):
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   181
        with self.admin_access.web_request() as req:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   182
            wf = req.user.cw_adapt_to('IWorkflowable').current_workflow
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   183
            asleep = wf.add_state('asleep')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   184
            wf.add_transition('rest', (wf.state_by_name('activated'),
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   185
                                       wf.state_by_name('deactivated')),
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   186
                              asleep)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   187
            wf.add_transition('wake up', asleep)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   188
            user = self.create_user(req, 'stduser')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   189
            iworkflowable = user.cw_adapt_to('IWorkflowable')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   190
            iworkflowable.fire_transition('rest')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   191
            req.cnx.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   192
            iworkflowable.fire_transition('wake up')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   193
            req.cnx.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   194
            self.assertEqual(iworkflowable.state, 'activated')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   195
            iworkflowable.fire_transition('deactivate')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   196
            req.cnx.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   197
            iworkflowable.fire_transition('rest')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   198
            req.cnx.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   199
            iworkflowable.fire_transition('wake up')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   200
            req.cnx.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   201
            user.cw_clear_all_caches()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   202
            self.assertEqual(iworkflowable.state, 'deactivated')
4644
021035b9a7ab introduce 'go back' transition: transition without destination state will go to the state we were coming from
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4030
diff changeset
   203
2920
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   204
    # XXX test managers can change state without matching transition
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   205
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   206
    def _test_stduser_deactivate(self):
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   207
        with self.admin_access.repo_cnx() as cnx:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   208
            self.create_user(cnx, 'tutu')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   209
        with self.new_access('tutu').web_request() as req:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   210
            iworkflowable = req.entity_from_eid(self.member_eid).cw_adapt_to('IWorkflowable')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   211
            with self.assertRaises(ValidationError) as cm:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   212
                iworkflowable.fire_transition('deactivate')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   213
            self.assertEqual(cm.exception.errors, {'by_transition-subject': "transition may not be fired"})
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   214
        with self.new_access('member').web_request() as req:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   215
            iworkflowable = req.entity_from_eid(self.member_eid).cw_adapt_to('IWorkflowable')
6796
e70ca9abfc51 [unittest2] update to unittest2 assertRaises api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6410
diff changeset
   216
            iworkflowable.fire_transition('deactivate')
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   217
            req.cnx.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   218
            with self.assertRaises(ValidationError) as cm:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   219
                iworkflowable.fire_transition('activate')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   220
            self.assertEqual(cm.exception.errors, {'by_transition-subject': "transition may not be fired"})
2920
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   221
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   222
    def test_fire_transition_owned_by(self):
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   223
        with self.admin_access.repo_cnx() as cnx:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   224
            cnx.execute('INSERT RQLExpression X: X exprtype "ERQLExpression", '
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   225
                        'X expression "X owned_by U", T condition X '
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   226
                        'WHERE T name "deactivate"')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   227
            cnx.commit()
2920
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   228
        self._test_stduser_deactivate()
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   229
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   230
    def test_fire_transition_has_update_perm(self):
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   231
        with self.admin_access.repo_cnx() as cnx:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   232
            cnx.execute('INSERT RQLExpression X: X exprtype "ERQLExpression", '
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   233
                        'X expression "U has_update_permission X", T condition X '
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   234
                        'WHERE T name "deactivate"')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   235
            cnx.commit()
2920
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   236
        self._test_stduser_deactivate()
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   237
3628
440931181322 [wf engine] support for subwf exit point with no destination state: go back to state from which we entered into the subworkflow
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3617
diff changeset
   238
    def test_swf_base(self):
2992
a5b8bf107a1a [wf] test and hooks for WorkflowTransition support
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2985
diff changeset
   239
        """subworkflow
a5b8bf107a1a [wf] test and hooks for WorkflowTransition support
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2985
diff changeset
   240
a5b8bf107a1a [wf] test and hooks for WorkflowTransition support
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2985
diff changeset
   241
        +-----------+  tr1   +-----------+
a5b8bf107a1a [wf] test and hooks for WorkflowTransition support
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2985
diff changeset
   242
        | swfstate1 | ------>| swfstate2 |
a5b8bf107a1a [wf] test and hooks for WorkflowTransition support
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2985
diff changeset
   243
        +-----------+        +-----------+
a5b8bf107a1a [wf] test and hooks for WorkflowTransition support
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2985
diff changeset
   244
                  |  tr2  +-----------+
a5b8bf107a1a [wf] test and hooks for WorkflowTransition support
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2985
diff changeset
   245
                  `------>| swfstate3 |
a5b8bf107a1a [wf] test and hooks for WorkflowTransition support
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2985
diff changeset
   246
                          +-----------+
a5b8bf107a1a [wf] test and hooks for WorkflowTransition support
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2985
diff changeset
   247
a5b8bf107a1a [wf] test and hooks for WorkflowTransition support
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2985
diff changeset
   248
        main workflow
a5b8bf107a1a [wf] test and hooks for WorkflowTransition support
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2985
diff changeset
   249
a5b8bf107a1a [wf] test and hooks for WorkflowTransition support
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2985
diff changeset
   250
        +--------+  swftr1             +--------+
a5b8bf107a1a [wf] test and hooks for WorkflowTransition support
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2985
diff changeset
   251
        | state1 | -------[swfstate2]->| state2 |
a5b8bf107a1a [wf] test and hooks for WorkflowTransition support
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2985
diff changeset
   252
        +--------+     |               +--------+
a5b8bf107a1a [wf] test and hooks for WorkflowTransition support
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2985
diff changeset
   253
                       |               +--------+
a5b8bf107a1a [wf] test and hooks for WorkflowTransition support
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2985
diff changeset
   254
                       `-[swfstate3]-->| state3 |
a5b8bf107a1a [wf] test and hooks for WorkflowTransition support
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2985
diff changeset
   255
                                       +--------+
a5b8bf107a1a [wf] test and hooks for WorkflowTransition support
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2985
diff changeset
   256
        """
a5b8bf107a1a [wf] test and hooks for WorkflowTransition support
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2985
diff changeset
   257
        # sub-workflow
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   258
        with self.admin_access.shell() as shell:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   259
            swf = add_wf(shell, 'CWGroup', name='subworkflow')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   260
            swfstate1 = swf.add_state(u'swfstate1', initial=True)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   261
            swfstate2 = swf.add_state(u'swfstate2')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   262
            swfstate3 = swf.add_state(u'swfstate3')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   263
            tr1 = swf.add_transition(u'tr1', (swfstate1,), swfstate2)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   264
            tr2 = swf.add_transition(u'tr2', (swfstate1,), swfstate3)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   265
            # main workflow
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   266
            mwf = add_wf(shell, 'CWGroup', name='main workflow', default=True)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   267
            state1 = mwf.add_state(u'state1', initial=True)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   268
            state2 = mwf.add_state(u'state2')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   269
            state3 = mwf.add_state(u'state3')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   270
            swftr1 = mwf.add_wftransition(u'swftr1', swf, state1,
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   271
                                          [(swfstate2, state2), (swfstate3, state3)])
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   272
            swf.cw_clear_all_caches()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   273
            self.assertEqual(swftr1.destination(None).eid, swfstate1.eid)
2992
a5b8bf107a1a [wf] test and hooks for WorkflowTransition support
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2985
diff changeset
   274
        # workflows built, begin test
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   275
        with self.admin_access.web_request() as req:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   276
            group = req.create_entity('CWGroup', name=u'grp1')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   277
            req.cnx.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   278
            iworkflowable = group.cw_adapt_to('IWorkflowable')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   279
            self.assertEqual(iworkflowable.current_state.eid, state1.eid)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   280
            self.assertEqual(iworkflowable.current_workflow.eid, mwf.eid)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   281
            self.assertEqual(iworkflowable.main_workflow.eid, mwf.eid)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   282
            self.assertEqual(iworkflowable.subworkflow_input_transition(), None)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   283
            iworkflowable.fire_transition('swftr1', u'go')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   284
            req.cnx.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   285
            group.cw_clear_all_caches()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   286
            self.assertEqual(iworkflowable.current_state.eid, swfstate1.eid)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   287
            self.assertEqual(iworkflowable.current_workflow.eid, swf.eid)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   288
            self.assertEqual(iworkflowable.main_workflow.eid, mwf.eid)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   289
            self.assertEqual(iworkflowable.subworkflow_input_transition().eid, swftr1.eid)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   290
            iworkflowable.fire_transition('tr1', u'go')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   291
            req.cnx.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   292
            group.cw_clear_all_caches()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   293
            self.assertEqual(iworkflowable.current_state.eid, state2.eid)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   294
            self.assertEqual(iworkflowable.current_workflow.eid, mwf.eid)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   295
            self.assertEqual(iworkflowable.main_workflow.eid, mwf.eid)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   296
            self.assertEqual(iworkflowable.subworkflow_input_transition(), None)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   297
            # force back to swfstate1 is impossible since we can't any more find
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   298
            # subworkflow input transition
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   299
            with self.assertRaises(ValidationError) as cm:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   300
                iworkflowable.change_state(swfstate1, u'gadget')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   301
            self.assertEqual(cm.exception.errors, {'to_state-subject': "state doesn't belong to entity's workflow"})
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   302
            req.cnx.rollback()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   303
            # force back to state1
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   304
            iworkflowable.change_state('state1', u'gadget')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   305
            iworkflowable.fire_transition('swftr1', u'au')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   306
            group.cw_clear_all_caches()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   307
            iworkflowable.fire_transition('tr2', u'chapeau')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   308
            req.cnx.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   309
            group.cw_clear_all_caches()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   310
            self.assertEqual(iworkflowable.current_state.eid, state3.eid)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   311
            self.assertEqual(iworkflowable.current_workflow.eid, mwf.eid)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   312
            self.assertEqual(iworkflowable.main_workflow.eid, mwf.eid)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   313
            self.assertListEqual(parse_hist(iworkflowable.workflow_history),
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   314
                                  [('state1', 'swfstate1', 'swftr1', 'go'),
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   315
                                   ('swfstate1', 'swfstate2', 'tr1', 'go'),
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   316
                                   ('swfstate2', 'state2', 'swftr1', 'exiting from subworkflow subworkflow'),
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   317
                                   ('state2', 'state1', None, 'gadget'),
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   318
                                   ('state1', 'swfstate1', 'swftr1', 'au'),
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   319
                                   ('swfstate1', 'swfstate3', 'tr2', 'chapeau'),
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   320
                                   ('swfstate3', 'state3', 'swftr1', 'exiting from subworkflow subworkflow'),
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   321
                                   ])
2992
a5b8bf107a1a [wf] test and hooks for WorkflowTransition support
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2985
diff changeset
   322
3628
440931181322 [wf engine] support for subwf exit point with no destination state: go back to state from which we entered into the subworkflow
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3617
diff changeset
   323
    def test_swf_exit_consistency(self):
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   324
        with self.admin_access.shell() as shell:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   325
            # sub-workflow
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   326
            swf = add_wf(shell, 'CWGroup', name='subworkflow')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   327
            swfstate1 = swf.add_state(u'swfstate1', initial=True)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   328
            swfstate2 = swf.add_state(u'swfstate2')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   329
            tr1 = swf.add_transition(u'tr1', (swfstate1,), swfstate2)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   330
            # main workflow
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   331
            mwf = add_wf(shell, 'CWGroup', name='main workflow', default=True)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   332
            state1 = mwf.add_state(u'state1', initial=True)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   333
            state2 = mwf.add_state(u'state2')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   334
            state3 = mwf.add_state(u'state3')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   335
            mwf.add_wftransition(u'swftr1', swf, state1,
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   336
                                 [(swfstate2, state2), (swfstate2, state3)])
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   337
            with self.assertRaises(ValidationError) as cm:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   338
                shell.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   339
            self.assertEqual(cm.exception.errors, {'subworkflow_exit-subject': u"can't have multiple exits on the same state"})
2920
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   340
3628
440931181322 [wf engine] support for subwf exit point with no destination state: go back to state from which we entered into the subworkflow
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3617
diff changeset
   341
    def test_swf_fire_in_a_row(self):
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   342
        with self.admin_access.shell() as shell:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   343
            # sub-workflow
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   344
            subwf = add_wf(shell, 'CWGroup', name='subworkflow')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   345
            xsigning = subwf.add_state('xsigning', initial=True)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   346
            xaborted = subwf.add_state('xaborted')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   347
            xsigned = subwf.add_state('xsigned')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   348
            xabort = subwf.add_transition('xabort', (xsigning,), xaborted)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   349
            xsign = subwf.add_transition('xsign', (xsigning,), xsigning)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   350
            xcomplete = subwf.add_transition('xcomplete', (xsigning,), xsigned,
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   351
                                             type=u'auto')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   352
            # main workflow
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   353
            twf = add_wf(shell, 'CWGroup', name='mainwf', default=True)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   354
            created    = twf.add_state(_('created'), initial=True)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   355
            identified = twf.add_state(_('identified'))
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   356
            released   = twf.add_state(_('released'))
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   357
            closed   = twf.add_state(_('closed'))
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   358
            twf.add_wftransition(_('identify'), subwf, (created,),
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   359
                                 [(xsigned, identified), (xaborted, created)])
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   360
            twf.add_wftransition(_('release'), subwf, (identified,),
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   361
                                 [(xsigned, released), (xaborted, identified)])
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   362
            twf.add_wftransition(_('close'), subwf, (released,),
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   363
                                 [(xsigned, closed), (xaborted, released)])
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   364
            shell.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   365
        with self.admin_access.repo_cnx() as cnx:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   366
            group = cnx.create_entity('CWGroup', name=u'grp1')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   367
            cnx.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   368
            iworkflowable = group.cw_adapt_to('IWorkflowable')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   369
            for trans in ('identify', 'release', 'close'):
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   370
                iworkflowable.fire_transition(trans)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   371
                cnx.commit()
3628
440931181322 [wf engine] support for subwf exit point with no destination state: go back to state from which we entered into the subworkflow
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3617
diff changeset
   372
440931181322 [wf engine] support for subwf exit point with no destination state: go back to state from which we entered into the subworkflow
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3617
diff changeset
   373
440931181322 [wf engine] support for subwf exit point with no destination state: go back to state from which we entered into the subworkflow
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3617
diff changeset
   374
    def test_swf_magic_tr(self):
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   375
        with self.admin_access.shell() as shell:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   376
            # sub-workflow
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   377
            subwf = add_wf(shell, 'CWGroup', name='subworkflow')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   378
            xsigning = subwf.add_state('xsigning', initial=True)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   379
            xaborted = subwf.add_state('xaborted')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   380
            xsigned = subwf.add_state('xsigned')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   381
            xabort = subwf.add_transition('xabort', (xsigning,), xaborted)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   382
            xsign = subwf.add_transition('xsign', (xsigning,), xsigned)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   383
            # main workflow
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   384
            twf = add_wf(shell, 'CWGroup', name='mainwf', default=True)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   385
            created    = twf.add_state(_('created'), initial=True)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   386
            identified = twf.add_state(_('identified'))
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   387
            released   = twf.add_state(_('released'))
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   388
            twf.add_wftransition(_('identify'), subwf, created,
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   389
                                 [(xaborted, None), (xsigned, identified)])
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   390
            twf.add_wftransition(_('release'), subwf, identified,
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   391
                                 [(xaborted, None)])
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   392
            shell.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   393
        with self.admin_access.web_request() as req:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   394
            group = req.create_entity('CWGroup', name=u'grp1')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   395
            req.cnx.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   396
            iworkflowable = group.cw_adapt_to('IWorkflowable')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   397
            for trans, nextstate in (('identify', 'xsigning'),
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   398
                                     ('xabort', 'created'),
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   399
                                     ('identify', 'xsigning'),
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   400
                                     ('xsign', 'identified'),
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   401
                                     ('release', 'xsigning'),
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   402
                                     ('xabort', 'identified')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   403
                                     ):
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   404
                iworkflowable.fire_transition(trans)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   405
                req.cnx.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   406
                group.cw_clear_all_caches()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   407
                self.assertEqual(iworkflowable.state, nextstate)
3628
440931181322 [wf engine] support for subwf exit point with no destination state: go back to state from which we entered into the subworkflow
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3617
diff changeset
   408
2954
48507919b6e3 [wf] oops, BaseTransition.__init__ may be called for subclasses
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2949
diff changeset
   409
2968
0e3460341023 somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2954
diff changeset
   410
class CustomWorkflowTC(CubicWebTC):
2949
a2aa2c51f3be test and implements workflow changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2939
diff changeset
   411
a2aa2c51f3be test and implements workflow changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2939
diff changeset
   412
    def setup_database(self):
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   413
        with self.admin_access.repo_cnx() as cnx:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   414
            self.member_eid = self.create_user(cnx, 'member').eid
2949
a2aa2c51f3be test and implements workflow changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2939
diff changeset
   415
a2aa2c51f3be test and implements workflow changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2939
diff changeset
   416
    def test_custom_wf_replace_state_no_history(self):
a2aa2c51f3be test and implements workflow changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2939
diff changeset
   417
        """member in inital state with no previous history, state is simply
a2aa2c51f3be test and implements workflow changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2939
diff changeset
   418
        redirected when changing workflow
a2aa2c51f3be test and implements workflow changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2939
diff changeset
   419
        """
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   420
        with self.admin_access.shell() as shell:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   421
            wf = add_wf(shell, 'CWUser')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   422
            wf.add_state('asleep', initial=True)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   423
        with self.admin_access.web_request() as req:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   424
            req.execute('SET X custom_workflow WF WHERE X eid %(x)s, WF eid %(wf)s',
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   425
                     {'wf': wf.eid, 'x': self.member_eid})
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   426
            member = req.entity_from_eid(self.member_eid)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   427
            iworkflowable = member.cw_adapt_to('IWorkflowable')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   428
            self.assertEqual(iworkflowable.state, 'activated') # no change before commit
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   429
            req.cnx.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   430
            member.cw_clear_all_caches()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   431
            self.assertEqual(iworkflowable.current_workflow.eid, wf.eid)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   432
            self.assertEqual(iworkflowable.state, 'asleep')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   433
            self.assertEqual(iworkflowable.workflow_history, ())
2949
a2aa2c51f3be test and implements workflow changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2939
diff changeset
   434
a2aa2c51f3be test and implements workflow changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2939
diff changeset
   435
    def test_custom_wf_replace_state_keep_history(self):
a2aa2c51f3be test and implements workflow changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2939
diff changeset
   436
        """member in inital state with some history, state is redirected and
a2aa2c51f3be test and implements workflow changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2939
diff changeset
   437
        state change is recorded to history
a2aa2c51f3be test and implements workflow changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2939
diff changeset
   438
        """
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   439
        with self.admin_access.web_request() as req:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   440
            member = req.entity_from_eid(self.member_eid)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   441
            iworkflowable = member.cw_adapt_to('IWorkflowable')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   442
            iworkflowable.fire_transition('deactivate')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   443
            iworkflowable.fire_transition('activate')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   444
            req.cnx.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   445
        with self.admin_access.shell() as shell:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   446
            wf = add_wf(shell, 'CWUser')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   447
            wf.add_state('asleep', initial=True)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   448
            shell.rqlexec('SET X custom_workflow WF WHERE X eid %(x)s, WF eid %(wf)s',
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   449
                          {'wf': wf.eid, 'x': self.member_eid})
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   450
        with self.admin_access.web_request() as req:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   451
            member = req.entity_from_eid(self.member_eid)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   452
            iworkflowable = member.cw_adapt_to('IWorkflowable')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   453
            self.assertEqual(iworkflowable.current_workflow.eid, wf.eid)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   454
            self.assertEqual(iworkflowable.state, 'asleep')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   455
            self.assertEqual(parse_hist(iworkflowable.workflow_history),
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   456
                             [('activated', 'deactivated', 'deactivate', None),
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   457
                              ('deactivated', 'activated', 'activate', None),
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   458
                              ('activated', 'asleep', None, 'workflow changed to "CWUser"')])
2949
a2aa2c51f3be test and implements workflow changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2939
diff changeset
   459
a2aa2c51f3be test and implements workflow changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2939
diff changeset
   460
    def test_custom_wf_no_initial_state(self):
a2aa2c51f3be test and implements workflow changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2939
diff changeset
   461
        """try to set a custom workflow which has no initial state"""
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   462
        with self.admin_access.shell() as shell:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   463
            wf = add_wf(shell, 'CWUser')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   464
            wf.add_state('asleep')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   465
            shell.rqlexec('SET X custom_workflow WF WHERE X eid %(x)s, WF eid %(wf)s',
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   466
                          {'wf': wf.eid, 'x': self.member_eid})
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   467
            with self.assertRaises(ValidationError) as cm:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   468
                shell.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   469
            self.assertEqual(cm.exception.errors, {'custom_workflow-subject': u'workflow has no initial state'})
2949
a2aa2c51f3be test and implements workflow changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2939
diff changeset
   470
a2aa2c51f3be test and implements workflow changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2939
diff changeset
   471
    def test_custom_wf_bad_etype(self):
2985
79185b3ccf2c cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2984
diff changeset
   472
        """try to set a custom workflow which doesn't apply to entity type"""
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   473
        with self.admin_access.shell() as shell:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   474
            wf = add_wf(shell, 'Company')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   475
            wf.add_state('asleep', initial=True)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   476
            shell.rqlexec('SET X custom_workflow WF WHERE X eid %(x)s, WF eid %(wf)s',
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   477
                         {'wf': wf.eid, 'x': self.member_eid})
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   478
            with self.assertRaises(ValidationError) as cm:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   479
                shell.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   480
            self.assertEqual(cm.exception.errors, {'custom_workflow-subject': u"workflow isn't a workflow for this type"})
2949
a2aa2c51f3be test and implements workflow changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2939
diff changeset
   481
a2aa2c51f3be test and implements workflow changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2939
diff changeset
   482
    def test_del_custom_wf(self):
a2aa2c51f3be test and implements workflow changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2939
diff changeset
   483
        """member in some state shared by the new workflow, nothing has to be
a2aa2c51f3be test and implements workflow changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2939
diff changeset
   484
        done
a2aa2c51f3be test and implements workflow changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2939
diff changeset
   485
        """
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   486
        with self.admin_access.web_request() as req:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   487
            member = req.entity_from_eid(self.member_eid)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   488
            iworkflowable = member.cw_adapt_to('IWorkflowable')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   489
            iworkflowable.fire_transition('deactivate')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   490
            req.cnx.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   491
        with self.admin_access.shell() as shell:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   492
            wf = add_wf(shell, 'CWUser')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   493
            wf.add_state('asleep', initial=True)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   494
            shell.rqlexec('SET X custom_workflow WF WHERE X eid %(x)s, WF eid %(wf)s',
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   495
                         {'wf': wf.eid, 'x': self.member_eid})
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   496
            shell.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   497
        with self.admin_access.web_request() as req:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   498
            req.execute('DELETE X custom_workflow WF WHERE X eid %(x)s, WF eid %(wf)s',
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   499
                         {'wf': wf.eid, 'x': self.member_eid})
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   500
            member = req.entity_from_eid(self.member_eid)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   501
            iworkflowable = member.cw_adapt_to('IWorkflowable')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   502
            self.assertEqual(iworkflowable.state, 'asleep')# no change before commit
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   503
            req.cnx.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   504
            member.cw_clear_all_caches()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   505
            self.assertEqual(iworkflowable.current_workflow.name, "default user workflow")
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   506
            self.assertEqual(iworkflowable.state, 'activated')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   507
            self.assertEqual(parse_hist(iworkflowable.workflow_history),
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   508
                              [('activated', 'deactivated', 'deactivate', None),
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   509
                               ('deactivated', 'asleep', None, 'workflow changed to "CWUser"'),
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   510
                               ('asleep', 'activated', None, 'workflow changed to "default user workflow"'),])
2949
a2aa2c51f3be test and implements workflow changes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2939
diff changeset
   511
2920
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   512
3536
f6c9a5df80fb backport stable branch
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3230 3528
diff changeset
   513
class AutoTransitionTC(CubicWebTC):
3528
77a69de16709 support for automatic transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3206
diff changeset
   514
5056
5de07c77d73f [workflow] support for automatic transition starting from the initial state
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   515
    def setup_custom_wf(self):
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   516
        with self.admin_access.shell() as shell:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   517
            wf = add_wf(shell, 'CWUser')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   518
            asleep = wf.add_state('asleep', initial=True)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   519
            dead = wf.add_state('dead')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   520
            wf.add_transition('rest', asleep, asleep)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   521
            wf.add_transition('sick', asleep, dead, type=u'auto',
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   522
                              conditions=({'expr': u'X surname "toto"',
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   523
                                           'mainvars': u'X'},))
5056
5de07c77d73f [workflow] support for automatic transition starting from the initial state
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   524
        return wf
3528
77a69de16709 support for automatic transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3206
diff changeset
   525
77a69de16709 support for automatic transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3206
diff changeset
   526
    def test_auto_transition_fired(self):
5056
5de07c77d73f [workflow] support for automatic transition starting from the initial state
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   527
        wf = self.setup_custom_wf()
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   528
        with self.admin_access.web_request() as req:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   529
            user = self.create_user(req, 'member')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   530
            iworkflowable = user.cw_adapt_to('IWorkflowable')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   531
            req.execute('SET X custom_workflow WF WHERE X eid %(x)s, WF eid %(wf)s',
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   532
                        {'wf': wf.eid, 'x': user.eid})
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   533
            req.cnx.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   534
            user.cw_clear_all_caches()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   535
            self.assertEqual(iworkflowable.state, 'asleep')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   536
            self.assertEqual([t.name for t in iworkflowable.possible_transitions()],
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   537
                              ['rest'])
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   538
            iworkflowable.fire_transition('rest')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   539
            req.cnx.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   540
            user.cw_clear_all_caches()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   541
            self.assertEqual(iworkflowable.state, 'asleep')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   542
            self.assertEqual([t.name for t in iworkflowable.possible_transitions()],
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   543
                              ['rest'])
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   544
            self.assertEqual(parse_hist(iworkflowable.workflow_history),
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   545
                              [('asleep', 'asleep', 'rest', None)])
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   546
            user.cw_set(surname=u'toto') # fulfill condition
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   547
            req.cnx.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   548
            iworkflowable.fire_transition('rest')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   549
            req.cnx.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   550
            user.cw_clear_all_caches()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   551
            self.assertEqual(iworkflowable.state, 'dead')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   552
            self.assertEqual(parse_hist(iworkflowable.workflow_history),
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   553
                              [('asleep', 'asleep', 'rest', None),
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   554
                               ('asleep', 'asleep', 'rest', None),
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   555
                               ('asleep', 'dead', 'sick', None),])
3528
77a69de16709 support for automatic transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3206
diff changeset
   556
5056
5de07c77d73f [workflow] support for automatic transition starting from the initial state
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   557
    def test_auto_transition_custom_initial_state_fired(self):
5de07c77d73f [workflow] support for automatic transition starting from the initial state
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   558
        wf = self.setup_custom_wf()
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   559
        with self.admin_access.web_request() as req:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   560
            user = self.create_user(req, 'member', surname=u'toto')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   561
            req.execute('SET X custom_workflow WF WHERE X eid %(x)s, WF eid %(wf)s',
5056
5de07c77d73f [workflow] support for automatic transition starting from the initial state
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   562
                     {'wf': wf.eid, 'x': user.eid})
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   563
            req.cnx.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   564
            iworkflowable = user.cw_adapt_to('IWorkflowable')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   565
            self.assertEqual(iworkflowable.state, 'dead')
5056
5de07c77d73f [workflow] support for automatic transition starting from the initial state
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   566
5de07c77d73f [workflow] support for automatic transition starting from the initial state
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   567
    def test_auto_transition_initial_state_fired(self):
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   568
        with self.admin_access.web_request() as req:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   569
            wf = req.execute('Any WF WHERE ET default_workflow WF, '
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   570
                             'ET name %(et)s', {'et': 'CWUser'}).get_entity(0, 0)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   571
            dead = wf.add_state('dead')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   572
            wf.add_transition('sick', wf.state_by_name('activated'), dead,
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   573
                              type=u'auto', conditions=({'expr': u'X surname "toto"',
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   574
                                                         'mainvars': u'X'},))
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   575
            req.cnx.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   576
        with self.admin_access.web_request() as req:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   577
            user = self.create_user(req, 'member', surname=u'toto')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   578
            req.cnx.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   579
            iworkflowable = user.cw_adapt_to('IWorkflowable')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   580
            self.assertEqual(iworkflowable.state, 'dead')
5056
5de07c77d73f [workflow] support for automatic transition starting from the initial state
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5030
diff changeset
   581
3528
77a69de16709 support for automatic transition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3206
diff changeset
   582
2968
0e3460341023 somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2954
diff changeset
   583
class WorkflowHooksTC(CubicWebTC):
2920
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   584
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   585
    def setUp(self):
2968
0e3460341023 somewhat painful backport of 3.5 branch, should mostly be ok
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2954
diff changeset
   586
        CubicWebTC.setUp(self)
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   587
        with self.admin_access.web_request() as req:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   588
            self.wf = req.user.cw_adapt_to('IWorkflowable').current_workflow
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   589
            self.s_activated = self.wf.state_by_name('activated').eid
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   590
            self.s_deactivated = self.wf.state_by_name('deactivated').eid
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   591
            self.s_dummy = self.wf.add_state(u'dummy').eid
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   592
            self.wf.add_transition(u'dummy', (self.s_deactivated,), self.s_dummy)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   593
            ueid = self.create_user(req, 'stduser', commit=False).eid
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   594
            # test initial state is set
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   595
            rset = req.execute('Any N WHERE S name N, X in_state S, X eid %(x)s',
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   596
                                {'x' : ueid})
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   597
            self.assertFalse(rset, rset.rows)
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   598
            req.cnx.commit()
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   599
            initialstate = req.execute('Any N WHERE S name N, X in_state S, X eid %(x)s',
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   600
                                        {'x' : ueid})[0][0]
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   601
            self.assertEqual(initialstate, u'activated')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   602
            # give access to users group on the user's wf transitions
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   603
            # so we can test wf enforcing on euser (managers don't have anymore this
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   604
            # enforcement
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   605
            req.execute('SET X require_group G '
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   606
                         'WHERE G name "users", X transition_of WF, WF eid %(wf)s',
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   607
                         {'wf': self.wf.eid})
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   608
            req.cnx.commit()
2920
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   609
4835
13b0b96d7982 [repo] enhanced security handling: deprecates unsafe_execute, in favor of explicit read/write security control using the `enabled_security` context manager. Also code executed on the repository side is now unsafe by default.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4644
diff changeset
   610
    # XXX currently, we've to rely on hooks to set initial state, or to use execute
2920
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   611
    # def test_initial_state(self):
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   612
    #     cnx = self.login('stduser')
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   613
    #     cu = cnx.cursor()
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   614
    #     self.assertRaises(ValidationError, cu.execute,
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   615
    #                       'INSERT CWUser X: X login "badaboum", X upassword %(pwd)s, '
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   616
    #                       'X in_state S WHERE S name "deactivated"', {'pwd': 'oops'})
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   617
    #     cnx.close()
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   618
    #     # though managers can do whatever he want
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   619
    #     self.execute('INSERT CWUser X: X login "badaboum", X upassword %(pwd)s, '
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   620
    #                  'X in_state S, X in_group G WHERE S name "deactivated", G name "users"', {'pwd': 'oops'})
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   621
    #     self.commit()
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   622
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   623
    # test that the workflow is correctly enforced
3879
7bb87da97026 fix tests
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3628
diff changeset
   624
7bb87da97026 fix tests
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3628
diff changeset
   625
    def _cleanup_msg(self, msg):
7bb87da97026 fix tests
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3628
diff changeset
   626
        """remove the variable part of one specific error message"""
7bb87da97026 fix tests
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3628
diff changeset
   627
        lmsg = msg.split()
7bb87da97026 fix tests
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3628
diff changeset
   628
        lmsg.pop(1)
7bb87da97026 fix tests
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3628
diff changeset
   629
        lmsg.pop()
7bb87da97026 fix tests
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3628
diff changeset
   630
        return ' '.join(lmsg)
7bb87da97026 fix tests
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3628
diff changeset
   631
2920
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   632
    def test_transition_checking1(self):
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   633
        with self.new_access('stduser').repo_cnx() as cnx:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   634
            user = cnx.user
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   635
            iworkflowable = user.cw_adapt_to('IWorkflowable')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   636
            with self.assertRaises(ValidationError) as cm:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   637
                iworkflowable.fire_transition('activate')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   638
            self.assertEqual(self._cleanup_msg(cm.exception.errors['by_transition-subject']),
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   639
                             u"transition isn't allowed from")
2920
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   640
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   641
    def test_transition_checking2(self):
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   642
        with self.new_access('stduser').repo_cnx() as cnx:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   643
            user = cnx.user
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   644
            iworkflowable = user.cw_adapt_to('IWorkflowable')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   645
            with self.assertRaises(ValidationError) as cm:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   646
                iworkflowable.fire_transition('dummy')
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   647
            self.assertEqual(self._cleanup_msg(cm.exception.errors['by_transition-subject']),
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   648
                             u"transition isn't allowed from")
2920
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   649
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   650
    def test_transition_checking3(self):
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   651
        with self.new_access('stduser').repo_cnx() as cnx:
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   652
            user = cnx.user
8577
3f082de68802 [test] use session commit/rollback to be consistent with the test
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8562
diff changeset
   653
            iworkflowable = user.cw_adapt_to('IWorkflowable')
6796
e70ca9abfc51 [unittest2] update to unittest2 assertRaises api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6410
diff changeset
   654
            iworkflowable.fire_transition('deactivate')
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   655
            cnx.commit()
8577
3f082de68802 [test] use session commit/rollback to be consistent with the test
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8562
diff changeset
   656
            with self.assertRaises(ValidationError) as cm:
3f082de68802 [test] use session commit/rollback to be consistent with the test
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8562
diff changeset
   657
                iworkflowable.fire_transition('deactivate')
3f082de68802 [test] use session commit/rollback to be consistent with the test
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8562
diff changeset
   658
            self.assertEqual(self._cleanup_msg(cm.exception.errors['by_transition-subject']),
3f082de68802 [test] use session commit/rollback to be consistent with the test
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8562
diff changeset
   659
                                                u"transition isn't allowed from")
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   660
            cnx.rollback()
8577
3f082de68802 [test] use session commit/rollback to be consistent with the test
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8562
diff changeset
   661
            # get back now
3f082de68802 [test] use session commit/rollback to be consistent with the test
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8562
diff changeset
   662
            iworkflowable.fire_transition('activate')
9752
5df3ac51a91a [test] update entities/test/unittest_wfobjs to cw 3.19 api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9582
diff changeset
   663
            cnx.commit()
2920
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   664
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   665
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   666
if __name__ == '__main__':
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   667
    from logilab.common.testlib import unittest_main
64322aa83a1d start a new workflow engine
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
diff changeset
   668
    unittest_main()