예제 #1
0
    def test_should_cancel_scheduled_flow_for_a_consignee_before_scheduling_another_one_for_that_node_line_item(
            self):
        node = DistributionPlanNodeFactory(consignee=self.consignee)
        line_item_one = DistributionPlanLineItemFactory(
            distribution_plan_node=node,
            planned_distribution_date=datetime.datetime.now())
        DistributionPlanLineItemFactory(
            distribution_plan_node=node,
            planned_distribution_date=datetime.datetime.now())

        when(DistributionPlanNode.objects).get(id=node.id).thenReturn(node)
        when(DistributionPlanLineItem.objects).get(
            id=line_item_one.id).thenReturn(line_item_one)
        when(node.consignee).build_contact().thenReturn(self.contact)

        schedule_run_for(line_item_one)

        task_id = line_item_one.current_node_line_item_run(
        ).scheduled_message_task_id
        when(celery.app.control).revoke(task_id).thenReturn(None)

        schedule_run_for(line_item_one)

        verify(celery.app.control).revoke(task_id)
        verify(fake_facade,
               times=2).start_delivery_flow(sender=any(),
                                            consignee=any(),
                                            item_description=any())
 def test_should_get_node_line_item_run_with_status_in_progress(self):
     node_line_item = DistributionPlanLineItemFactory()
     line_item_run = NodeLineItemRunFactory(
         node_line_item=node_line_item,
         status=NodeLineItemRun.STATUS.in_progress)
     self.assertEqual(node_line_item.current_node_line_item_run(),
                      line_item_run)
    def test_should_get_the_current_completed_line_item_run(self):
        node_line_item = DistributionPlanLineItemFactory()

        self.assertIsNone(node_line_item.completed_run())

        line_item_run = NodeLineItemRunFactory(node_line_item=node_line_item, status='completed')

        self.assertEqual(node_line_item.completed_run(), line_item_run)
예제 #4
0
    def xtest_should_change_status_of_node_run_to_in_progress_when_scheduled_task_is_started(self):
        node = DistributionPlanNodeFactory(consignee=self.consignee)
        line_item = DistributionPlanLineItemFactory(distribution_plan_node=node,
                                                    planned_distribution_date=datetime.datetime.now())

        when(DistributionPlanNode.objects).get(id=node.id).thenReturn(node)
        when(DistributionPlanLineItem.objects).get(id=line_item.id).thenReturn(line_item)
        when(node.consignee).build_contact().thenReturn(self.contact)

        schedule_run_for(line_item)

        self.assertEqual(line_item.current_node_line_item_run().status, 'in_progress')
예제 #5
0
    def xtest_should_change_status_of_node_run_to_in_progress_when_scheduled_task_is_started(
            self):
        node = DistributionPlanNodeFactory(consignee=self.consignee)
        line_item = DistributionPlanLineItemFactory(
            distribution_plan_node=node,
            planned_distribution_date=datetime.datetime.now())

        when(DistributionPlanNode.objects).get(id=node.id).thenReturn(node)
        when(DistributionPlanLineItem.objects).get(
            id=line_item.id).thenReturn(line_item)
        when(node.consignee).build_contact().thenReturn(self.contact)

        schedule_run_for(line_item)

        self.assertEqual(line_item.current_node_line_item_run().status,
                         'in_progress')
예제 #6
0
    def test_should_cancel_scheduled_flow_for_a_consignee_before_scheduling_another_one_for_that_node_line_item(self):
        node = DistributionPlanNodeFactory(consignee=self.consignee)
        line_item_one = DistributionPlanLineItemFactory(distribution_plan_node=node,
                                                        planned_distribution_date=datetime.datetime.now())
        DistributionPlanLineItemFactory(distribution_plan_node=node,
                                        planned_distribution_date=datetime.datetime.now())

        when(DistributionPlanNode.objects).get(id=node.id).thenReturn(node)
        when(DistributionPlanLineItem.objects).get(id=line_item_one.id).thenReturn(line_item_one)
        when(node.consignee).build_contact().thenReturn(self.contact)

        schedule_run_for(line_item_one)

        task_id = line_item_one.current_node_line_item_run().scheduled_message_task_id
        when(celery.app.control).revoke(task_id).thenReturn(None)

        schedule_run_for(line_item_one)

        verify(celery.app.control).revoke(task_id)
        verify(fake_facade, times=2).start_delivery_flow(sender=any(), consignee=any(), item_description=any())
class DistributionPlanLineItemTest(TestCase):
    def setUp(self):
        self.node_line_item = DistributionPlanLineItemFactory()

    def test_should_have_all_expected_fields(self):
        line_item = DistributionPlanLineItem()
        fields_in_item = line_item._meta._name_map

        self.assertEqual(len(line_item._meta.fields), 7)
        expected_fields = [
            'item_id', 'targeted_quantity', 'planned_distribution_date', 'remark', 'distribution_plan_node_id', 'id',
            'track']

        for field in expected_fields:
            self.assertIn(field, fields_in_item)

    def test_should_get_node_line_item_run_with_status_scheduled(self):
        line_item_run = NodeLineItemRunFactory(node_line_item=self.node_line_item,
                                               status=NodeLineItemRun.STATUS.scheduled)
        self.assertEqual(self.node_line_item.current_run(), line_item_run)

    def test_should_not_get_node_line_item_run_with_status_completed(self):
        NodeLineItemRunFactory(node_line_item=self.node_line_item, status=NodeLineItemRun.STATUS.completed)
        self.assertEqual(self.node_line_item.current_run(), None)

    def test_should_not_get_node_line_item_run_with_status_expired(self):
        NodeLineItemRunFactory(node_line_item=self.node_line_item, status=NodeLineItemRun.STATUS.expired)
        self.assertEqual(self.node_line_item.current_run(), None)

    def test_should_not_get_node_line_item_run_with_status_cancelled(self):
        NodeLineItemRunFactory(node_line_item=self.node_line_item, status=NodeLineItemRun.STATUS.cancelled)
        self.assertEqual(self.node_line_item.current_run(), None)

    def test_should_get_the_completed_line_item_run(self):
        self.assertIsNone(self.node_line_item.completed_run())

        line_item_run = NodeLineItemRunFactory(node_line_item=self.node_line_item,
                                               status=NodeLineItemRun.STATUS.completed)

        self.assertEqual(self.node_line_item.completed_run(), line_item_run)

    def test_should_get_latest_run(self):
        first_run = NodeLineItemRunFactory(node_line_item=self.node_line_item)

        self.assertEqual(self.node_line_item.latest_run(), first_run)

        second_run = NodeLineItemRunFactory(node_line_item=self.node_line_item)

        self.assertEqual(self.node_line_item.latest_run(), second_run)
예제 #8
0
    def test_queues_run_for_particular_line_item_node(self):
        contact_person_id = 'id'
        start_run_date = datetime.now()

        consignee = ConsigneeFactory(contact_person_id=contact_person_id)
        node = DistributionPlanNodeFactory(consignee=consignee)
        node_line_item = DistributionPlanLineItemFactory(
            distribution_plan_node=node)

        RunQueue.enqueue(node_line_item, start_run_date)
        queued_run = RunQueue.deque(contact_person_id)

        self.assertEqual(queued_run.status, RunQueue.STATUS.not_started)
        self.assertEqual(queued_run.contact_person_id, contact_person_id)
예제 #9
0
    def test_should_schedule_flow_to_start_at_specific_time_after_expected_date_of_delivery(
            self):
        node = DistributionPlanNodeFactory(consignee=self.consignee)
        line_item = DistributionPlanLineItemFactory(
            distribution_plan_node=node,
            planned_distribution_date=datetime.datetime.now())

        when(DistributionPlanNode.objects).get(id=node.id).thenReturn(node)
        when(DistributionPlanLineItem.objects).get(
            id=line_item.id).thenReturn(line_item)
        when(node.consignee).build_contact().thenReturn(self.contact)

        schedule_run_for(line_item)

        self.assertEqual(mock_celery.invoked_after, 604800.0)
예제 #10
0
    def test_should_schedule_a_flow_with_sender_as_unicef_if_node_has_no_parent(
            self):
        node = DistributionPlanNodeFactory(consignee=self.consignee)
        line_item = DistributionPlanLineItemFactory(
            distribution_plan_node=node)

        when(DistributionPlanNode.objects).get(id=node.id).thenReturn(node)
        when(DistributionPlanLineItem.objects).get(
            id=line_item.id).thenReturn(line_item)
        when(node.consignee).build_contact().thenReturn(self.contact)

        schedule_run_for(line_item)

        verify(fake_facade).start_delivery_flow(
            sender='UNICEF',
            consignee=self.contact,
            item_description=line_item.item.description,
        )
예제 #11
0
    def test_should_save_a_node_line_item_run_with_task_id_after_and_phone_as_cache_scheduling_the_flow(
            self):
        node = DistributionPlanNodeFactory(consignee=self.consignee)
        line_item = DistributionPlanLineItemFactory(
            distribution_plan_node=node,
            planned_distribution_date=datetime.datetime.now())

        when(DistributionPlanNode.objects).get(id=node.id).thenReturn(node)
        when(DistributionPlanLineItem.objects).get(
            id=line_item.id).thenReturn(line_item)
        when(node.consignee).build_contact().thenReturn(self.contact)

        schedule_run_for(line_item)

        node_line_item_run_set = line_item.nodelineitemrun_set.all()
        self.assertEqual(len(node_line_item_run_set), 1)
        self.assertEqual(node_line_item_run_set[0].phone,
                         self.contact['phone'])
        self.assertEqual(node_line_item_run_set[0].scheduled_message_task_id,
                         mock_celery.task_id)
예제 #12
0
    def test_should_schedule_flow_with_sender_as_parent_node_consignee_name_if_node_has_parent(
            self):
        sender_org_name = "Dwelling Places"
        sender_org = ConsigneeFactory(name=sender_org_name)
        parent_node = DistributionPlanNodeFactory(consignee=sender_org)
        node = DistributionPlanNodeFactory(consignee=self.consignee,
                                           parent=parent_node)
        line_item = DistributionPlanLineItemFactory(
            distribution_plan_node=node)

        when(DistributionPlanNode.objects).get(id=node.id).thenReturn(node)
        when(DistributionPlanLineItem.objects).get(
            id=line_item.id).thenReturn(line_item)
        when(node.consignee).build_contact().thenReturn(self.contact)

        schedule_run_for(line_item)

        verify(fake_facade).start_delivery_flow(
            sender=sender_org_name,
            consignee=self.contact,
            item_description=line_item.item.description)
 def setUp(self):
     self.node_line_item = DistributionPlanLineItemFactory()
 def test_should_not_get_node_line_item_run_with_status_cancelled(self):
     node_line_item = DistributionPlanLineItemFactory()
     NodeLineItemRunFactory(node_line_item=node_line_item, status=NodeLineItemRun.STATUS.cancelled)
     self.assertEqual(node_line_item.current_run(), None)
 def test_should_get_node_line_item_run_with_status_scheduled(self):
     node_line_item = DistributionPlanLineItemFactory()
     line_item_run = NodeLineItemRunFactory(node_line_item=node_line_item, status=NodeLineItemRun.STATUS.scheduled)
     self.assertEqual(node_line_item.current_run(), line_item_run)
 def test_should_not_get_node_line_item_run_with_status_expired(self):
     node_line_item = DistributionPlanLineItemFactory()
     NodeLineItemRunFactory(node_line_item=node_line_item,
                            status=NodeLineItemRun.STATUS.expired)
     self.assertEqual(node_line_item.current_node_line_item_run(), None)