Skip to content

Commit

Permalink
Adds missing test
Browse files Browse the repository at this point in the history
  • Loading branch information
jfinkels committed Apr 4, 2016
1 parent ba77c4e commit c8fcc66
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 71 deletions.
45 changes: 45 additions & 0 deletions tests/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@

from flask.ext.restless import APIManager
from flask.ext.restless import CONTENT_TYPE
from flask.ext.restless import DefaultSerializer
from flask.ext.restless import DefaultDeserializer
from flask.ext.restless import DeserializationException
from flask.ext.restless import SerializationException

dumps = json.dumps
loads = json.loads
Expand All @@ -63,6 +67,47 @@
CLASS_TYPES = (types.TypeType, types.ClassType) if IS_PYTHON2 else (type, )


class raise_s_exception(DefaultSerializer):
"""A serializer that unconditionally raises an exception when
either :meth:`.serialize` or :meth:`.serialize_many` is called.
This class is useful for tests of serialization exceptions.
"""

def serialize(self, instance, *args, **kw):
"""Immediately raises a :exc:`SerializationException` with
access to the provided `instance` of a SQLAlchemy model.
"""
raise SerializationException(instance)

def serialize_many(self, instances, *args, **kw):
"""Immediately raises a :exc:`SerializationException`.
This function requires `instances` to be non-empty.
"""
raise SerializationException(instances[0])


class raise_d_exception(DefaultDeserializer):
"""A deserializer that unconditionally raises an exception when
either :meth:`.deserialize` or :meth:`.deserialize_many` is called.
This class is useful for tests of deserialization exceptions.
"""

def deserialize(self, *args, **kw):
"""Immediately raises a :exc:`DeserializationException`."""
raise DeserializationException

def deserialize_many(self, *args, **kw):
"""Immediately raises a :exc:`DeserializationException`."""
raise DeserializationException


def isclass(obj):
"""Returns ``True`` if and only if the specified object is a type (or a
class).
Expand Down
45 changes: 2 additions & 43 deletions tests/test_creating.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,6 @@
from flask.ext.restless import CONTENT_TYPE
from flask.ext.restless import DefaultDeserializer
from flask.ext.restless import DefaultSerializer
from flask.ext.restless import DeserializationException
from flask.ext.restless import SerializationException

from .helpers import BetterJSONEncoder as JSONEncoder
from .helpers import check_sole_error
Expand All @@ -51,50 +49,11 @@
from .helpers import ManagerTestBase
from .helpers import MSIE8_UA
from .helpers import MSIE9_UA
from .helpers import raise_s_exception
from .helpers import raise_d_exception
from .helpers import skip


class raise_s_exception(DefaultSerializer):
"""A serializer that unconditionally raises an exception when
either :meth:`.serialize` or :meth:`.serialize_many` is called.
This class is useful for tests of serialization exceptions.
"""

def serialize(self, instance, *args, **kw):
"""Immediately raises a :exc:`SerializationException` with
access to the provided `instance` of a SQLAlchemy model.
"""
raise SerializationException(instance)

def serialize_many(self, instances, *args, **kw):
"""Immediately raises a :exc:`SerializationException`.
This function requires `instances` to be non-empty.
"""
raise SerializationException(instances[0])


class raise_d_exception(DefaultDeserializer):
"""A deserializer that unconditionally raises an exception when
either :meth:`.deserialize` or :meth:`.deserialize_many` is called.
This class is useful for tests of deserialization exceptions.
"""

def deserialize(self, *args, **kw):
"""Immediately raises a :exc:`DeserializationException`."""
raise DeserializationException

def deserialize_many(self, *args, **kw):
"""Immediately raises a :exc:`DeserializationException`."""
raise DeserializationException


class TestCreating(ManagerTestBase):
"""Tests for creating resources."""

Expand Down
11 changes: 7 additions & 4 deletions tests/test_jsonapi/test_updating_resources.py
Original file line number Diff line number Diff line change
Expand Up @@ -262,11 +262,14 @@ def test_other_modifications(self):
tag = self.Tag(id=1)
self.session.add(tag)
self.session.commit()
data = {'data':
{'type': 'tag',
'id': '1',
'attributes': {'name': u'foo'}
data = {
'data': {
'type': 'tag',
'id': '1',
'attributes': {
'name': u'foo'
}
}
}
response = self.app.patch('/api/tag/1', data=dumps(data))
assert response.status_code == 200
Expand Down
25 changes: 1 addition & 24 deletions tests/test_serialization.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,30 +44,7 @@
from .helpers import GUID
from .helpers import loads
from .helpers import ManagerTestBase


class raise_exception(DefaultSerializer):
"""A serializer that unconditionally raises an exception when
either :meth:`.serialize` or :meth:`.serialize_many` is called.
This class is useful for tests of serialization exceptions.
"""

def serialize(self, instance, *args, **kw):
"""Immediately raises a :exc:`SerializationException` with
access to the provided `instance` of a SQLAlchemy model.
"""
raise SerializationException(instance)

def serialize_many(self, instances, *args, **kw):
"""Immediately raises a :exc:`SerializationException`.
This function requires `instances` to be non-empty.
"""
raise SerializationException(instances[0])
from .helpers import raise_s_exception as raise_exception


class DecoratedDateTime(TypeDecorator):
Expand Down
37 changes: 37 additions & 0 deletions tests/test_updating.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
from sqlalchemy import Date
from sqlalchemy import DateTime
from sqlalchemy import ForeignKey
from sqlalchemy import func
from sqlalchemy import Integer
from sqlalchemy import Time
from sqlalchemy import Unicode
Expand All @@ -52,6 +53,7 @@
from .helpers import MSIE8_UA
from .helpers import MSIE9_UA
from .helpers import ManagerTestBase
from .helpers import raise_s_exception as raise_exception
from .helpers import skip


Expand Down Expand Up @@ -106,9 +108,17 @@ def radius(self):
def radius(cls):
return cls.length / 2

class Tag(self.Base):
__tablename__ = 'tag'
id = Column(Integer, primary_key=True)
name = Column(Unicode)
updated_at = Column(DateTime, server_default=func.now(),
onupdate=func.current_timestamp())

self.Article = Article
self.Interval = Interval
self.Person = Person
self.Tag = Tag
self.Base.metadata.create_all()
self.manager.create_api(Article, methods=['PATCH'])
self.manager.create_api(Interval, methods=['PATCH'])
Expand Down Expand Up @@ -852,6 +862,33 @@ def test_relationship_missing_object(self):
# Check that the article was not updated to None.
assert article.author is person

def test_serialization_exception(self):
"""Tests that serialization exceptions are caught when
responding with content.
A representation of the modified resource is returned to the
client when an update causes additional changes in the resource
in ways other than those specified by the client.
"""
tag = self.Tag(id=1)
self.session.add(tag)
self.session.commit()
self.manager.create_api(self.Tag, methods=['PATCH'],
serializer_class=raise_exception)
data = {
'data': {
'type': 'tag',
'id': '1',
'attributes': {
'name': u'foo'
}
}
}
response = self.app.patch('/api/tag/1', data=dumps(data))
check_sole_error(response, 500, ['Failed to serialize', 'type', 'tag',
'ID', '1'])


class TestProcessors(ManagerTestBase):
"""Tests for pre- and postprocessors."""
Expand Down

0 comments on commit c8fcc66

Please sign in to comment.