def test_should_build_contact_with_details_from_contacts_service(self, mock_get): contact_id = '54335c56b3ae9d92f038abb0' fake_contact_json = {'firstName': "test", 'lastName': "user1", 'phone': "+256 782 443439", '_id': contact_id} fake_response = FakeResponse(fake_contact_json, 200) node = NodeFactory(contact_person_id=contact_id) mock_get.return_value = fake_response contact = node.build_contact() self.assertEqual(contact, fake_contact_json) mock_get.assert_called_with("%s%s/" % (settings.CONTACTS_SERVICE_URL, contact_id))
def setUp(self): self.contact = {'first_name': 'Test', 'last_name': 'User', 'phone': '+256 772 123456'} node = NodeFactory() self.line_item = DistributionPlanLineItemFactory(distribution_plan_node=node) local_celery.app.control.revoke = MagicMock(return_value=None) node.build_contact = MagicMock(return_value=self.contact) Node.objects.get = MagicMock(return_value=node) DistributionPlanLineItem.objects.get = MagicMock(return_value=self.line_item) self.MIDDLEMAN_FLOW_ID = FlowFactory(for_node_type=Node.MIDDLE_MAN).rapid_pro_id self.END_USER_FLOW_ID = FlowFactory(for_node_type=Node.END_USER).rapid_pro_id
def test_should_schedule_end_user_flow_if_node_tree_position_is_end_user(self, mock_current_run_for_node): node = NodeFactory(tree_position=Node.END_USER) node.build_contact = MagicMock(return_value=self.contact) mock_current_run_for_node.return_value = None Node.objects.get = MagicMock(return_value=node) schedule_run_for(node) mock_start_delivery_run.assert_called_with( contact_person=self.contact, flow=self.END_USER_FLOW_ID, item_description=ANY, sender=ANY )
def test_should_schedule_middleman_flow_if_node_tree_position_is_middleman(self, mock_current_run_for_node): node = NodeFactory(tree_position=Node.MIDDLE_MAN) node.build_contact = MagicMock(return_value=self.contact) line_item = DistributionPlanLineItemFactory(distribution_plan_node=node) mock_current_run_for_node.return_value = None DistributionPlanLineItem.objects.get = MagicMock(return_value=line_item) Node.objects.get = MagicMock(return_value=node) schedule_run_for(line_item) mock_start_delivery_run.assert_called_with(contact_person=self.contact, flow=self.MIDDLEMAN_FLOW_ID, item_description=ANY, sender=ANY)
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 = NodeFactory(consignee=sender_org) node = NodeFactory(consignee=sender_org, parent=parent_node) node.build_contact = MagicMock(return_value=self.contact) Node.objects.get = MagicMock(return_value=node) node.consignee.build_contact = MagicMock(return_value=self.contact) schedule_run_for(node) mock_start_delivery_run.assert_called_with( contact_person=self.contact, flow=ANY, sender=sender_org_name, item_description=node.item.item.description )
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_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 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_gets_all_response_for_node_consignee(self): multichoice_question = MultipleChoiceQuestionFactory(label='productReceived') yes_option = OptionFactory(text='Yes', question=multichoice_question) no_option = OptionFactory(text='No', question=multichoice_question) sugar = ItemFactory(description='Sugar') salt = ItemFactory(description='Salt') numeric_question = NumericQuestionFactory(label='AmountReceived') item = SalesOrderItemFactory(item=salt, description='10 bags of salt') salt_node = DistributionPlanNodeFactory(targeted_quantity=100, item=item) run = RunFactory(node=salt_node, status='completed') sugar_item = SalesOrderItemFactory(item=sugar, description='10 bags of sugar') sugar_node = DistributionPlanNodeFactory(targeted_quantity=100, item=sugar_item) sugar_run = RunFactory(node=sugar_node, status='completed') multiple_answer_one = MultipleChoiceAnswerFactory(run=run, question=multichoice_question, value=yes_option) numeric_answer_one = NumericAnswerFactory(run=run, value=80, question=numeric_question) multiple_answer_two = MultipleChoiceAnswerFactory(run=sugar_run, question=multichoice_question, value=no_option) numeric_answer_two = NumericAnswerFactory(run=sugar_run, value=80, question=numeric_question) salt_node_responses = salt_node.responses() sugar_node_responses = sugar_node.responses() self.assertIn(multiple_answer_one, salt_node_responses[run]) self.assertIn(numeric_answer_one, salt_node_responses[run]) self.assertIn(multiple_answer_two, sugar_node_responses[sugar_run]) self.assertIn(numeric_answer_two, sugar_node_responses[sugar_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 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 setUp(self): self.node = DistributionPlanNodeFactory()
class DistributionPlanNodeTest(TestCase): def setUp(self): self.node = DistributionPlanNodeFactory() def tearDown(self): DistributionPlanNode.objects.all().delete() ReleaseOrderItem.objects.all().delete() PurchaseOrderItem.objects.all().delete() SalesOrderItem.objects.all().delete() ReleaseOrder.objects.all().delete() PurchaseOrder.objects.all().delete() SalesOrder.objects.all().delete() @patch('requests.get') def test_should_build_contact_with_details_from_contacts_service(self, mock_get): contact_id = '54335c56b3ae9d92f038abb0' fake_contact_json = {'firstName': "test", 'lastName': "user1", 'phone': "+256 782 443439", '_id': contact_id} fake_response = FakeResponse(fake_contact_json, 200) node = NodeFactory(contact_person_id=contact_id) mock_get.return_value = fake_response contact = node.build_contact() self.assertEqual(contact, fake_contact_json) mock_get.assert_called_with("%s%s/" % (settings.CONTACTS_SERVICE_URL, contact_id)) def test_gets_all_response_for_node_consignee(self): multichoice_question = MultipleChoiceQuestionFactory(label='productReceived') yes_option = OptionFactory(text='Yes', question=multichoice_question) no_option = OptionFactory(text='No', question=multichoice_question) sugar = ItemFactory(description='Sugar') salt = ItemFactory(description='Salt') numeric_question = NumericQuestionFactory(label='AmountReceived') item = SalesOrderItemFactory(item=salt, description='10 bags of salt') salt_node = DistributionPlanNodeFactory(targeted_quantity=100, item=item) run = RunFactory(node=salt_node, status='completed') sugar_item = SalesOrderItemFactory(item=sugar, description='10 bags of sugar') sugar_node = DistributionPlanNodeFactory(targeted_quantity=100, item=sugar_item) sugar_run = RunFactory(node=sugar_node, status='completed') multiple_answer_one = MultipleChoiceAnswerFactory(run=run, question=multichoice_question, value=yes_option) numeric_answer_one = NumericAnswerFactory(run=run, value=80, question=numeric_question) multiple_answer_two = MultipleChoiceAnswerFactory(run=sugar_run, question=multichoice_question, value=no_option) numeric_answer_two = NumericAnswerFactory(run=sugar_run, value=80, question=numeric_question) salt_node_responses = salt_node.responses() sugar_node_responses = sugar_node.responses() self.assertIn(multiple_answer_one, salt_node_responses[run]) self.assertIn(numeric_answer_one, salt_node_responses[run]) self.assertIn(multiple_answer_two, sugar_node_responses[sugar_run]) self.assertIn(numeric_answer_two, sugar_node_responses[sugar_run]) def test_should_get_run_with_status_scheduled(self): run = RunFactory(node=self.node, status=Run.STATUS.scheduled) self.assertEqual(self.node.current_run(), run) def test_should_not_get_run_with_status_completed(self): RunFactory(node=self.node, status=Run.STATUS.completed) self.assertEqual(self.node.current_run(), None) def test_should_not_get_run_with_status_expired(self): RunFactory(node=self.node, status=Run.STATUS.expired) self.assertEqual(self.node.current_run(), None) def test_should_not_get_run_with_status_cancelled(self): RunFactory(node=self.node, status=Run.STATUS.cancelled) self.assertEqual(self.node.current_run(), None) def test_should_get_the_completed_run(self): self.assertIsNone(self.node.completed_run()) run = RunFactory(node=self.node, status=Run.STATUS.completed) self.assertEqual(self.node.completed_run(), run) def test_should_get_latest_run(self): first_run = RunFactory(node=self.node) self.assertEqual(self.node.latest_run(), first_run) second_run = RunFactory(node=self.node) self.assertEqual(self.node.latest_run(), second_run)