예제 #1
0
    def test_missed_call_trigger(self):
        self.login(self.admin)
        flow = self.create_flow()

        trigger_url = reverse("triggers.trigger_missed_call")

        response = self.client.get(trigger_url)
        self.assertEqual(response.status_code, 200)

        response = self.client.post(trigger_url, {"flow": flow.id})
        self.assertEqual(response.status_code, 200)

        trigger = Trigger.objects.order_by("id").last()

        self.assertEqual(trigger.trigger_type, Trigger.TYPE_MISSED_CALL)
        self.assertEqual(trigger.flow, flow)

        other_flow = Flow.copy(flow, self.admin)

        response = self.client.post(
            reverse("triggers.trigger_update", args=[trigger.id]),
            {"flow": other_flow.id})
        self.assertEqual(response.status_code, 302)

        trigger.refresh_from_db()
        self.assertEqual(trigger.flow, other_flow)

        # create ten missed call triggers
        for i in range(10):
            response = self.client.get(trigger_url)
            self.assertEqual(response.status_code, 200)

            self.client.post(trigger_url, {"flow": flow.id})

            self.assertEqual(Trigger.objects.all().count(), i + 2)
            self.assertEqual(
                Trigger.objects.filter(
                    is_archived=False,
                    trigger_type=Trigger.TYPE_MISSED_CALL).count(), 1)

        # even unarchiving we only have one active trigger at a time
        triggers = Trigger.objects.filter(
            trigger_type=Trigger.TYPE_MISSED_CALL, is_archived=True)
        active_trigger = Trigger.objects.get(
            trigger_type=Trigger.TYPE_MISSED_CALL, is_archived=False)

        response = self.client.post(reverse("triggers.trigger_archived"), {
            "action": "restore",
            "objects": [t.id for t in triggers]
        })

        self.assertEqual(response.status_code, 200)
        self.assertEqual(
            Trigger.objects.filter(
                is_archived=False,
                trigger_type=Trigger.TYPE_MISSED_CALL).count(), 1)
        self.assertNotEqual(
            active_trigger,
            Trigger.objects.filter(is_archived=False,
                                   trigger_type=Trigger.TYPE_MISSED_CALL)[0])
예제 #2
0
    def test_catch_all_trigger(self):
        self.login(self.admin)
        catch_all_trigger = Trigger.get_triggers_of_type(self.org, Trigger.TYPE_CATCH_ALL).first()
        flow = self.create_flow()

        contact = self.create_contact("Ali", "250788739305")

        # make our first message echo back the original message
        action_set = ActionSet.objects.get(uuid=flow.entry_uuid)
        actions = action_set.as_json()['actions']
        actions[0]['msg']['base'] = 'Echo: @step.value'
        action_set.set_actions_dict(actions)
        action_set.save()

        self.assertFalse(catch_all_trigger)

        Msg.create_incoming(self.channel, contact.get_urn().urn, "Hi")
        self.assertEquals(1, Msg.objects.all().count())
        self.assertEquals(0, flow.runs.all().count())

        trigger_url = reverse("triggers.trigger_catchall")

        response = self.client.get(trigger_url)
        self.assertEquals(response.status_code, 200)

        post_data = dict(flow=flow.pk)

        response = self.client.post(trigger_url, post_data)
        trigger = Trigger.objects.all().order_by('-pk')[0]

        self.assertEquals(trigger.trigger_type, Trigger.TYPE_CATCH_ALL)
        self.assertEquals(trigger.flow.pk, flow.pk)

        catch_all_trigger = Trigger.get_triggers_of_type(self.org, Trigger.TYPE_CATCH_ALL).first()

        self.assertEquals(catch_all_trigger.pk, trigger.pk)

        incoming = Msg.create_incoming(self.channel, contact.get_urn().urn, "Hi")
        self.assertEquals(1, flow.runs.all().count())
        self.assertEquals(flow.runs.all()[0].contact.pk, contact.pk)
        reply = Msg.objects.get(response_to=incoming)
        self.assertEquals('Echo: Hi', reply.text)

        other_flow = Flow.copy(flow, self.admin)
        post_data = dict(flow=other_flow.pk)

        self.client.post(reverse("triggers.trigger_update", args=[trigger.pk]), post_data)
        trigger = Trigger.objects.get(pk=trigger.pk)
        self.assertEquals(trigger.flow.pk, other_flow.pk)

        # try to create another catch all trigger
        response = self.client.post(trigger_url, post_data)

        # shouldn't have succeeded as we already have a catch-all trigger
        self.assertTrue(len(response.context['form'].errors))

        # archive the previous one
        trigger.is_archived = True
        trigger.save()
        old_catch_all = trigger

        # try again
        self.client.post(trigger_url, post_data)

        # this time we are a go
        new_catch_all = Trigger.objects.get(is_archived=False, trigger_type=Trigger.TYPE_CATCH_ALL)

        # now add a new trigger based on a group
        group = self.create_group("Trigger Group", [])
        post_data['groups'] = [group.pk]
        response = self.client.post(trigger_url, post_data)

        # should now have two catch all triggers
        self.assertEquals(2, Trigger.objects.filter(is_archived=False, trigger_type=Trigger.TYPE_CATCH_ALL).count())

        group_catch_all = Trigger.objects.get(is_archived=False, trigger_type=Trigger.TYPE_CATCH_ALL, groups=group)

        # try to add another catchall trigger with a few different groups
        group2 = self.create_group("Trigger Group 2", [])
        post_data['groups'] = [group.pk, group2.pk]
        response = self.client.post(trigger_url, post_data)

        # should have failed
        self.assertTrue(len(response.context['form'].errors))

        post_data = dict()
        post_data['action'] = 'restore'
        post_data['objects'] = [old_catch_all.pk]

        response = self.client.post(reverse("triggers.trigger_archived"), post_data)
        old_catch_all.refresh_from_db()
        new_catch_all.refresh_from_db()

        # our new triggers should have been auto-archived, our old one is now active
        self.assertEquals(2, Trigger.objects.filter(is_archived=False, trigger_type=Trigger.TYPE_CATCH_ALL).count())
        self.assertTrue(new_catch_all.is_archived)
        self.assertFalse(old_catch_all.is_archived)

        # ok, archive our old one too, leaving only our group specific trigger
        old_catch_all.is_archived = True
        old_catch_all.save()

        # try a message again, this shouldn't cause anything since the contact isn't part of our group
        FlowRun.objects.all().delete()
        Msg.objects.all().delete()

        incoming = Msg.create_incoming(self.channel, contact.get_urn().urn, "Hi")
        self.assertEquals(0, FlowRun.objects.all().count())
        self.assertFalse(Msg.objects.filter(response_to=incoming))

        # now add the contact to the group
        group.contacts.add(contact)

        # this time should trigger the flow
        incoming = Msg.create_incoming(self.channel, contact.get_urn().urn, "Hi")
        self.assertEquals(1, FlowRun.objects.all().count())
        self.assertEquals(other_flow.runs.all()[0].contact.pk, contact.pk)
        reply = Msg.objects.get(response_to=incoming)
        self.assertEquals('Echo: Hi', reply.text)

        # delete the group
        group.release()

        # trigger should no longer be active
        group_catch_all.refresh_from_db()
        self.assertFalse(group_catch_all.is_active)
예제 #3
0
    def test_missed_call_trigger(self):
        self.login(self.admin)
        missed_call_trigger = Trigger.get_triggers_of_type(self.org, Trigger.TYPE_MISSED_CALL).first()
        flow = self.create_flow()
        contact = self.create_contact("Ali", "250788739305")

        self.assertFalse(missed_call_trigger)

        ChannelEvent.create(self.channel, contact.get_urn(TEL_SCHEME).urn, ChannelEvent.TYPE_CALL_IN_MISSED, timezone.now(), 0)
        self.assertEqual(ChannelEvent.objects.all().count(), 1)
        self.assertEqual(flow.runs.all().count(), 0)

        trigger_url = reverse("triggers.trigger_missed_call")

        response = self.client.get(trigger_url)
        self.assertEquals(response.status_code, 200)

        post_data = dict(flow=flow.pk)

        response = self.client.post(trigger_url, post_data)
        trigger = Trigger.objects.all().order_by('-pk')[0]

        self.assertEquals(trigger.trigger_type, Trigger.TYPE_MISSED_CALL)
        self.assertEquals(trigger.flow.pk, flow.pk)

        missed_call_trigger = Trigger.get_triggers_of_type(self.org, Trigger.TYPE_MISSED_CALL).first()

        self.assertEquals(missed_call_trigger.pk, trigger.pk)

        ChannelEvent.create(self.channel, contact.get_urn(TEL_SCHEME).urn, ChannelEvent.TYPE_CALL_IN_MISSED, timezone.now(), 0)
        self.assertEqual(ChannelEvent.objects.all().count(), 2)
        self.assertEqual(flow.runs.all().count(), 1)
        self.assertEqual(flow.runs.all()[0].contact.pk, contact.pk)

        other_flow = Flow.copy(flow, self.admin)
        post_data = dict(flow=other_flow.pk)

        response = self.client.post(reverse("triggers.trigger_update", args=[trigger.pk]), post_data)
        trigger = Trigger.objects.get(pk=trigger.pk)
        self.assertEquals(trigger.flow.pk, other_flow.pk)

        # create ten missed call triggers
        for i in range(10):
            response = self.client.get(trigger_url)
            self.assertEquals(response.status_code, 200)

            post_data = dict(flow=flow.pk)

            response = self.client.post(trigger_url, post_data)
            self.assertEqual(i + 2, Trigger.objects.all().count())
            self.assertEqual(1, Trigger.objects.filter(is_archived=False, trigger_type=Trigger.TYPE_MISSED_CALL).count())

        # even unarchiving we only have one acive trigger at a time
        triggers = Trigger.objects.filter(trigger_type=Trigger.TYPE_MISSED_CALL, is_archived=True)
        active_trigger = Trigger.objects.get(trigger_type=Trigger.TYPE_MISSED_CALL, is_archived=False)

        post_data = dict()
        post_data['action'] = 'restore'
        post_data['objects'] = [t.pk for t in triggers]

        response = self.client.post(reverse("triggers.trigger_archived"), post_data)
        self.assertEquals(1, Trigger.objects.filter(is_archived=False, trigger_type=Trigger.TYPE_MISSED_CALL).count())
        self.assertFalse(active_trigger.pk == Trigger.objects.filter(is_archived=False, trigger_type=Trigger.TYPE_MISSED_CALL)[0].pk)
예제 #4
0
    def test_runs(self):
        url = reverse('api.v2.runs')

        self.assertEndpointAccess(url)

        flow1 = self.create_flow(uuid_start=0)
        flow2 = Flow.copy(flow1, self.user)

        joe_run1, = flow1.start([], [self.joe])
        frank_run1, = flow1.start([], [self.frank])
        self.create_msg(direction='I', contact=self.joe, text="it is blue").handle()
        self.create_msg(direction='I', contact=self.frank, text="Indigo").handle()

        joe_run2, = flow1.start([], [self.joe], restart_participants=True)
        frank_run2, = flow1.start([], [self.frank], restart_participants=True)
        joe_run3, = flow2.start([], [self.joe], restart_participants=True)

        # add a test contact run
        Contact.set_simulation(True)
        flow2.start([], [self.test_contact])
        Contact.set_simulation(False)

        # add a run for another org
        flow3 = self.create_flow(org=self.org2, user=self.admin2, uuid_start=10000)
        flow3.start([], [self.hans])

        # refresh runs which will have been modified by being interrupted
        joe_run1.refresh_from_db()
        joe_run2.refresh_from_db()
        frank_run1.refresh_from_db()

        # no filtering
        with self.assertNumQueries(NUM_BASE_REQUEST_QUERIES + 6):
            response = self.fetchJSON(url)

        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.json['next'], None)
        self.assertResultsById(response, [joe_run3, frank_run2, frank_run1, joe_run2, joe_run1])

        joe_run1_steps = list(joe_run1.steps.order_by('pk'))
        frank_run2_steps = list(frank_run2.steps.order_by('pk'))

        self.assertEqual(response.json['results'][1], {
            'id': frank_run2.pk,
            'flow': {'uuid': flow1.uuid, 'name': "Color Flow"},
            'contact': {'uuid': self.frank.uuid, 'name': self.frank.name},
            'responded': False,
            'steps': [
                {
                    'node': "00000000-00000000-00000000-00000001",
                    'arrived_on': format_datetime(frank_run2_steps[0].arrived_on),
                    'left_on': format_datetime(frank_run2_steps[0].left_on),
                    'text': "What is your favorite color?",
                    'value': None,
                    'category': None,
                    'type': 'actionset'
                },
                {
                    'node': "00000000-00000000-00000000-00000005",
                    'arrived_on': format_datetime(frank_run2_steps[1].arrived_on),
                    'left_on': None,
                    'text': None,
                    'value': None,
                    'category': None,
                    'type': 'ruleset'
                }
            ],
            'created_on': format_datetime(frank_run2.created_on),
            'modified_on': format_datetime(frank_run2.modified_on),
            'exited_on': None,
            'exit_type': None
        })
        self.assertEqual(response.json['results'][4], {
            'id': joe_run1.pk,
            'flow': {'uuid': flow1.uuid, 'name': "Color Flow"},
            'contact': {'uuid': self.joe.uuid, 'name': self.joe.name},
            'responded': True,
            'steps': [
                {
                    'node': "00000000-00000000-00000000-00000001",
                    'arrived_on': format_datetime(joe_run1_steps[0].arrived_on),
                    'left_on': format_datetime(joe_run1_steps[0].left_on),
                    'text': "What is your favorite color?",
                    'value': None,
                    'category': None,
                    'type': 'actionset'
                },
                {
                    'node': "00000000-00000000-00000000-00000005",
                    'arrived_on': format_datetime(joe_run1_steps[1].arrived_on),
                    'left_on': format_datetime(joe_run1_steps[1].left_on),
                    'text': 'it is blue',
                    'value': 'blue',
                    'category': "Blue",
                    'type': 'ruleset'
                },
                {
                    'node': "00000000-00000000-00000000-00000003",
                    'arrived_on': format_datetime(joe_run1_steps[2].arrived_on),
                    'left_on': format_datetime(joe_run1_steps[2].left_on),
                    'text': 'Blue is sad. :(',
                    'value': None,
                    'category': None,
                    'type': 'actionset'
                }
            ],
            'created_on': format_datetime(joe_run1.created_on),
            'modified_on': format_datetime(joe_run1.modified_on),
            'exited_on': format_datetime(joe_run1.exited_on),
            'exit_type': 'completed'
        })

        # filter by id
        response = self.fetchJSON(url, 'id=%d' % frank_run2.pk)
        self.assertResultsById(response, [frank_run2])

        # filter by flow
        response = self.fetchJSON(url, 'flow=%s' % flow1.uuid)
        self.assertResultsById(response, [frank_run2, frank_run1, joe_run2, joe_run1])

        # doesn't work if flow is inactive
        flow1.is_active = False
        flow1.save()

        response = self.fetchJSON(url, 'flow=%s' % flow1.uuid)
        self.assertResultsById(response, [])

        # restore to active
        flow1.is_active = True
        flow1.save()

        # filter by invalid flow
        response = self.fetchJSON(url, 'flow=invalid')
        self.assertResultsById(response, [])

        # filter by flow + responded
        response = self.fetchJSON(url, 'flow=%s&responded=TrUe' % flow1.uuid)
        self.assertResultsById(response, [frank_run1, joe_run1])

        # filter by contact
        response = self.fetchJSON(url, 'contact=%s' % self.joe.uuid)
        self.assertResultsById(response, [joe_run3, joe_run2, joe_run1])

        # filter by invalid contact
        response = self.fetchJSON(url, 'contact=invalid')
        self.assertResultsById(response, [])

        # filter by contact + responded
        response = self.fetchJSON(url, 'contact=%s&responded=yes' % self.joe.uuid)
        self.assertResultsById(response, [joe_run1])

        # filter by after
        response = self.fetchJSON(url, 'after=%s' % format_datetime(frank_run1.modified_on))
        self.assertResultsById(response, [joe_run3, frank_run2, frank_run1])

        # filter by before
        response = self.fetchJSON(url, 'before=%s' % format_datetime(frank_run1.modified_on))
        self.assertResultsById(response, [frank_run1, joe_run2, joe_run1])

        # filter by invalid before
        response = self.fetchJSON(url, 'before=longago')
        self.assertResultsById(response, [])

        # filter by invalid after
        response = self.fetchJSON(url, 'before=%s&after=thefuture' % format_datetime(frank_run1.modified_on))
        self.assertResultsById(response, [])

        # can't filter by both contact and flow together
        response = self.fetchJSON(url, 'contact=%s&flow=%s' % (self.joe.uuid, flow1.uuid))
        self.assertResponseError(response, None,
                                 "You may only specify one of the contact, flow parameters")
예제 #5
0
파일: tests.py 프로젝트: microlin/rapidpro
    def test_catch_all_trigger(self):
        self.login(self.admin)
        catch_all_trigger = Trigger.get_triggers_of_type(self.org, CATCH_ALL_TRIGGER).first()
        flow = self.create_flow()

        contact = self.create_contact("Ali", "250788739305")

        # make our first message echo back the original message
        action_set = ActionSet.objects.get(uuid=flow.entry_uuid)
        actions = action_set.as_json()['actions']
        actions[0]['msg'] = 'Echo: @step.value'
        action_set.set_actions_dict(actions)
        action_set.save()

        self.assertFalse(catch_all_trigger)

        Msg.create_incoming(self.channel, (TEL_SCHEME, contact.get_urn().path), "Hi")
        self.assertEquals(1, Msg.objects.all().count())
        self.assertEquals(0, flow.runs.all().count())

        trigger_url = reverse("triggers.trigger_catchall")

        response = self.client.get(trigger_url)
        self.assertEquals(response.status_code, 200)

        post_data = dict(flow=flow.pk)

        response = self.client.post(trigger_url, post_data)
        trigger = Trigger.objects.all().order_by('-pk')[0]

        self.assertEquals(trigger.trigger_type, CATCH_ALL_TRIGGER)
        self.assertEquals(trigger.flow.pk, flow.pk)

        catch_all_trigger = Trigger.get_triggers_of_type(self.org, CATCH_ALL_TRIGGER).first()

        self.assertEquals(catch_all_trigger.pk, trigger.pk)

        incoming = Msg.create_incoming(self.channel, (TEL_SCHEME, contact.get_urn().path), "Hi")
        self.assertEquals(1, flow.runs.all().count())
        self.assertEquals(flow.runs.all()[0].contact.pk, contact.pk)
        reply = Msg.objects.get(response_to=incoming)
        self.assertEquals('Echo: Hi', reply.text)

        other_flow = Flow.copy(flow, self.admin)
        post_data = dict(flow=other_flow.pk)

        response = self.client.post(reverse("triggers.trigger_update", args=[trigger.pk]), post_data)
        trigger = Trigger.objects.get(pk=trigger.pk)
        self.assertEquals(trigger.flow.pk, other_flow.pk)

        # create a bunch of catch all triggers
        for i in range(3):
            response = self.client.get(trigger_url)
            self.assertEquals(response.status_code, 200)

            post_data = dict(flow=flow.pk)
            response = self.client.post(trigger_url, post_data)
            self.assertEquals(i+2, Trigger.objects.all().count())
            self.assertEquals(1, Trigger.objects.filter(is_archived=False, trigger_type=CATCH_ALL_TRIGGER).count())

        # even unarchiving we only have one acive trigger at a time
        triggers = Trigger.objects.filter(trigger_type=CATCH_ALL_TRIGGER, is_archived=True)
        active_trigger = Trigger.objects.get(trigger_type=CATCH_ALL_TRIGGER, is_archived=False)

        post_data = dict()
        post_data['action'] = 'restore'
        post_data['objects'] = [_.pk for _ in triggers]

        response = self.client.post(reverse("triggers.trigger_archived"), post_data)
        self.assertEquals(1, Trigger.objects.filter(is_archived=False, trigger_type=CATCH_ALL_TRIGGER).count())
        self.assertFalse(active_trigger.pk == Trigger.objects.filter(is_archived=False, trigger_type=CATCH_ALL_TRIGGER)[0].pk)
예제 #6
0
    def test_missed_call_trigger(self):
        self.login(self.admin)
        missed_call_trigger = Trigger.get_triggers_of_type(self.org, MISSED_CALL_TRIGGER).first()
        flow = self.create_flow()
        contact = self.create_contact("Ali", "250788739305")

        self.assertFalse(missed_call_trigger)

        Call.create_call(self.channel, contact.get_urn(TEL_SCHEME).path, timezone.now(), 0, CALL_IN_MISSED)
        self.assertEquals(1, Call.objects.all().count())
        self.assertEquals(0, flow.runs.all().count())

        trigger_url = reverse("triggers.trigger_missed_call")

        response = self.client.get(trigger_url)
        self.assertEquals(response.status_code, 200)

        post_data = dict(flow=flow.pk)

        response = self.client.post(trigger_url, post_data)
        trigger =  Trigger.objects.all().order_by('-pk')[0]

        self.assertEquals(trigger.trigger_type, MISSED_CALL_TRIGGER)
        self.assertEquals(trigger.flow.pk, flow.pk)

        missed_call_trigger = Trigger.get_triggers_of_type(self.org, MISSED_CALL_TRIGGER).first()

        self.assertEquals(missed_call_trigger.pk, trigger.pk)

        Call.create_call(self.channel, contact.get_urn(TEL_SCHEME).path, timezone.now(), 0, CALL_IN_MISSED)
        self.assertEquals(2, Call.objects.all().count())
        self.assertEquals(1, flow.runs.all().count())
        self.assertEquals(flow.runs.all()[0].contact.pk, contact.pk)

        other_flow = Flow.copy(flow, self.admin)
        post_data = dict(flow=other_flow.pk)

        response = self.client.post(reverse("triggers.trigger_update", args=[trigger.pk]), post_data)
        trigger = Trigger.objects.get(pk=trigger.pk)
        self.assertEquals(trigger.flow.pk, other_flow.pk)

        # create ten missed call triggers
        for i in range(10):
            response = self.client.get(trigger_url)
            self.assertEquals(response.status_code, 200)

            post_data = dict(flow=flow.pk)

            response = self.client.post(trigger_url, post_data)
            self.assertEquals(i+2, Trigger.objects.all().count())
            self.assertEquals(1, Trigger.objects.filter(is_archived=False, trigger_type=MISSED_CALL_TRIGGER).count())

        # even unarchiving we only have one acive trigger at a time
        triggers = Trigger.objects.filter(trigger_type=MISSED_CALL_TRIGGER, is_archived=True)
        active_trigger = Trigger.objects.get(trigger_type=MISSED_CALL_TRIGGER, is_archived=False)

        post_data = dict()
        post_data['action'] = 'restore'
        post_data['objects'] = [_.pk for _ in triggers]

        response = self.client.post(reverse("triggers.trigger_archived"), post_data)
        self.assertEquals(1, Trigger.objects.filter(is_archived=False, trigger_type=MISSED_CALL_TRIGGER).count())
        self.assertFalse(active_trigger.pk == Trigger.objects.filter(is_archived=False, trigger_type=MISSED_CALL_TRIGGER)[0].pk)
예제 #7
0
    def test_catch_all_trigger(self):
        self.login(self.admin)
        catch_all_trigger = Trigger.get_triggers_of_type(self.org, Trigger.TYPE_CATCH_ALL).first()
        flow = self.create_flow()

        contact = self.create_contact("Ali", "250788739305")

        # make our first message echo back the original message
        action_set = ActionSet.objects.get(uuid=flow.entry_uuid)
        actions = action_set.as_json()['actions']
        actions[0]['msg']['base'] = 'Echo: @step.value'
        action_set.set_actions_dict(actions)
        action_set.save()

        self.assertFalse(catch_all_trigger)

        Msg.create_incoming(self.channel, (TEL_SCHEME, contact.get_urn().path), "Hi")
        self.assertEquals(1, Msg.all_messages.all().count())
        self.assertEquals(0, flow.runs.all().count())

        trigger_url = reverse("triggers.trigger_catchall")

        response = self.client.get(trigger_url)
        self.assertEquals(response.status_code, 200)

        post_data = dict(flow=flow.pk)

        response = self.client.post(trigger_url, post_data)
        trigger = Trigger.objects.all().order_by('-pk')[0]

        self.assertEquals(trigger.trigger_type, Trigger.TYPE_CATCH_ALL)
        self.assertEquals(trigger.flow.pk, flow.pk)

        catch_all_trigger = Trigger.get_triggers_of_type(self.org, Trigger.TYPE_CATCH_ALL).first()

        self.assertEquals(catch_all_trigger.pk, trigger.pk)

        incoming = Msg.create_incoming(self.channel, (TEL_SCHEME, contact.get_urn().path), "Hi")
        self.assertEquals(1, flow.runs.all().count())
        self.assertEquals(flow.runs.all()[0].contact.pk, contact.pk)
        reply = Msg.all_messages.get(response_to=incoming)
        self.assertEquals('Echo: Hi', reply.text)

        other_flow = Flow.copy(flow, self.admin)
        post_data = dict(flow=other_flow.pk)

        self.client.post(reverse("triggers.trigger_update", args=[trigger.pk]), post_data)
        trigger = Trigger.objects.get(pk=trigger.pk)
        self.assertEquals(trigger.flow.pk, other_flow.pk)

        # try to create another catch all trigger
        response = self.client.post(trigger_url, post_data)

        # shouldn't have succeeded as we already have a catch-all trigger
        self.assertTrue(len(response.context['form'].errors))

        # archive the previous one
        trigger.is_archived = True
        trigger.save()
        old_catch_all = trigger

        # try again
        self.client.post(trigger_url, post_data)

        # this time we are a go
        new_catch_all = Trigger.objects.get(is_archived=False, trigger_type=Trigger.TYPE_CATCH_ALL)

        # now add a new trigger based on a group
        group = self.create_group("Trigger Group", [])
        post_data['groups'] = [group.pk]
        response = self.client.post(trigger_url, post_data)

        # should now have two catch all triggers
        self.assertEquals(2, Trigger.objects.filter(is_archived=False, trigger_type=Trigger.TYPE_CATCH_ALL).count())

        group_catch_all = Trigger.objects.get(is_archived=False, trigger_type=Trigger.TYPE_CATCH_ALL, groups=group)

        # try to add another catchall trigger with a few different groups
        group2 = self.create_group("Trigger Group 2", [])
        post_data['groups'] = [group.pk, group2.pk]
        response = self.client.post(trigger_url, post_data)

        # should have failed
        self.assertTrue(len(response.context['form'].errors))

        post_data = dict()
        post_data['action'] = 'restore'
        post_data['objects'] = [old_catch_all.pk]

        response = self.client.post(reverse("triggers.trigger_archived"), post_data)
        old_catch_all.refresh_from_db()
        new_catch_all.refresh_from_db()

        # our new triggers should have been auto-archived, our old one is now active
        self.assertEquals(2, Trigger.objects.filter(is_archived=False, trigger_type=Trigger.TYPE_CATCH_ALL).count())
        self.assertTrue(new_catch_all.is_archived)
        self.assertFalse(old_catch_all.is_archived)

        # ok, archive our old one too, leaving only our group specific trigger
        old_catch_all.is_archived = True
        old_catch_all.save()

        # try a message again, this shouldn't cause anything since the contact isn't part of our group
        FlowRun.objects.all().delete()
        Msg.all_messages.all().delete()

        incoming = Msg.create_incoming(self.channel, (TEL_SCHEME, contact.get_urn().path), "Hi")
        self.assertEquals(0, FlowRun.objects.all().count())
        self.assertFalse(Msg.all_messages.filter(response_to=incoming))

        # now add the contact to the group
        group.contacts.add(contact)

        # this time should trigger the flow
        incoming = Msg.create_incoming(self.channel, (TEL_SCHEME, contact.get_urn().path), "Hi")
        self.assertEquals(1, FlowRun.objects.all().count())
        self.assertEquals(other_flow.runs.all()[0].contact.pk, contact.pk)
        reply = Msg.all_messages.get(response_to=incoming)
        self.assertEquals('Echo: Hi', reply.text)

        # delete the group
        group.release()

        # trigger should no longer be active
        group_catch_all.refresh_from_db()
        self.assertFalse(group_catch_all.is_active)
예제 #8
0
    def test_catch_all_trigger(self):
        self.login(self.admin)

        flow = self.get_flow("color")
        trigger_url = reverse("triggers.trigger_catchall")

        response = self.client.get(trigger_url)

        self.assertEqual(response.status_code, 200)

        self.client.post(trigger_url, {"flow": flow.id})

        trigger = Trigger.objects.order_by("id").last()

        self.assertEqual(trigger.trigger_type, Trigger.TYPE_CATCH_ALL)
        self.assertEqual(trigger.flow, flow)

        # update trigger to point to different flow
        other_flow = Flow.copy(flow, self.admin)

        self.client.post(reverse("triggers.trigger_update", args=[trigger.pk]),
                         {"flow": other_flow.id})

        trigger.refresh_from_db()

        self.assertEqual(trigger.flow, other_flow)

        # try to create another catch all trigger
        response = self.client.post(trigger_url, {"flow": other_flow.id})

        # shouldn't have succeeded as we already have a catch-all trigger
        self.assertTrue(len(response.context["form"].errors))

        # archive the previous one
        old_catch_all = trigger
        trigger.is_archived = True
        trigger.save(update_fields=("is_archived", ))

        # try again
        self.client.post(trigger_url, {"flow": other_flow.id})

        # this time we are a go
        new_catch_all = Trigger.objects.get(
            is_archived=False, trigger_type=Trigger.TYPE_CATCH_ALL)

        # now add a new trigger based on a group
        group = self.create_group("Trigger Group", [])

        self.client.post(trigger_url, {
            "flow": other_flow.id,
            "groups": group.id
        })

        # should now have two catch all triggers
        self.assertEqual(
            2,
            Trigger.objects.filter(
                is_archived=False,
                trigger_type=Trigger.TYPE_CATCH_ALL).count())

        group_catch_all = Trigger.objects.get(
            is_archived=False,
            trigger_type=Trigger.TYPE_CATCH_ALL,
            groups=group)

        # try to add another catchall trigger with a few different groups
        group2 = self.create_group("Trigger Group 2", [])

        response = self.client.post(trigger_url, {
            "flow": other_flow.id,
            "groups": [group.id, group2.id]
        })

        # should have failed
        self.assertTrue(len(response.context["form"].errors))

        self.client.post(reverse("triggers.trigger_archived"), {
            "action": "restore",
            "objects": [old_catch_all.id]
        })

        old_catch_all.refresh_from_db()
        new_catch_all.refresh_from_db()

        # our new triggers should have been auto-archived, our old one is now active
        self.assertEqual(
            Trigger.objects.filter(
                is_archived=False,
                trigger_type=Trigger.TYPE_CATCH_ALL).count(), 2)
        self.assertTrue(new_catch_all.is_archived)
        self.assertFalse(old_catch_all.is_archived)

        # ok, archive our old one too, leaving only our group specific trigger
        old_catch_all.is_archived = True
        old_catch_all.save(update_fields=("is_archived", ))

        # delete a group attached to a trigger
        group.release()

        # trigger should no longer be active
        group_catch_all.refresh_from_db()

        self.assertFalse(group_catch_all.is_active)