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)
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')
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')
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)
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)
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)
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, )
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)
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)