237 ('state1', 'swfstate1', 'swftr1', 'au'), |
237 ('state1', 'swfstate1', 'swftr1', 'au'), |
238 ('swfstate1', 'swfstate3', 'tr2', 'chapeau'), |
238 ('swfstate1', 'swfstate3', 'tr2', 'chapeau'), |
239 ('swfstate3', 'state3', 'swftr1', 'exiting from subworkflow subworkflow'), |
239 ('swfstate3', 'state3', 'swftr1', 'exiting from subworkflow subworkflow'), |
240 ]) |
240 ]) |
241 |
241 |
242 def test_subworkflow_exit_consistency(self): |
242 def test_swf_exit_consistency(self): |
243 # sub-workflow |
243 # sub-workflow |
244 swf = add_wf(self, 'CWGroup', name='subworkflow') |
244 swf = add_wf(self, 'CWGroup', name='subworkflow') |
245 swfstate1 = swf.add_state(u'swfstate1', initial=True) |
245 swfstate1 = swf.add_state(u'swfstate1', initial=True) |
246 swfstate2 = swf.add_state(u'swfstate2') |
246 swfstate2 = swf.add_state(u'swfstate2') |
247 tr1 = swf.add_transition(u'tr1', (swfstate1,), swfstate2) |
247 tr1 = swf.add_transition(u'tr1', (swfstate1,), swfstate2) |
253 mwf.add_wftransition(u'swftr1', swf, state1, |
253 mwf.add_wftransition(u'swftr1', swf, state1, |
254 [(swfstate2, state2), (swfstate2, state3)]) |
254 [(swfstate2, state2), (swfstate2, state3)]) |
255 ex = self.assertRaises(ValidationError, self.commit) |
255 ex = self.assertRaises(ValidationError, self.commit) |
256 self.assertEquals(ex.errors, {'subworkflow_exit': u"can't have multiple exits on the same state"}) |
256 self.assertEquals(ex.errors, {'subworkflow_exit': u"can't have multiple exits on the same state"}) |
257 |
257 |
|
258 def test_swf_fire_in_a_row(self): |
|
259 # sub-workflow |
|
260 subwf = add_wf(self, 'CWGroup', name='subworkflow') |
|
261 xsigning = subwf.add_state('xsigning', initial=True) |
|
262 xaborted = subwf.add_state('xaborted') |
|
263 xsigned = subwf.add_state('xsigned') |
|
264 xabort = subwf.add_transition('xabort', (xsigning,), xaborted) |
|
265 xsign = subwf.add_transition('xsign', (xsigning,), xsigning) |
|
266 xcomplete = subwf.add_transition('xcomplete', (xsigning,), xsigned, |
|
267 type=u'auto') |
|
268 # main workflow |
|
269 twf = add_wf(self, 'CWGroup', name='mainwf', default=True) |
|
270 created = twf.add_state(_('created'), initial=True) |
|
271 identified = twf.add_state(_('identified')) |
|
272 released = twf.add_state(_('released')) |
|
273 closed = twf.add_state(_('closed')) |
|
274 twf.add_wftransition(_('identify'), subwf, (created,), |
|
275 [(xsigned, identified), (xaborted, created)]) |
|
276 twf.add_wftransition(_('release'), subwf, (identified,), |
|
277 [(xsigned, released), (xaborted, identified)]) |
|
278 twf.add_wftransition(_('close'), subwf, (released,), |
|
279 [(xsigned, closed), (xaborted, released)]) |
|
280 self.commit() |
|
281 group = self.add_entity('CWGroup', name=u'grp1') |
|
282 self.commit() |
|
283 for trans in ('identify', 'release', 'close'): |
|
284 group.fire_transition(trans) |
|
285 self.commit() |
|
286 |
|
287 |
|
288 def test_swf_magic_tr(self): |
|
289 # sub-workflow |
|
290 subwf = add_wf(self, 'CWGroup', name='subworkflow') |
|
291 xsigning = subwf.add_state('xsigning', initial=True) |
|
292 xaborted = subwf.add_state('xaborted') |
|
293 xsigned = subwf.add_state('xsigned') |
|
294 xabort = subwf.add_transition('xabort', (xsigning,), xaborted) |
|
295 xsign = subwf.add_transition('xsign', (xsigning,), xsigned) |
|
296 # main workflow |
|
297 twf = add_wf(self, 'CWGroup', name='mainwf', default=True) |
|
298 created = twf.add_state(_('created'), initial=True) |
|
299 identified = twf.add_state(_('identified')) |
|
300 released = twf.add_state(_('released')) |
|
301 twf.add_wftransition(_('identify'), subwf, created, |
|
302 [(xaborted, None), (xsigned, identified)]) |
|
303 twf.add_wftransition(_('release'), subwf, identified, |
|
304 [(xaborted, None)]) |
|
305 self.commit() |
|
306 group = self.add_entity('CWGroup', name=u'grp1') |
|
307 self.commit() |
|
308 for trans, nextstate in (('identify', 'xsigning'), |
|
309 ('xabort', 'created'), |
|
310 ('identify', 'xsigning'), |
|
311 ('xsign', 'identified'), |
|
312 ('release', 'xsigning'), |
|
313 ('xabort', 'identified') |
|
314 ): |
|
315 group.fire_transition(trans) |
|
316 self.commit() |
|
317 group.clear_all_caches() |
|
318 self.assertEquals(group.state, nextstate) |
|
319 |
258 |
320 |
259 class CustomWorkflowTC(CubicWebTC): |
321 class CustomWorkflowTC(CubicWebTC): |
260 |
322 |
261 def setup_database(self): |
323 def setup_database(self): |
262 self.member = self.create_user('member') |
324 self.member = self.create_user('member') |