Пример #1
0
    def build_attribute_list(attributes, project_config):
        """ Create Vistor Attribute List.

    Args:
      attributes: Dict representing user attributes and values which need to be recorded or None.
      project_config: Instance of ProjectConfig.

    Returns:
      List consisting of valid attributes for the user. Empty otherwise.
    """

        attributes_list = []

        if project_config is None:
            return attributes_list

        if isinstance(attributes, dict):
            for attribute_key in attributes.keys():
                attribute_value = attributes.get(attribute_key)
                # Omit attribute values that are not supported by the log endpoint.
                if validator.is_attribute_valid(attribute_key,
                                                attribute_value):
                    attribute_id = project_config.get_attribute_id(
                        attribute_key)
                    if attribute_id:
                        attributes_list.append(
                            payload.VisitorAttribute(
                                attribute_id,
                                attribute_key,
                                CUSTOM_ATTRIBUTE_FEATURE_TYPE,
                                attribute_value,
                            ))

        # Append Bot Filtering Attribute
        bot_filtering_value = project_config.get_bot_filtering_value()
        if isinstance(bot_filtering_value, bool):
            attributes_list.append(
                payload.VisitorAttribute(
                    enums.ControlAttributes.BOT_FILTERING,
                    enums.ControlAttributes.BOT_FILTERING,
                    CUSTOM_ATTRIBUTE_FEATURE_TYPE,
                    bot_filtering_value,
                ))

        return attributes_list
Пример #2
0
    def test_is_attribute_valid(self):
        """ Test that non-string attribute key or unsupported attribute value returns False."""

        # test invalid attribute keys
        self.assertFalse(validator.is_attribute_valid(5, 'test_value'))
        self.assertFalse(validator.is_attribute_valid(True, 'test_value'))
        self.assertFalse(validator.is_attribute_valid(5.5, 'test_value'))

        # test invalid attribute values
        self.assertFalse(validator.is_attribute_valid('test_attribute', None))
        self.assertFalse(validator.is_attribute_valid('test_attribute', {}))
        self.assertFalse(validator.is_attribute_valid('test_attribute', []))
        self.assertFalse(validator.is_attribute_valid('test_attribute', ()))

        # test valid attribute values
        self.assertTrue(validator.is_attribute_valid('test_attribute', False))
        self.assertTrue(validator.is_attribute_valid('test_attribute', True))
        self.assertTrue(validator.is_attribute_valid('test_attribute', 0))
        self.assertTrue(validator.is_attribute_valid('test_attribute', 0.0))
        self.assertTrue(validator.is_attribute_valid('test_attribute', ""))
        self.assertTrue(
            validator.is_attribute_valid('test_attribute', 'test_value'))

        # test if attribute value is a number, it calls is_finite_number and returns it's result
        with mock.patch('optimizely.helpers.validator.is_finite_number',
                        return_value=True) as mock_is_finite:
            self.assertTrue(validator.is_attribute_valid('test_attribute', 5))

        mock_is_finite.assert_called_once_with(5)

        with mock.patch('optimizely.helpers.validator.is_finite_number',
                        return_value=False) as mock_is_finite:
            self.assertFalse(
                validator.is_attribute_valid('test_attribute', 5.5))

        mock_is_finite.assert_called_once_with(5.5)

        if PY2:
            with mock.patch('optimizely.helpers.validator.is_finite_number',
                            return_value=None) as mock_is_finite:
                self.assertIsNone(
                    validator.is_attribute_valid('test_attribute', long(5)))

            mock_is_finite.assert_called_once_with(long(5))