def test_validation_with_wrong_action(self): serializer = RecipeSerializer(data={ 'action': 'action-that-doesnt-exist', 'arguments': {} }) with pytest.raises(serializers.ValidationError): serializer.is_valid(raise_exception=True) assert serializer.errors['arguments'] == [ 'Could not find arguments schema.' ]
def test_validation_with_invalid_filter_expression(self): ActionFactory(name='show-heartbeat', arguments_schema=ARGUMENTS_SCHEMA) serializer = RecipeSerializer( data={ 'name': 'bar', 'enabled': True, 'extra_filter_expression': 'inv(-alsid', 'action': 'show-heartbeat', 'arguments': { 'surveyId': 'lorem-ipsum-dolor', 'surveys': [{ 'title': 'adipscing', 'weight': 1 }, { 'title': 'consequetar', 'weight': 1 }] } }) assert not serializer.is_valid() assert serializer.errors['extra_filter_expression'] == [ 'Could not parse expression: inv(-alsid' ]
def test_validation_with_jexl_exception(self): serializer = RecipeSerializer( data={ 'name': 'bar', 'enabled': True, 'extra_filter_expression': 'aces', 'action': 'show-heartbeat', 'arguments': { 'surveyId': 'lorem-ipsum-dolor', 'surveys': [{ 'title': 'adipscing', 'weight': 1 }, { 'title': 'consequetar', 'weight': 1 }] } }) jexl_mock = mock.Mock() jexl_mock().validate.side_effect = Exception("didn't like this") with mock.patch('normandy.recipes.api.v1.serializers.JEXL', jexl_mock): assert not serializer.is_valid() assert serializer.errors['extra_filter_expression'] == [ 'The JEXL parser failed to validate aces' ]
def test_validation_with_wrong_arguments(self): ActionFactory(name='show-heartbeat', arguments_schema=ARGUMENTS_SCHEMA) serializer = RecipeSerializer( data={ 'action': 'show-heartbeat', 'arguments': { 'surveyId': '', 'surveys': [{ 'title': '', 'weight': 1 }, { 'title': 'bar', 'weight': 1 }, { 'title': 'foo', 'weight': 0 }, { 'title': 'baz', 'weight': 'lorem ipsum' }] } }) with pytest.raises(serializers.ValidationError): serializer.is_valid(raise_exception=True) assert serializer.errors['arguments'] == { 'surveyId': 'This field may not be blank.', 'surveys': { 0: { 'title': 'This field may not be blank.' }, 2: { 'weight': '0 is less than the minimum of 1' }, 3: { 'weight': '\'lorem ipsum\' is not of type \'integer\'' } } }
def test_validation_with_valid_data(self): mockAction = ActionFactory(name='show-heartbeat', arguments_schema=ARGUMENTS_SCHEMA) channel = ChannelFactory(slug='release') country = CountryFactory(code='CA') locale = LocaleFactory(code='en-US') serializer = RecipeSerializer( data={ 'name': 'bar', 'enabled': True, 'extra_filter_expression': '[]', 'action': 'show-heartbeat', 'channels': ['release'], 'countries': ['CA'], 'locales': ['en-US'], 'arguments': { 'surveyId': 'lorem-ipsum-dolor', 'surveys': [{ 'title': 'adipscing', 'weight': 1 }, { 'title': 'consequetar', 'weight': 1 }] } }) assert serializer.is_valid() assert serializer.validated_data == { 'name': 'bar', 'extra_filter_expression': '[]', 'action': mockAction, 'arguments': { 'surveyId': 'lorem-ipsum-dolor', 'surveys': [{ 'title': 'adipscing', 'weight': 1 }, { 'title': 'consequetar', 'weight': 1 }] }, 'channels': [channel], 'countries': [country], 'locales': [locale], } assert serializer.errors == {}