Exemplo n.º 1
0
class ValidAnswerResponderTest(TestCase):

    def setUp(self):
        self.user = User()
        self.q = Questionnaire(trigger = "trigger", max_retries=3)
        self.q.save()
        self.session = UserSession()
        self.question =Question(text="what")
        self.question.save()
        self.choice1 = Choice(code= 'a',question=self.question, text="a")
        self.choice2 = Choice(code= 'b',question=self.question, text="a")
        self.choice3 = Choice(code= 'c',question=self.question, text="a")
        self.choice1.save()
        self.choice2.save()
        self.choice3.save()
        
        self.next_question  = Question(text="next")

        self.session.question = self.question
        self.kwargs =  {"user": self.user,
                    "next_question" :self.next_question ,
                    "session" : self.session
                        
                    }
        self.trigger_responder  = ValidAnswerResponder(self.kwargs)


    def test_criteria_for_trigger(self):
        self.assertEquals(self.trigger_responder.criteria("c"), True)
        self.assertEquals(self.trigger_responder.criteria("w"), False)
        
    def test_valid_answer_response(self):
        pass
Exemplo n.º 2
0
    def setUp(self):
        self.questionnaire = Questionnaire(trigger = "trigger", max_retries=3)
        self.questionnaire.save()
                
        Question.objects.all().delete()
        self.backend = PersistantBackend(slug="MockBackend")
        self.backend.save()
        self.reporter = Reporter(alias="ReporterName")
        self.reporter.save()
        self.pconnection = PersistantConnection(backend=self.backend,
                                                reporter=self.reporter,
                                                identity="1000", governorate = 2, district = 4)
        self.pconnection.save()

        self.pconnection1 = PersistantConnection(backend=self.backend,
                                                 reporter=self.reporter,
                                                 identity="10001", governorate = 7, district = 8)
        self.pconnection1.save()

        self.reporter.connections.add(self.pconnection)

        self.question1 = Question(text = "question1", questionnaire=self.questionnaire)
        self.question1.is_first = True
        self.question1.save()
        self.question2 = Question(text = "question2", questionnaire=self.questionnaire)
        self.question2.save()
        self.question3 = Question(text = "question3", questionnaire=self.questionnaire)
        self.question3.save()

        self.question1.next_question = self.question2
        self.question2.next_question = self.question3

        self.question1.save()
        self.question2.save()
        self.question3.save()

        self.setup_choices(self.question1)
        self.setup_choices(self.question2)
        self.setup_choices(self.question3)

        DemographicParser(questionnaire=self.questionnaire, name='age', regex='[0-9]+',
                          order=1, type='i').save()
        DemographicParser(questionnaire=self.questionnaire, name='gender',
                          regex='m|f|male|female', order=2, type='c').save()

        r = Registration(phone = self.pconnection)
        r.save()

        r1 = Registration(phone = self.pconnection)
        r1.save()
Exemplo n.º 3
0
 def setUp(self):
     # clean up
     Question.objects.all().delete()
     UserResponse.objects.all().delete()
     
     # user
     self.backend = PersistantBackend(slug="MockBackend1")
     self.backend.save()
     self.pconnection = PersistantConnection(backend=self.backend, 
                                             reporter=None, 
                                             identity="user_1_identity")
     self.pconnection.save()
     self.governorate1 = Governorate.objects.get(pk=1)
     self.district1 = District.objects.get(pk=29)
     
     self.user = User(connection=self.pconnection, age=12, gender='m', 
                      governorate=self.governorate1.code, district=self.district1.code)
     self.user.save()
     
     # create categorical poll
     self.question1 = Question(text = 'question1', max_choices = 1)
     self.question1.save()
     yellow = Color(file_name="yellow.png", code="#yellow")
     yellow.save()
     fruits = Category(name="fruits", color=yellow)
     fruits.save()
     red = Color(file_name="red.png", code="#red")
     red.save()
     meat = Category(name="meat", color=red)
     meat.save()
     self.green = Color(file_name="green.png", code="#green")
     self.green.save()
     vegetables = Category(name="vegetables", color=self.green)
     vegetables.save()
     self.apple =Choice(code= 'a',question = self.question1, 
                        text="apple", category=fruits)
     self.apple.save()
     self.bear = Choice(code= 'b',question = self.question1, 
                        text="bear", category=meat)
     self.bear.save()
     self.cabbage = Choice(code= 'c',question = self.question1, 
                           text="cabbage", category=vegetables)
     self.cabbage.save()
     self.dillpickle = Choice(code= 'd',question = self.question1, 
                              text="dillpickle", category=vegetables)
     self.dillpickle.save()
Exemplo n.º 4
0
    def setUp(self):
        self.user = User()
        self.q = Questionnaire(trigger = "trigger", max_retries=3)
        self.q.save()
        self.session = UserSession()
        self.question =Question(text="what")
        self.question.save()
        self.choice1 = Choice(code= 'a',question=self.question, text="a")
        self.choice2 = Choice(code= 'b',question=self.question, text="a")
        self.choice3 = Choice(code= 'c',question=self.question, text="a")
        self.choice1.save()
        self.choice2.save()
        self.choice3.save()
        
        self.next_question  = Question(text="next")

        self.session.question = self.question
        self.kwargs =  {"user": self.user,
                    "next_question" :self.next_question ,
                    "session" : self.session
                        
                    }
        self.trigger_responder  = ValidAnswerResponder(self.kwargs)
Exemplo n.º 5
0
class UserSessionTest(TestCase):
    def setUp(self):
        self.questionnaire = Questionnaire(trigger = "trigger", max_retries=3)
        self.questionnaire.save()
                
        Question.objects.all().delete()
        self.backend = PersistantBackend(slug="MockBackend")
        self.backend.save()
        self.reporter = Reporter(alias="ReporterName")
        self.reporter.save()
        self.pconnection = PersistantConnection(backend=self.backend,
                                                reporter=self.reporter,
                                                identity="1000", governorate = 2, district = 4)
        self.pconnection.save()

        self.pconnection1 = PersistantConnection(backend=self.backend,
                                                 reporter=self.reporter,
                                                 identity="10001", governorate = 7, district = 8)
        self.pconnection1.save()

        self.reporter.connections.add(self.pconnection)

        self.question1 = Question(text = "question1", questionnaire=self.questionnaire)
        self.question1.is_first = True
        self.question1.save()
        self.question2 = Question(text = "question2", questionnaire=self.questionnaire)
        self.question2.save()
        self.question3 = Question(text = "question3", questionnaire=self.questionnaire)
        self.question3.save()

        self.question1.next_question = self.question2
        self.question2.next_question = self.question3

        self.question1.save()
        self.question2.save()
        self.question3.save()

        self.setup_choices(self.question1)
        self.setup_choices(self.question2)
        self.setup_choices(self.question3)

        DemographicParser(questionnaire=self.questionnaire, name='age', regex='[0-9]+',
                          order=1, type='i').save()
        DemographicParser(questionnaire=self.questionnaire, name='gender',
                          regex='m|f|male|female', order=2, type='c').save()

        r = Registration(phone = self.pconnection)
        r.save()

        r1 = Registration(phone = self.pconnection)
        r1.save()

    def setup_choices(self,question):
        choice1 = Choice(code= 'a',question=question, text="a")
        choice2 = Choice(code= 'b',question=question, text="a")
        choice3 = Choice(code= 'c',question=question, text="a")
        choice1.save()
        choice2.save()
        choice3.save()

    def test_open_new_session(self):
        session = UserSession.open(self.pconnection)
        user = session.user
        user.save()
        self.assertEquals(session.question, None)

    def test_respond_with_first_question_on_new_session_for_any_message(self):
        session = UserSession.open(self.pconnection)
        user = session.user
        user.save()
        self.assertEquals(session.respond(TestMessage(text="trigger m 16")), str(self.question1))

    def test_demographic_information_is_mandatory_to_start_the_poll(self):
        session = UserSession.open(self.pconnection)
        user = session.user
        user.save()
        self.assertEquals(session.respond(TestMessage(text="trigger")), TRIGGER_INCORRECT_MESSAGE)

    def test_correct_response_to_question_sends_next_question(self):
        session = UserSession.open(self.pconnection)
        user = session.user
        user.save()
        self.assertEquals(session.question, None)
        response1 = session.respond(TestMessage(text="trigger m 16"))
        self.assertEquals(session.question, self.question1)
        response2 = session.respond(TestMessage(text="a"))
        self.assertEquals(response2, str(self.question2))
        self.assertEquals(session.question, self.question2)

    def test_wrong_response_to_question_sends_error(self):
        session = UserSession.open(self.pconnection)
        self.assertEquals(session.question, None)
        response1 = session.respond(TestMessage(text="trigger f 16"))
        self.assertEquals(session.question, self.question1)
        response2 = session.respond(TestMessage(text="django"))
        self.assertEquals(response2, "error_parsing_response")
        self.assertEquals(session.question, self.question1)

    def test_retrieve_ongoing_session_at_question2(self):
        session = UserSession.open(self.pconnection)
        user = session.user
        user.save()
        session.user = user
        session.question = self.question2
        session.save()

        session = UserSession.open(self.pconnection)

        self.assertEquals(session.respond(TestMessage(text="b")), str(self.question3))
        self.assertEquals(session.question, self.question3)

    def test_close_ongoing_session_at_trigger(self):
        session = UserSession.open(self.pconnection)
        user = session.user
        user.save()
        session.user = user
        session.question = self.question2
        self.assertEquals(session.respond(TestMessage(text="c")), str(self.question3))
        self.assertEquals(session.question, self.question3)

        self.assertEquals(session.respond(TestMessage(text="trigger 13 m")), str(self.question1))
        self.assertEquals(session.question, self.question1)

    def test_close_session_on_last_answer(self):
        session = UserSession.open(self.pconnection)
        user = session.user
        user.save()
        session.user = user
        session.question = self.question3
        self.assertEquals(session.respond(TestMessage(text="c")), "thanks")
        self.assertEquals(session.user.active, False)

    def test_user_interaction_is_saved_when_successful(self):
        initial_number_of_responses = len(UserResponse.objects.all())
        initial_number_of_users = len(User.objects.all())

        session = UserSession.open(self.pconnection1)
        session.respond(TestMessage(text='trigger 14 f'))
        self.assertEquals(len(User.objects.all()), initial_number_of_users + 1)
        session.respond(TestMessage(text='a'))
        self.assertEquals(len(UserResponse.objects.all()), initial_number_of_responses + 1)

    def test_end_session_on_reaching_max_num_allowed_retries(self):
        session = UserSession.open(self.pconnection1)
        user = session.user
        user.save()
        session.user = user
        session.question = self.question1
        session.respond(TestMessage(text='t'))
        session.respond(TestMessage(text='t'))
        session.respond(TestMessage(text='t'))
        self.assertEquals(session.user.active, False)

    def test_user_demographics_saved_when_present(self):
        session = UserSession.open(self.pconnection1)
        session.respond(TestMessage(text='trigger 13 f'))
        latest_user = User.objects.all().order_by('-id')[0]
        
        self.assertEquals(latest_user.age, 13)
        self.assertEquals(latest_user.gender, 'f')

    def test_user_location_from_registration(self):
        session = UserSession.open(self.pconnection)
        session.respond(TestMessage(text='trigger 14 f'))
        latest_user = User.objects.all().order_by('-id')[0]
        self.assertEquals(latest_user.governorate, 2)
        self.assertEquals(latest_user.district, 4)

    def test_junk_trigger_message(self):
        backend = PersistantBackend(slug="MockBackend1")
        backend.save()
        reporter = Reporter(alias="ReporterName1")
        reporter.save()
        pconnection = PersistantConnection(backend=backend,
                                           reporter=reporter,
                                           identity="1001")
        pconnection.save()
        session = UserSession.open(pconnection)

        self.assertEquals(session.respond(TestMessage(text='trigger junk')), TRIGGER_INCORRECT_MESSAGE )

    def test_junk_message(self):
        session = UserSession.open(self.pconnection)
        self.assertEquals(session.respond(TestMessage(text='junk')), TRIGGER_INCORRECT_MESSAGE )

    def test_recreate_user_if_demographic_data_changes(self):
        session = UserSession.open(self.pconnection)
        session.respond(TestMessage(text="trigger m 16"))
        session.respond(TestMessage(text="trigger m 12"))
        self.assertEquals(len(User.objects.all()), 2)

    def test_reset_session_on_sending_trigger(self):
        session = UserSession.open(self.pconnection)
        session.respond(TestMessage(text="trigger m 16"))

        self.assertEquals(session.question, self.question1)
        session.respond(TestMessage(text="trigger f 12"))

        self.assertEquals(session.question, self.question1)
        session.respond(TestMessage(text="a"))

        self.assertEquals(session.question, self.question2)

    def test_less_than_required_choices_reminds_user(self):
        self.question1.num_answers_expected = 2
        self.question1.save()
        session = UserSession.open(self.pconnection)
        session.respond(TestMessage(text="trigger m 16"))
        self.assertEquals(session.question.num_answers_expected, 2)
        error = session.respond(TestMessage(text="a"))
        self.assertEquals(error, "err_less_than_expected_choices")
        error = session.respond(TestMessage(text="a a"))
        self.assertEquals(error, "err_less_than_expected_choices")

    def test_more_than_required_choices_reminds_user(self):
        session = UserSession.open(self.pconnection)
        session.respond(TestMessage(text="trigger m 16"))
        self.assertEquals(session.question.num_answers_expected, 1)
        error = session.respond(TestMessage(text="a b"))
        self.assertEquals(error, "err_more_than_expected_choices")