Пример #1
0
    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()))
Пример #2
0
    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:])
Пример #3
0
    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()
Пример #4
0
    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()
Пример #5
0
    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:])
Пример #6
0
    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()
Пример #7
0
    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)