From f30b55ceb8a44a200f26c48fc3ce1385bc19dfb5 Mon Sep 17 00:00:00 2001 From: Erik Harding Date: Tue, 16 Jan 2024 12:50:15 +0200 Subject: [PATCH] Remove endline survey keywords and tests --- yal/main.py | 64 ---------- yal/tests/surveys/test_endline.py | 144 +--------------------- yal/tests/test_main.py | 195 ------------------------------ 3 files changed, 1 insertion(+), 402 deletions(-) diff --git a/yal/main.py b/yal/main.py index a90cc249..b8a31079 100644 --- a/yal/main.py +++ b/yal/main.py @@ -88,12 +88,6 @@ QA_RESET_FEEDBACK_TIMESTAMP_KEYWORDS = {"resetfeedbacktimestampobzvmp"} EMERGENCY_KEYWORDS = utils.get_keywords("emergency") AAQ_KEYWORDS = {"ask a question"} -EJAF_ENDLINE_SURVEY_KEYWORDS = { - "answer", - "yes i want to answer", - "remind me tomorrow", - "i m not interested", -} EJAF_LOCATION_SURVEY_KEYWORDS = { "start survey", "i m not interested", @@ -143,14 +137,6 @@ async def process_message(self, message): keyword = utils.clean_inbound(message.content) - baseline_survey_completed = self.user.metadata.get( - "baseline_survey_completed" - ) - endline_survey_completed = self.user.metadata.get( - "endline_survey_completed" - ) - - endline_survey_started = self.user.metadata.get("endline_survey_started") feedback_state = await self.get_feedback_state() payload = utils.get_by_path( message.transport_metadata, "message", "button", "payload" @@ -225,47 +211,6 @@ async def process_message(self, message): self.user.session_id = None self.state_name = AssessmentApplication.REMINDER_STATE - elif ( - keyword in EJAF_ENDLINE_SURVEY_KEYWORDS - and baseline_survey_completed - and not endline_survey_completed - ): - self.save_metadata("assessment_reminder_sent", False) - self.save_metadata("assessment_reminder_name", "") - self.user.session_id = None - - if keyword == "remind me tomorrow": - self.state_name = AssessmentApplication.REMINDER_STATE - elif keyword == "i m not interested": - self.state_name = AssessmentApplication.NOT_INTERESTED_STATE - else: - endline_study_max_participant_count = ( - await rapidpro.get_global_value( - "endline_study_max_participant_count" - ) - ) - - error, group_count = await rapidpro.get_group_membership_count( - group_name="Endline Survey Completed" - ) - if error: - self.state_name = self.ERROR_STATE - elif group_count >= int(endline_study_max_participant_count): - self.state_name = ( - EndlineTermsApplication.ENDLINE_LIMIT_REACHED_STATE - ) - else: - self.state_name = EndlineTermsApplication.START_STATE - - data = { - "endline_survey_started": "True", - } - error = await rapidpro.update_profile( - whatsapp_id, data, self.user.metadata - ) - if error: - self.state_name = self.ERROR_STATE - # Fields that RapidPro sets after a feedback push message elif feedback_state: if not self.user.session_id: @@ -287,12 +232,6 @@ async def process_message(self, message): self.save_metadata("push_related_page_id", payload.split("_")[-1]) self.state_name = "state_prep_push_msg_related_page" - elif ( - endline_survey_started == "Pending" - and keyword not in EJAF_ENDLINE_SURVEY_KEYWORDS - ): - self.user.session_id = None - self.state_name = EndlineSurveyApplication.SURVEY_VALIDATION_STATE elif ( keyword in EJAF_LOCATION_SURVEY_KEYWORDS and self.user.metadata.get("ejaf_location_survey_status") == "pending" @@ -363,7 +302,6 @@ async def get_feedback_state(self): async def state_start(self): terms_accepted = self.user.metadata.get("terms_accepted") onboarding_completed = self.user.metadata.get("onboarding_completed") - endline_terms_accepted = self.user.metadata.get("endline_terms_accepted") inbound = utils.clean_inbound(self.inbound.content) @@ -389,8 +327,6 @@ async def state_start(self): return await self.go_to_state(MainMenuApplication.START_STATE) elif terms_accepted: return await self.go_to_state(OnboardingApplication.START_STATE) - elif endline_terms_accepted: - return await self.go_to_state(EndlineSurveyApplication.START_STATE) else: return await self.go_to_state(TermsApplication.START_STATE) diff --git a/yal/tests/surveys/test_endline.py b/yal/tests/surveys/test_endline.py index d44965ab..69982758 100644 --- a/yal/tests/surveys/test_endline.py +++ b/yal/tests/surveys/test_endline.py @@ -8,7 +8,7 @@ from vaccine.testing import AppTester, TState, run_sanic from yal import config from yal.main import Application -from yal.utils import GENERIC_ERROR_OPTIONS, GENERIC_ERRORS, replace_persona_fields +from yal.utils import GENERIC_ERRORS, replace_persona_fields @pytest.fixture @@ -108,129 +108,6 @@ def get_group(request): config.RAPIDPRO_URL = url -@pytest.mark.asyncio -@mock.patch("yal.rapidpro.get_group_membership_count") -async def test_endline_invitation_i_want_to_answer( - get_group_membership_count, tester: AppTester, rapidpro_mock -): - - get_group_membership_count.return_value = False, 100 - - tester.user.metadata["baseline_survey_completed"] = True - tester.user.metadata["endline_survey_started"] = "Pending" - tester.user.metadata["terms_accepted"] = True - tester.user.metadata["onboarding_completed"] = True - - await tester.user_input("Yes, I want to answer") - - tester.assert_state("state_start_terms") - - -@pytest.mark.asyncio -async def test_endline_invitation_remind_me_tomorrow( - tester: AppTester, - rapidpro_mock, -): - user = User( - addr="278201234567", - state=StateData(), - session_id=1, - metadata={ - "baseline_survey_completed": True, - "endline_survey_started": "Pending", - }, - ) - app = Application(user) - msg = Message( - content="Remind me tomorrow", - to_addr="27820001002", - from_addr="27820001003", - transport_name="whatsapp", - transport_type=Message.TRANSPORT_TYPE.HTTP_API, - ) - - [reply] = await app.process_message(msg) - - assert user.state.name == "state_remind_tomorrow" - - -@pytest.mark.asyncio -async def test_endline_invitation_not_interested( - tester: AppTester, - rapidpro_mock, -): - user = User( - addr="278201234567", - state=StateData(), - session_id=1, - metadata={ - "baseline_survey_completed": True, - "endline_survey_started": "Pending", - }, - ) - app = Application(user) - msg = Message( - content="I'm not interested", - to_addr="27820001002", - from_addr="27820001003", - transport_name="whatsapp", - transport_type=Message.TRANSPORT_TYPE.HTTP_API, - ) - - [reply] = await app.process_message(msg) - - assert user.state.name == "state_not_interested" - - -@pytest.mark.asyncio -@mock.patch("yal.rapidpro.get_group_membership_count") -async def test_endline_invitation_answer( - get_group_membership_count, tester: AppTester, rapidpro_mock -): - - get_group_membership_count.return_value = False, 100 - - tester.user.metadata["baseline_survey_completed"] = True - tester.user.metadata["endline_survey_started"] = "Pending" - tester.user.metadata["terms_accepted"] = True - tester.user.metadata["onboarding_completed"] = True - - await tester.user_input("Yes, I want to answer") - - tester.assert_state("state_start_terms") - - -@pytest.mark.asyncio -async def test_endline_survey_validation(tester: AppTester, rapidpro_mock): - - user = User( - addr="278201234567", - state=StateData(), - session_id=1, - metadata={ - "baseline_survey_completed": True, - "endline_survey_started": "Pending", - }, - ) - app = Application(user) - msg = Message( - content="this is wrong input", - to_addr="27820001002", - from_addr="27820001003", - transport_name="whatsapp", - transport_type=Message.TRANSPORT_TYPE.HTTP_API, - ) - - [reply] = await app.process_message(msg) - - assert user.state.name == "state_survey_validation" - error_content = reply.content - if "Umm.." in error_content: - error_content = error_content.replace("🤖", "[persona_emoji]") - - assert error_content in GENERIC_ERROR_OPTIONS - - @pytest.mark.asyncio async def test_state_platform_review_endline(tester: AppTester, rapidpro_mock): await tester.user_input( @@ -1290,25 +1167,6 @@ async def test_endline_flow(tester: AppTester, rapidpro_mock): tester.assert_message(message) -@pytest.mark.asyncio -@mock.patch("yal.rapidpro.get_group_membership_count") -async def test_endline_agree_terms_and_condition( - get_group_membership_count, tester: AppTester, rapidpro_mock -): - get_group_membership_count.return_value = False, 100 - tester.user.metadata["baseline_survey_completed"] = True - tester.user.metadata["endline_survey_started"] = "Pending" - tester.user.metadata["terms_accepted"] = True - tester.user.metadata["onboarding_completed"] = True - - await tester.user_input("Yes, I want to answer") - tester.assert_state("state_start_terms") - tester.assert_metadata("endline_survey_started", "True") - - await tester.user_input("Yes, I agree") - tester.assert_state("state_accept_consent") - - @pytest.mark.asyncio async def test_state_accept_consent_reminder_lets_do_this( tester: AppTester, rapidpro_mock diff --git a/yal/tests/test_main.py b/yal/tests/test_main.py index 8a3c701b..312bac46 100644 --- a/yal/tests/test_main.py +++ b/yal/tests/test_main.py @@ -514,30 +514,6 @@ async def test_assessment_reminder_keywords( tester.assert_state("state_relationship_status_endline") -@pytest.mark.asyncio -async def test_endline_catch_all( - tester: AppTester, rapidpro_mock, contentrepo_api_mock -): - rapidpro_mock.tstate.contact_fields["onboarding_completed"] = True - rapidpro_mock.tstate.contact_fields["terms_accepted"] = True - rapidpro_mock.tstate.contact_fields["assessment_reminder_sent"] = True - rapidpro_mock.tstate.contact_fields["endline_survey_started"] = "Pending" - - await tester.user_input("this is giberish") - tester.assert_state("state_survey_validation") - - -@pytest.mark.asyncio -async def test_survey_stop(tester: AppTester, rapidpro_mock, contentrepo_api_mock): - rapidpro_mock.tstate.contact_fields["onboarding_completed"] = True - rapidpro_mock.tstate.contact_fields["terms_accepted"] = True - rapidpro_mock.tstate.contact_fields["assessment_reminder_sent"] = True - rapidpro_mock.tstate.contact_fields["endline_survey_started"] = "Pending" - - await tester.user_input("stop") - tester.assert_state("state_optout") - - @pytest.mark.asyncio async def test_terms_accepted(tester: AppTester, rapidpro_mock, contentrepo_api_mock): @@ -547,16 +523,6 @@ async def test_terms_accepted(tester: AppTester, rapidpro_mock, contentrepo_api_ tester.assert_state("state_persona_name") -@pytest.mark.asyncio -async def test_endline_terms_accepted( - tester: AppTester, rapidpro_mock, contentrepo_api_mock -): - rapidpro_mock.tstate.contact_fields["endline_terms_accepted"] = True - - await tester.user_input("hi") - tester.assert_state("state_survey_question") - - @pytest.mark.asyncio async def test_state_locus_of_control_assessment_later( tester: AppTester, rapidpro_mock, contentrepo_api_mock @@ -897,55 +863,6 @@ async def test_state_self_perceived_healthcare_assessment_later( tester.assert_message(message) -@pytest.mark.asyncio -@mock.patch("yal.rapidpro.get_group_membership_count") -async def test_endline_survey_start_keywords( - get_group_membership_count, tester: AppTester, rapidpro_mock, contentrepo_api_mock -): - get_group_membership_count.return_value = False, 100 - - rapidpro_mock.tstate.contact_fields["onboarding_completed"] = True - rapidpro_mock.tstate.contact_fields["terms_accepted"] = True - rapidpro_mock.tstate.contact_fields["baseline_survey_completed"] = True - rapidpro_mock.tstate.contact_fields["endline_survey_completed"] = False - - await tester.user_input("answer") - tester.assert_state("state_start_terms") - - -@pytest.mark.asyncio -async def test_endline_remind_me_tomorrow_keywords( - tester: AppTester, rapidpro_mock, contentrepo_api_mock -): - rapidpro_mock.tstate.contact_fields["onboarding_completed"] = True - rapidpro_mock.tstate.contact_fields["terms_accepted"] = True - rapidpro_mock.tstate.contact_fields["baseline_survey_completed"] = True - rapidpro_mock.tstate.contact_fields["endline_survey_completed"] = False - - await tester.user_input("remind me tomorrow") - tester.assert_state("state_remind_tomorrow") - - -@pytest.mark.asyncio -async def test_endline_survey_not_interested_keywords( - tester: AppTester, rapidpro_mock, contentrepo_api_mock -): - rapidpro_mock.tstate.contact_fields["onboarding_completed"] = True - rapidpro_mock.tstate.contact_fields["terms_accepted"] = True - rapidpro_mock.tstate.contact_fields["baseline_survey_completed"] = True - rapidpro_mock.tstate.contact_fields["endline_survey_completed"] = False - - await tester.user_input("I'm not interested") - tester.assert_state("state_not_interested") - - tester.assert_metadata("endline_survey_started", "not_interested") - - request = rapidpro_mock.tstate.requests[1] - assert json.loads(request.body.decode("utf-8")) == { - "fields": {"endline_survey_started": "not_interested"} - } - - @pytest.mark.asyncio async def test_tracked_keywords_saved( tester: AppTester, rapidpro_mock, contentrepo_api_mock @@ -1569,115 +1486,3 @@ async def test_whatsapp_user_reactivate(tester: AppTester, rapidpro_mock): assert json.loads(request.body.decode("utf-8")) == { "fields": {"whatsapp_delivery_failed": "False"} } - - -@pytest.mark.asyncio -@mock.patch("yal.assessments.get_current_datetime") -async def test_survey_invite_remind_me_tomorrow( - get_current_datetime, tester: AppTester, rapidpro_mock -): - get_current_datetime.return_value = datetime(2022, 6, 19, 17, 30) - - tester.user.metadata["terms_accepted"] = True - tester.user.metadata["onboarding_completed"] = True - tester.user.metadata["baseline_survey_completed"] = True - tester.user.metadata["endline_survey_started"] = "Pending" - - await tester.user_input("remind me tomorrow") - - tester.assert_metadata("assessment_reminder", "2022-06-19T17:30:00") - tester.assert_metadata("assessment_reminder_type", "endline later 23hours") - tester.assert_metadata("assessment_reminder_hours", "23hours") - - request = rapidpro_mock.tstate.requests[1] - assert json.loads(request.body.decode("utf-8")) == { - "fields": { - "assessment_reminder": "2022-06-19T17:30:00", - "assessment_reminder_sent": "", - "assessment_reminder_type": "endline later 23hours", - } - } - - -@pytest.mark.asyncio -@mock.patch("yal.rapidpro.get_group_membership_count") -async def test_state_endline_limit_reached( - get_group_membership_count, tester: AppTester, rapidpro_mock -): - get_group_membership_count.return_value = False, 250 - - tester.user.metadata["baseline_survey_completed"] = True - tester.user.metadata["endline_survey_started"] = "Pending" - tester.user.metadata["terms_accepted"] = True - tester.user.metadata["onboarding_completed"] = True - - await tester.user_input("Yes, I want to answer") - tester.assert_state("state_endline_limit_reached") - - tester.assert_message( - "\n".join( - [ - "Eish! It looks like you just missed the cut off for our survey. " - "No worries, we get it, life happens!", - "", - "Stay tuned for more survey opportunities. We appreciate your " - "enthusiasm and hope you can catch the next one.", - "", - "Go ahead and browse the menu or ask us a question.", - ] - ) - ) - - -@pytest.mark.asyncio -async def test_state_endline_limit_reached_menu(tester: AppTester, rapidpro_mock): - tester.setup_state("state_endline_limit_reached") - - await tester.user_input("1") - - tester.assert_state("state_mainmenu") - - -@pytest.mark.asyncio -@mock.patch("yal.askaquestion.config") -async def test_state_endline_limit_reached_aaq( - mock_config, tester: AppTester, rapidpro_mock -): - mock_config.AAQ_URL = "http://aaq-test.com" - tester.setup_state("state_endline_limit_reached") - - await tester.user_input("Ask a question") - - tester.assert_state("state_aaq_start") - - -@pytest.mark.asyncio -@mock.patch("yal.rapidpro.get_group_membership_count") -async def test_state_endline_limit_reached_pending_menu( - get_group_membership_count, tester: AppTester, rapidpro_mock -): - get_group_membership_count.return_value = False, 250 - - tester.user.metadata["baseline_survey_completed"] = True - tester.user.metadata["endline_survey_started"] = "Pending" - tester.user.metadata["terms_accepted"] = True - tester.user.metadata["onboarding_completed"] = True - - await tester.user_input("Yes, I want to answer") - tester.assert_state("state_endline_limit_reached") - - tester.assert_metadata("endline_survey_started", "limit_reached") - tester.assert_metadata("assessment_reminder", "") - tester.assert_metadata("assessment_reminder_sent", "") - tester.assert_metadata("assessment_reminder_type", "") - - request = rapidpro_mock.tstate.requests[4] - - assert json.loads(request.body.decode("utf-8")) == { - "fields": { - "endline_survey_started": "limit_reached", - "assessment_reminder": "", - "assessment_reminder_sent": "", - "assessment_reminder_type": "", - } - }