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": '"\\', "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: "\\' ]
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_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_wrong_action(self): serializer = RecipeSerializer(data={ "action_id": "9999", "arguments": {} }) with pytest.raises(serializers.ValidationError): serializer.is_valid(raise_exception=True) assert serializer.errors["action_id"] == [ serializers.PrimaryKeyRelatedField. default_error_messages["does_not_exist"].format(pk_value=9999) ]
def test_validation_with_invalid_action(self): serializer = RecipeSerializer(data={ "action_id": "action-that-doesnt-exist", "arguments": {} }) with pytest.raises(serializers.ValidationError): serializer.is_valid(raise_exception=True) assert serializer.errors["action_id"] == [ serializers.PrimaryKeyRelatedField. default_error_messages["incorrect_type"].format(data_type="str") ]
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_id': mockAction.id, '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 == {}
def test_validation_with_wrong_arguments(self): action = ActionFactory(name="show-heartbeat", arguments_schema=ARGUMENTS_SCHEMA) serializer = RecipeSerializer( data={ "action_id": action.id, "name": "Any name", "extra_filter_expression": "true", "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) serializer = RecipeSerializer( data={ "name": "bar", "enabled": True, "extra_filter_expression": "[]", "action_id": mockAction.id, "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 }, ], }, } assert serializer.errors == {}
def disable(self, request, pk=None): recipe = self.get_object() try: recipe.approved_revision.disable(user=request.user) except EnabledState.NotActionable as e: return Response({"error": str(e)}, status=status.HTTP_409_CONFLICT) return Response(RecipeSerializer(recipe).data)
def enable(self, request, pk=None): recipe = self.get_object() recipe.enabled = True try: recipe.save() except Recipe.NotApproved as e: return Response({'enabled': str(e)}, status=status.HTTP_409_CONFLICT) return Response(RecipeSerializer(recipe).data)
def test_validation_with_wrong_arguments(self): action = ActionFactory(name='show-heartbeat', arguments_schema=ARGUMENTS_SCHEMA) serializer = RecipeSerializer( data={ 'action_id': action.id, '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 enable(self, request, pk=None): recipe = self.get_object() if recipe.approved_revision: try: recipe.approved_revision.enable(user=request.user) except EnabledState.NotActionable as e: return Response({"error": str(e)}, status=status.HTTP_409_CONFLICT) else: return Response( {"error": "Cannot enable a recipe that is not approved."}, status=status.HTTP_409_CONFLICT, ) return Response(RecipeSerializer(recipe).data)
def test_it_works(self, rf): channel = ChannelFactory() country = CountryFactory() locale = LocaleFactory() recipe = RecipeFactory(arguments={'foo': 'bar'}, channels=[channel], countries=[country], locales=[locale]) approval = ApprovalRequestFactory(revision=recipe.latest_revision) action = recipe.action serializer = RecipeSerializer(recipe, context={'request': rf.get('/')}) assert serializer.data == { 'name': recipe.name, 'id': recipe.id, 'last_updated': Whatever(), 'enabled': recipe.enabled, 'extra_filter_expression': recipe.extra_filter_expression, 'filter_expression': recipe.filter_expression, 'action': { 'arguments_schema': {}, 'id': action.id, 'implementation_url': Whatever(), 'name': action.name, }, 'arguments': { 'foo': 'bar', }, 'channels': [channel.slug], 'countries': [country.code], 'locales': [locale.code], 'is_approved': False, 'latest_revision': RecipeRevisionSerializer(recipe.latest_revision).data, 'approved_revision': None, 'approval_request': { 'id': approval.id, 'created': Whatever(), 'creator': Whatever(), 'approved': None, 'approver': None, 'comment': None, }, }
def test_it_works(self, rf): recipe = RecipeFactory(arguments={"foo": "bar"}, filter_object_json=None) approval = ApprovalRequestFactory(revision=recipe.latest_revision) action = recipe.action serializer = RecipeSerializer(recipe, context={"request": rf.get("/")}) assert serializer.data == { "name": recipe.name, "id": recipe.id, "last_updated": Whatever(), "enabled": recipe.enabled, "extra_filter_expression": recipe.extra_filter_expression, "filter_expression": recipe.filter_expression, "filter_object": [], "action": { "arguments_schema": {}, "id": action.id, "implementation_url": Whatever(), "name": action.name, }, "arguments": { "foo": "bar" }, "is_approved": False, "latest_revision": RecipeRevisionSerializer(recipe.latest_revision).data, "approved_revision": None, "approval_request": { "id": approval.id, "created": Whatever(), "creator": Whatever(), "approved": None, "approver": None, "comment": None, }, "identicon_seed": Whatever.startswith("v1:"), }
def disable(self, request, pk=None): recipe = self.get_object() recipe.enabled = False recipe.save() return Response(RecipeSerializer(recipe).data)