Skip to content
Snippets Groups Projects
test_workflow.py 4.35 KiB
Newer Older
  • Learn to ignore specific revisions
  • from django.test import SimpleTestCase
    
    Todd Dembrey's avatar
    Todd Dembrey committed
    from django.forms import Form
    
    Todd Dembrey's avatar
    Todd Dembrey committed
    
    
    from opentech.apply.workflow import (
        Action,
        ChangePhaseAction,
        NextPhaseAction,
        Phase,
        Stage,
        Workflow,
    )
    
    from .factories import ActionFactory, PhaseFactory, StageFactory, WorkflowFactory
    
    class TestWorkflowCreation(SimpleTestCase):
    
        def test_can_create_workflow(self):
    
            stage = StageFactory()
    
            class NewWorkflow(Workflow):
                name = 'single_stage'
                stage_classes = [stage]
            workflow = NewWorkflow([Form()])
            self.assertEqual(workflow.name, NewWorkflow.name)
            self.assertEqual(len(workflow.stages), 1)
    
        def test_returns_first_phase_if_no_arg(self):
            workflow = WorkflowFactory(num_stages=1, stages__num_phases=1)
            self.assertEqual(workflow.next(), workflow.stages[0].phases[0])
    
        def test_can_get_the_current_phase(self):
            workflow = WorkflowFactory(num_stages=1, stages__num_phases=2)
            phase = workflow.stages[0].phases[0]
            self.assertEqual(workflow.current(str(phase)), phase)
    
    
        def test_returns_next_stage(self):
            workflow = WorkflowFactory(num_stages=2, stages__num_phases=1)
            self.assertEqual(workflow.next_stage(workflow.stages[0]), workflow.stages[1])
    
    
        def test_returns_none_if_no_next(self):
    
            workflow = WorkflowFactory(num_stages=1, stages__num_phases=1)
            self.assertEqual(workflow.next(workflow.stages[0].phases[0]), None)
    
        def test_returns_next_phase(self):
            workflow = WorkflowFactory(num_stages=2, stages__num_phases=1)
            self.assertEqual(workflow.next(workflow.stages[0].phases[0]), workflow.stages[1].phases[0])
    
        def test_returns_next_phase_shared_name(self):
            workflow = WorkflowFactory(num_stages=1, stages__num_phases=3, stages__phases__name='the_same')
            self.assertEqual(workflow.next(workflow.stages[0].phases[0]), workflow.stages[0].phases[1])
    
    
    class TestStageCreation(SimpleTestCase):
        def test_can_create_stage(self):
            name = 'the_stage'
    
    Todd Dembrey's avatar
    Todd Dembrey committed
            form = Form()
    
            stage = Stage(form, name=name)
    
            self.assertEqual(stage.name, name)
    
    Todd Dembrey's avatar
    Todd Dembrey committed
            self.assertEqual(stage.form, form)
    
        def test_can_get_next_phase(self):
    
            stage = StageFactory.build(num_phases=2)
    
            self.assertEqual(stage.next(stage.phases[0]), stage.phases[1])
    
        def test_get_none_if_no_next_phase(self):
    
            stage = StageFactory.build(num_phases=1)
    
            self.assertEqual(stage.next(stage.phases[0]), None)
    
    Todd Dembrey's avatar
    Todd Dembrey committed
    
    class TestPhaseCreation(SimpleTestCase):
        def test_can_create_phase(self):
            name = 'the_phase'
    
    Todd Dembrey's avatar
    Todd Dembrey committed
            self.assertEqual(phase.name, name)
    
    
        def test_can_get_action_from_phase(self):
            actions = ActionFactory.create_batch(3)
            action = actions[1]
            phase = PhaseFactory(actions=actions)
            self.assertEqual(phase[action.name], action)
    
        def test_uses_name_if_no_public(self):
            phase = Phase('Phase Name')
            self.assertEqual(phase.public_name, phase.name)
    
        def test_uses_public_if_provided(self):
            public_name = 'Public Name'
            phase = Phase('Phase Name', public_name=public_name)
            self.assertEqual(phase.public_name, public_name)
            self.assertNotEqual(phase.public_name, phase.name)
    
        def test_uses_public_if_provided_on_class(self):
            class NewPhase(Phase):
                public_name = 'Public Name'
            phase = NewPhase('Phase Name')
            self.assertEqual(phase.public_name, NewPhase.public_name)
            self.assertNotEqual(phase.public_name, phase.name)
    
    
    Todd Dembrey's avatar
    Todd Dembrey committed
    
    class TestActions(SimpleTestCase):
        def test_can_create_action(self):
            name = 'action stations'
            action = Action(name)
            self.assertEqual(action.name, name)
    
    
        def test_calling_processes_the_action(self):
            action = ActionFactory()
            with self.assertRaises(NotImplementedError):
    
                action.process('')
    
    
    
    class TestCustomActions(SimpleTestCase):
        def test_next_phase_action_returns_none_if_no_next(self):
            action = NextPhaseAction('the next!')
            phase = PhaseFactory(actions=[action])
            self.assertEqual(phase.process(action.name), None)
    
        def test_next_phase_action_returns_next_phase(self):
            action = NextPhaseAction('the next!')
            stage = StageFactory.build(num_phases=2, phases__actions=[action])
            self.assertEqual(stage.phases[0].process(action.name), stage.phases[1])