def test_user_validated(self): profile = UserProfile(validated=False) dialog_state = DialogState(phone_number="123456789", seq="0", user_profile=profile) event = UserValidated( phone_number="123456789", user_profile=profile, code_validation_payload=CodeValidationPayload( valid=True, is_demo=False, account_info={ "employer_id": 1, "unit_id": 1, "employer_name": "employer_name", "unit_name": "unit_name", }, ), ) event.apply_to(dialog_state) self.assertTrue(dialog_state.user_profile.validated) self.assertEqual( { "employer_id": 1, "unit_id": 1, "employer_name": "employer_name", "unit_name": "unit_name", }, dialog_state.user_profile.account_info, )
def test_user_revalidated(self): profile = UserProfile(validated=True, is_demo=True) dialog_state = DialogState( "123456789", "0", user_profile=profile, current_drill=DRILL, drill_instance_id=uuid.uuid4(), current_prompt_state=PromptState(slug=DRILL.prompts[0].slug, start_time=NOW), ) event = UserValidated( phone_number="123456789", user_profile=profile, code_validation_payload=CodeValidationPayload( valid=True, is_demo=False, account_info={"foo": "bar"}), ) event.apply_to(dialog_state) self.assertTrue(dialog_state.user_profile.validated) self.assertFalse(dialog_state.user_profile.is_demo) self.assertIsNone(dialog_state.current_drill) self.assertIsNone(dialog_state.current_prompt_state) self.assertIsNone(dialog_state.drill_instance_id) self.assertEqual({"foo": "bar"}, dialog_state.user_profile.account_info)
def test_user_validated(self): original = UserValidated( "123456789", user_profile=UserProfile(True), code_validation_payload=CodeValidationPayload(valid=True, is_demo=True), ) serialized = original.to_dict() deserialized = event_from_dict(serialized) self._make_base_assertions(original, deserialized)
def test_user_validated(self): profile = UserProfile(validated=False) dialog_state = DialogState("123456789", "0", user_profile=profile) event = UserValidated( phone_number="123456789", user_profile=profile, code_validation_payload=CodeValidationPayload( valid=True, is_demo=False, account_info={"foo": "bar"}), ) event.apply_to(dialog_state) self.assertTrue(dialog_state.user_profile.validated) self.assertEqual({"foo": "bar"}, dialog_state.user_profile.account_info)
def test_user_revalidated(self): user_id = self._make_user_and_get_id() for slug in get_all_drill_slugs(): drill = copy(self.drill) drill.slug = slug event = DrillStarted( phone_number=self.phone_number, user_profile=UserProfile(True), drill=Drill(slug=slug, name="name", prompts=[]), first_prompt=self.prompt, ) event2 = DrillCompleted( phone_number=self.phone_number, user_profile=UserProfile(True), drill_instance_id=event.drill_instance_id, ) self.repo._mark_drill_started(user_id, event, self.repo.engine) self.repo._mark_drill_completed(event2, self.repo.engine) drill_status = self.repo.get_drill_status(user_id, slug) self.assertIsNotNone(drill_status.started_time) self.assertIsNotNone(drill_status.completed_time) self.repo.update_user( self._make_batch([ UserValidated( phone_number=self.phone_number, user_profile=UserProfile(True), code_validation_payload=CodeValidationPayload(valid=True), ) ])) for slug in get_all_drill_slugs(): drill_status = self.repo.get_drill_status(user_id, slug) self.assertIsNone(drill_status.drill_instance_id) self.assertIsNone(drill_status.started_time) self.assertIsNone(drill_status.completed_time)
def test_initiates_first_drill(self): batch1 = DialogEventBatch( phone_number="123456789", seq="0", events=[ UserValidated( phone_number="123456789", user_profile=UserProfile(True), code_validation_payload=CodeValidationPayload(valid=True), ), DrillStarted( phone_number="123456789", user_profile=UserProfile(True), drill=self.drill, first_prompt=self.drill.prompts[0], ), ], ) batch2 = DialogEventBatch( phone_number="987654321", seq="1", events=[ DrillStarted( phone_number="987654321", user_profile=UserProfile(True), drill=self.drill, first_prompt=self.drill.prompts[0], ) ], ) self.assertTrue(initiates_first_drill(batch1)) self.assertFalse(initiates_first_drill(batch2))
def test_user_validated_event(self): code_validation_payload = CodeValidationPayload(valid=True, is_demo=False) dialog_events: List[DialogEvent] = [ UserValidated(self.phone, self.validated_user_profile, code_validation_payload) ] outbound_messages = get_outbound_sms_commands(dialog_events) self.assertEqual(len(outbound_messages), 0)
def _make_user_and_get_id(self, **overrides) -> uuid.UUID: return self.repo._create_or_update_user( self._make_batch([ UserValidated( phone_number=overrides.get("phone_number", self.phone_number), user_profile=UserProfile(True), code_validation_payload=CodeValidationPayload(valid=True), ) ]), None, self.repo.engine, )
def _validate_demo_registration( self, dialog_state: DialogState, base_args: Dict[str, Any]) -> Optional[List[DialogEvent]]: if not dialog_state.user_profile.is_demo: return None validation_payload = self.registration_validator.validate_code( self.content_lower) if validation_payload.valid: return [ UserValidated(code_validation_payload=validation_payload, **base_args) ] return None
def _validate_registration( self, dialog_state: DialogState, base_args: Dict[str, Any] ) -> Optional[List[stopcovid.dialog.models.events.DialogEvent]]: if dialog_state.user_profile.is_demo or not dialog_state.user_profile.validated: validation_payload = self.registration_validator.validate_code( self.content_lower) if validation_payload.valid: return [ UserValidated(code_validation_payload=validation_payload, **base_args) ] if not dialog_state.user_profile.validated: return [UserValidationFailed(**base_args)]
def _validate_registration( self, dialog_state: DialogState, base_args: Dict[str, Any]) -> Optional[List[DialogEvent]]: if not dialog_state.user_profile.validated or ( dialog_state.user_profile.account_info and not dialog_state.user_profile.account_info.employer_id): validation_payload = self.registration_validator.validate_code( self.content_lower) if validation_payload.valid: return [ UserValidated(code_validation_payload=validation_payload, **base_args) ] if not dialog_state.user_profile.validated: return [UserValidationFailed(**base_args)] return None
def setUp(self): os.environ["STAGE"] = "test" self.drill_progress_repo = DrillProgressRepository( db.get_test_sqlalchemy_engine) self.drill_progress_repo.drop_and_recreate_tables_testing_only() self.phone_number = "123456789" self.user_id = self.drill_progress_repo._create_or_update_user( DialogEventBatch( events=[ UserValidated(self.phone_number, UserProfile(True), CodeValidationPayload(True)) ], phone_number=self.phone_number, seq="0", batch_id=uuid.uuid4(), ), None, self.drill_progress_repo.engine, ) drill_db_patch = patch( "stopcovid.drill_progress.trigger_reminders.ReminderTriggerer._get_drill_progress_repo", return_value=self.drill_progress_repo, ) drill_db_patch.start() self.addCleanup(drill_db_patch.stop) self.idempotency_checker = IdempotencyChecker( region_name="us-west-2", endpoint_url="http://localhost:9000", aws_access_key_id="fake-key", aws_secret_access_key="fake-secret", ) self.idempotency_checker.drop_and_recreate_table() idempotency_patch = patch( "stopcovid.drill_progress.trigger_reminders.IdempotencyChecker", return_value=self.idempotency_checker, ) idempotency_patch.start() self.addCleanup(idempotency_patch.stop)
def test_user_revalidated(self): drill_instance1 = self._make_drill_instance() drill_instance2 = self._make_drill_instance() self.repo._save_drill_instance(drill_instance1) self.repo._save_drill_instance(drill_instance2) self.assertTrue(drill_instance1.is_valid) self.assertTrue(drill_instance2.is_valid) self.repo.update_user( self._make_batch([ UserValidated( phone_number=self.phone_number, user_profile=UserProfile(True), code_validation_payload=CodeValidationPayload( valid=True, is_demo=True), ) ])) drill_instance1 = self.repo.get_drill_instance( drill_instance1.drill_instance_id) drill_instance2 = self.repo.get_drill_instance( drill_instance2.drill_instance_id) self.assertFalse(drill_instance1.is_valid) self.assertFalse(drill_instance2.is_valid)
def setUp(self): logging.disable(logging.CRITICAL) self.repo = DrillProgressRepository(db.get_test_sqlalchemy_engine) self.repo.drop_and_recreate_tables_testing_only() self.phone_number = "123456789" self.prompt1 = Prompt(slug="first", messages=[]) self.prompt2 = Prompt(slug="second", messages=[]) self.drill = Drill(slug="slug", name="name", prompts=[self.prompt1]) self.seq = 1 self.user_id = self.repo._create_or_update_user( DialogEventBatch( events=[ UserValidated(self.phone_number, UserProfile(True), CodeValidationPayload(True)) ], phone_number=self.phone_number, seq="0", batch_id=uuid.uuid4(), ), None, self.repo.engine, ) self.drill_instance = self._make_drill_instance()