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
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")
class StyleTest(TestCase): 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() def test_styles_for_basic_poll(self): # populate it with responses UserResponse(user = self.user, question = self.question1, choice = self.apple).save() UserResponse(user = self.user, question = self.question1, choice = self.bear).save() UserResponse(user = self.user, question = self.question1, choice = self.bear).save() UserResponse(user = self.user, question = self.question1, choice = self.cabbage).save() UserResponse(user = self.user, question = self.question1, choice = self.cabbage).save() UserResponse(user = self.user, question = self.question1, choice = self.cabbage).save() self.assertEquals(self.governorate1.style(self.question1), {'color': self.green, 'percentage': 0.5}) self.assertEquals(self.district1.style(self.question1), {'color': self.green, 'percentage': 0.5} ) def test_styles_for_categorical_poll(self): # populate it with responses UserResponse(user = self.user, question = self.question1, choice = self.apple).save() UserResponse(user = self.user, question = self.question1, choice = self.bear).save() UserResponse(user = self.user, question = self.question1, choice = self.cabbage).save() UserResponse(user = self.user, question = self.question1, choice = self.dillpickle).save() self.assertEquals(self.governorate1.style(self.question1), {'color': self.green, 'percentage': 0.5}) self.assertEquals(self.district1.style(self.question1), {'color': self.green, 'percentage': 0.5} )