示例#1
0
    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
示例#3
0
    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)
示例#5
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 = 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
        )
示例#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())
示例#7
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)
示例#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_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])
示例#11
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')
示例#12
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,
        )
示例#13
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)
示例#14
0
 def setUp(self):
     self.node = DistributionPlanNodeFactory()
示例#15
0
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)