def test_reverting_flow(self):
        wf = lw.Flow("the-test-action")
        wf.add(utils.make_reverting_task(1))
        wf.add(utils.make_reverting_task(2, True))

        capture_func, captured = self._capture_states()
        e = self._make_engine(wf)
        e.task_notifier.register('*', capture_func)

        self.assertRaises(Exception, e.run)

        run_context = e.storage.fetch('context')
        self.assertEquals('reverted', run_context[1])
        self.assertEquals(1, len(run_context))

        blowup_id = e.storage.get_uuid_by_name('blowup_2')
        happy_id = e.storage.get_uuid_by_name('do_apply_1')
        self.assertEquals(2, len(captured))
        self.assertIn(blowup_id, captured)

        expected_states = [states.RUNNING, states.FAILURE, states.REVERTING,
                           states.REVERTED, states.PENDING]
        self.assertEquals(expected_states, captured[blowup_id])

        expected_states = [states.RUNNING, states.SUCCESS, states.REVERTING,
                           states.REVERTED, states.PENDING]
        self.assertIn(happy_id, captured)
        self.assertEquals(expected_states, captured[happy_id])
    def test_sad_flow_state_changes(self):
        changes = []
        task_changes = []

        def listener(state, details):
            changes.append(state)

        def task_listener(state, details):
            if details.get('task_name') == 'blowup_1':
                task_changes.append(state)

        wf = lw.Flow("the-test-action")
        wf.add(utils.make_reverting_task(2, False))
        wf.add(utils.make_reverting_task(1, True))

        e = self._make_engine(wf)
        e.notifier.register('*', listener)
        e.task_notifier.register('*', task_listener)
        self.assertRaises(Exception, e.run)

        expected_states = [
            states.RUNNING,
            states.REVERTING,
            states.REVERTED,
            states.FAILURE,
        ]
        self.assertEquals(expected_states, changes)
        expected_states = [
            states.RUNNING,
            states.FAILURE,
            states.REVERTING,
            states.REVERTED,
            states.PENDING,
        ]
        self.assertEquals(expected_states, task_changes)
        context = e.storage.fetch('context')

        # Only 2 should have been reverted (which should have been
        # marked in the context as occuring).
        self.assertIn(2, context)
        self.assertEquals('reverted', context[2])
        self.assertNotIn(1, context)
    def test_happy_flow_state_changes(self):
        changes = []

        def listener(state, details):
            changes.append(state)

        wf = lw.Flow("the-test-action")
        wf.add(utils.make_reverting_task(1))

        e = self._make_engine(wf)
        e.notifier.register('*', listener)
        e.run()

        self.assertEquals([states.RUNNING, states.SUCCESS], changes)
    def test_happy_flow(self):
        wf = lw.Flow("the-test-action")
        for i in range(0, 10):
            wf.add(utils.make_reverting_task(i))

        e = self._make_engine(wf)
        capture_func, captured = self._capture_states()
        e.task_notifier.register('*', capture_func)
        e.run()

        context = e.storage.fetch('context')
        self.assertEquals(10, len(context))
        self.assertEquals(10, len(captured))
        for _k, v in context.items():
            self.assertEquals('passed', v)
        for _uuid, u_states in captured.items():
            self.assertEquals([states.RUNNING, states.SUCCESS], u_states)
 def test_reverting_flow(self):
     wf = uf.Flow("the-test-action")
     wf.add(utils.make_reverting_task('1'))
     wf.add(utils.make_reverting_task('2', blowup=True))
     e = self._make_engine(wf)
     self.assertRaises(Exception, e.run)
 def test_reverting_flow(self):
     wf = uf.Flow("the-test-action")
     wf.add(utils.make_reverting_task('1'))
     wf.add(utils.make_reverting_task('2', blowup=True))
     e = self._make_engine(wf)
     self.assertRaisesRegexp(RuntimeError, '^I blew up', e.run)
 def test_reverting_flow(self):
     wf = uf.Flow("the-test-action")
     wf.add(utils.make_reverting_task('1'))
     wf.add(utils.make_reverting_task('2', blowup=True))
     e = self._make_engine(wf)
     self.assertRaises(Exception, e.run)
 def test_reverting_flow(self):
     wf = uf.Flow("the-test-action")
     wf.add(utils.make_reverting_task('1'))
     wf.add(utils.make_reverting_task('2', blowup=True))
     e = self._make_engine(wf)
     self.assertRaisesRegexp(RuntimeError, '^I blew up', e.run)