def test_explained_advice(self, mock_scoring_models: Dict[str, Any]) -> None: """Test that the advisor gives explanations for the advices.""" mock_scoring_models['constant(1)'] = mock.MagicMock( spec=['get_advice_override', 'score_and_explain']) mock_scoring_models['constant(1)'].score_and_explain.return_value = \ scoring.ExplainedScore(1, ['voilà pourquoi', 'explication genré%eFeminine']) mock_scoring_models[ 'constant(1)'].get_advice_override.return_value = None project = project_pb2.Project() self.database.advice_modules.insert_one({ 'adviceId': 'network', 'categories': ['first'], 'triggerScoringModel': 'constant(1)', 'isReadyForProd': True, }) self.user.profile.gender = user_pb2.FEMININE advisor.maybe_advise(self.user, project, self.database) self.assertEqual(['network'], [a.advice_id for a in project.advices]) self.assertEqual(['voilà pourquoi', 'explication genrée'], project.advices[0].explanations) self.assertEqual(1, len(mailjetmock.get_all_sent_messages()))
def test_module_crashes(self, mock_logger: mock.MagicMock) -> None: """Test that the advisor does not crash if one module does.""" constant_1_model = typing.cast(_ScoringModelMock, scoring.SCORING_MODELS['constant(1)']) constant_1_model.score_and_explain.return_value = scoring.ExplainedScore(1, []) constant_1_model.get_advice_override.return_value = None crash_me_model = typing.cast(_ScoringModelMock, advisor.scoring.SCORING_MODELS['crash-me']) crash_me_model.score_and_explain.side_effect = ValueError('ouch') crash_me_model.get_advice_override.return_value = None project = project_pb2.Project() self.database.advice_modules.insert_many([ { 'adviceId': 'other-work-env', 'categories': ['first'], 'triggerScoringModel': 'crash-me', 'isReadyForProd': True, }, { 'adviceId': 'network', 'categories': ['first'], 'triggerScoringModel': 'constant(1)', 'isReadyForProd': True, }, ]) self.user.profile.locale = 'fr' advisor.maybe_advise(self.user, project, self.database) self.assertEqual(['network'], [a.advice_id for a in project.advices]) mock_logger.assert_called_once() self.assertIn('REDACTED', mock_logger.call_args[0][0] % mock_logger.call_args[0][1:])
def test_explained_advice(self, mock_scoring_models, mock_send_template): """Test that the advisor gives explanations for the advices.""" mock_send_template().status_code = 200 mock_send_template.reset_mock() mock_scoring_models['constant(1)'] = mock.MagicMock( spec=['score_and_explain']) mock_scoring_models['constant(1)'].score_and_explain.return_value = \ scoring.ExplainedScore(1, ['voilà pourquoi', 'explication genré%eFeminine']) project = project_pb2.Project() self.database.advice_modules.insert_one({ 'adviceId': 'network', 'categories': ['first'], 'triggerScoringModel': 'constant(1)', 'isReadyForProd': True, }) self.user.profile.gender = user_pb2.FEMININE advisor.maybe_advise(self.user, project, self.database) self.assertEqual(['network'], [a.advice_id for a in project.advices]) self.assertEqual(['voilà pourquoi', 'explication genrée'], project.advices[0].explanations) mock_send_template.assert_called_once()
def test_module_crashes(self, mock_logger, mock_scoring_models): """Test that the advisor does not crash if one module does while getting extra data.""" mock_scoring_models['constant(1)'] = mock.MagicMock( spec=['score_and_explain', 'compute_extra_data']) mock_scoring_models['constant(1)'].score_and_explain.return_value = \ scoring.ExplainedScore(1, []) mock_scoring_models['constant(1)'].compute_extra_data.return_value = \ project_pb2.CommuteData(cities=['Lyon', 'Paris']) mock_scoring_models['crash-me'] = mock.MagicMock( spec=['score_and_explain', 'compute_extra_data']) mock_scoring_models['crash-me'].score_and_explain.return_value = \ scoring.ExplainedScore(2, []) mock_scoring_models[ 'crash-me'].compute_extra_data.side_effect = ValueError('ouch') project = project_pb2.Project() self.database.advice_modules.insert_many([ { 'adviceId': 'other-work-env', 'categories': ['first'], 'triggerScoringModel': 'constant(1)', 'extraDataFieldName': 'commute_data', 'isReadyForProd': True, }, { 'adviceId': 'network', 'categories': ['first'], 'triggerScoringModel': 'crash-me', 'extraDataFieldName': 'commute_data', 'isReadyForProd': True, }, ]) advisor.maybe_advise(self.user, project, self.database) self.assertEqual(['network', 'other-work-env'], [a.advice_id for a in project.advices]) self.assertFalse(project.advices[0].WhichOneof('extra_data')) self.assertEqual(['Lyon', 'Paris'], project.advices[1].commute_data.cities) mock_logger.assert_called_once()
def test_module_crashes(self, mock_logger: mock.MagicMock, mock_scoring_models: Dict[str, Any]) -> None: """Test that the advisor does not crash if one module does.""" mock_scoring_models['constant(1)'] = mock.MagicMock( spec=['get_advice_override', 'score_and_explain']) mock_scoring_models['constant(1)'].score_and_explain.return_value = \ scoring.ExplainedScore(1, []) mock_scoring_models[ 'constant(1)'].get_advice_override.return_value = None mock_scoring_models['crash-me'] = mock.MagicMock( spec=['get_advice_override', 'score_and_explain']) mock_scoring_models[ 'crash-me'].score_and_explain.side_effect = ValueError('ouch') mock_scoring_models['crash-me'].get_advice_override.return_value = None project = project_pb2.Project() self.database.advice_modules.insert_many([ { 'adviceId': 'other-work-env', 'categories': ['first'], 'triggerScoringModel': 'crash-me', 'isReadyForProd': True, }, { 'adviceId': 'network', 'categories': ['first'], 'triggerScoringModel': 'constant(1)', 'isReadyForProd': True, }, ]) advisor.maybe_advise(self.user, project, self.database) self.assertEqual(['network'], [a.advice_id for a in project.advices]) self.assertEqual(1, len(mailjetmock.get_all_sent_messages())) mock_logger.assert_called_once() self.assertIn( 'REDACTED', mock_logger.call_args[0][0] % mock_logger.call_args[0][1:])
def test_module_crashes(self, mock_logger, mock_scoring_models, mock_send_template): """Test that the advisor does not crash if one module does.""" mock_send_template().status_code = 200 mock_send_template.reset_mock() mock_scoring_models['constant(1)'] = mock.MagicMock( spec=['score_and_explain']) mock_scoring_models['constant(1)'].score_and_explain.return_value = \ scoring.ExplainedScore(1, []) mock_scoring_models['crash-me'] = mock.MagicMock( spec=['score_and_explain']) mock_scoring_models[ 'crash-me'].score_and_explain.side_effect = ValueError('ouch') project = project_pb2.Project() self.database.advice_modules.insert_many([ { 'adviceId': 'other-work-env', 'categories': ['first'], 'triggerScoringModel': 'crash-me', 'isReadyForProd': True, }, { 'adviceId': 'network', 'categories': ['first'], 'triggerScoringModel': 'constant(1)', 'isReadyForProd': True, }, ]) advisor.maybe_advise(self.user, project, self.database) self.assertEqual(['network'], [a.advice_id for a in project.advices]) mock_send_template.assert_called_once() mock_logger.assert_called_once()
def test_explained_advice(self) -> None: """Test that the advisor gives explanations for the advices.""" mock_scoring_model = typing.cast(_ScoringModelMock, scoring.SCORING_MODELS['constant(1)']) mock_scoring_model.score_and_explain.return_value = \ scoring.ExplainedScore(1, ['voilà pourquoi', 'explication genré%eFeminine']) mock_scoring_model.get_advice_override.return_value = None project = project_pb2.Project() self.database.advice_modules.insert_one({ 'adviceId': 'network', 'categories': ['first'], 'triggerScoringModel': 'constant(1)', 'isReadyForProd': True, }) self.user.profile.gender = user_profile_pb2.FEMININE advisor.maybe_advise(self.user, project, self.database) self.assertEqual( ['network'], [a.advice_id for a in project.advices]) self.assertEqual( ['voilà pourquoi', 'explication genrée'], project.advices[0].explanations)