diff options
| -rw-r--r-- | fatcat/models.py | 74 | ||||
| -rw-r--r-- | tests/test_backend.py | 75 | 
2 files changed, 137 insertions, 12 deletions
| diff --git a/fatcat/models.py b/fatcat/models.py index c145b6a7..49bdef22 100644 --- a/fatcat/models.py +++ b/fatcat/models.py @@ -189,7 +189,7 @@ class FileRev(db.Model):      extra_json = db.Column(db.ForeignKey('extra_json.sha1'), nullable=True)      size = db.Column(db.Integer) -    sha1 = db.Column(db.Integer)            # TODO: hash table... only or in addition? +    sha1 = db.Column(db.String)             # TODO: hash table... only or in addition?      url = db.Column(db.Integer)             # TODO: URL table      releases = db.relationship('FileRelease', lazy='subquery') @@ -236,17 +236,36 @@ class ChangelogEntry(db.Model):  class ExtraJson(db.Model):      __tablename__ = 'extra_json' -    sha1 = db.Column(db.String, primary_key=True) -    json = db.Column(db.String) +    sha1 = db.Column(db.String, primary_key=True, nullable=False) +    json = db.Column(db.String, nullable=False)  ### Marshmallow Wrappers #################################################### +class ExtraJsonSchema(ma.ModelSchema): + +    class Meta: +        model = ExtraJson + +    @post_dump(pass_many=False) +    def unflatten(self, data): +        assert(hashlib.sha1sum(data['json']).hexdigest() == data['sha1']) +        data.pop('sha1') +        raw = data.pop('json') +        data.update(json.loads(raw)) + +    @post_dump(pass_many=False) +    def flatten(self, data): +        raw = json.dumps(data, indent=None) +        for k in list(data.keys()): +            data.pop(k) +        data['sha1'] = hashlib.sha1sum(raw).hexdigest() +        data['json'] = raw +  class EntitySchema(ma.ModelSchema):      @post_dump(pass_many=False)      def merge_rev(self, data): -        print(data)          if data.get('rev', None) != None:              rev_id = data['rev'].pop('id')              data.update(data['rev']) @@ -256,8 +275,26 @@ class EntitySchema(ma.ModelSchema):          # TODO: should be able to set as an allow_none field somewhere          if not data.get('redirect_id', None):              data['redirect_id'] = None -        print(data) +    extra_json = ma.Nested(ExtraJsonSchema) + +class ReleaseContribSchema(ma.ModelSchema): +    class Meta: +        model = ReleaseContrib +    #creator = db.relationship("CreatorIdent") +    #release = db.relationship("ReleaseRev") + +class ReleaseRefSchema(ma.ModelSchema): +    class Meta: +        model = ReleaseRef +    #release = db.relationship("ReleaseRev") +    #target = db.relationship("ReleaseIdent") + +class FileReleaseSchema(ma.ModelSchema): +    class Meta: +        model = FileRelease +    #release = db.relationship("ReleaseIdent") +    #file = db.relationship("FileRev")  class WorkRevSchema(ma.ModelSchema):      class Meta: @@ -279,16 +316,21 @@ work_edit_schema = WorkEditSchema()  class ReleaseRevSchema(ma.ModelSchema):      class Meta:          model = ReleaseRev +    container = ma.Nested('ContainerSchema') +    creators = ma.Nested(ReleaseContribSchema, many=True) +    refs = ma.Nested(ReleaseRefSchema, many=True)  class ReleaseSchema(EntitySchema):      class Meta:          model = ReleaseIdent      rev = ma.Nested(ReleaseRevSchema) +    # XXX: files = ma.Nested('FileSchema', many=True)  class ReleaseEditSchema(ma.ModelSchema):      class Meta:          model = ReleaseEdit +release_rev_schema = ReleaseRevSchema()  release_schema = ReleaseSchema()  release_edit_schema = ReleaseEditSchema() @@ -306,6 +348,7 @@ class CreatorEditSchema(ma.ModelSchema):      class Meta:          model = CreatorEdit +creator_rev_schema = CreatorRevSchema()  creator_schema = CreatorSchema()  creator_edit_schema = CreatorEditSchema() @@ -323,11 +366,30 @@ class ContainerEditSchema(ma.ModelSchema):      class Meta:          model = ContainerEdit +container_rev_schema = ContainerRevSchema()  container_schema = ContainerSchema()  container_edit_schema = ContainerEditSchema() -class Editor(ma.ModelSchema): +class FileRevSchema(ma.ModelSchema): +    class Meta: +        model = FileRev + +class FileSchema(EntitySchema): +    class Meta: +        model = FileIdent +    rev = ma.Nested(FileRevSchema) + +class FileEditSchema(ma.ModelSchema): +    class Meta: +        model = FileEdit + +file_rev_schema = FileRevSchema() +file_schema = FileSchema() +file_edit_schema = FileEditSchema() + + +class EditorSchema(ma.ModelSchema):      class Meta:          model = Editor diff --git a/tests/test_backend.py b/tests/test_backend.py index 4cd474cc..1b470429 100644 --- a/tests/test_backend.py +++ b/tests/test_backend.py @@ -4,6 +4,7 @@ import json  import pytest  import fatcat  import fatcat.sql +from fatcat.models import *  import unittest  import tempfile @@ -18,24 +19,22 @@ def check_entity_fields(e):          assert e[key] is not None  def check_release(e): -    check_entity_fields(e)      for key in ('work', 'release_type'):          assert key in e      for key in ('title'):          assert e[key] is not None +    for key in ('refs', 'creators'): +        assert type(e[key]) == list  def check_creator(e): -    check_entity_fields(e) -    for key in ('name'): +    for key in ('name',):          assert e[key] is not None  def check_container(e): -    check_entity_fields(e) -    for key in ('name'): +    for key in ('name',):          assert e[key] is not None  def check_file(e): -    check_entity_fields(e)      for key in ('size', 'sha1'):          assert e[key] is not None @@ -78,6 +77,70 @@ class ModelTestCase(FatcatTestCase):          fatcat.dummy.insert_random_works()          fatcat.sql.hydrate_release(1) +    def test_schema_release_rev(self): +        assert ReleaseRev.query.count() == 0 +        e = { +            "title": "Bogus title", +            "release_type": "book", +            "creators": [], +            "refs": [], +        } +        model = release_rev_schema.load(e) +        fatcat.db.session.add(model.data) +        fatcat.db.session.commit() +        assert ReleaseRev.query.count() == 1 +        model_after = ReleaseRev.query.first() +        serial = release_rev_schema.dump(model_after).data +        #check_release(serial) +        for k in e.keys(): +            assert e[k] == serial[k] + +    def test_schema_creator_rev(self): +        assert ReleaseRev.query.count() == 0 +        e = { +            "name": "Robin (Batman)", +        } +        model = creator_rev_schema.load(e) +        fatcat.db.session.add(model.data) +        fatcat.db.session.commit() +        assert CreatorRev.query.count() == 1 +        model_after = CreatorRev.query.first() +        serial = creator_rev_schema.dump(model_after).data +        check_creator(serial) +        for k in e.keys(): +            assert e[k] == serial[k] + +    def test_schema_container_rev(self): +        assert ReleaseRev.query.count() == 0 +        e = { +            "name": "Papers Monthly", +        } +        model = container_rev_schema.load(e) +        fatcat.db.session.add(model.data) +        fatcat.db.session.commit() +        assert ContainerRev.query.count() == 1 +        model_after = ContainerRev.query.first() +        serial = container_rev_schema.dump(model_after).data +        check_container(serial) +        for k in e.keys(): +            assert e[k] == serial[k] + +    def test_schema_file_rev(self): +        assert ReleaseRev.query.count() == 0 +        e = { +            "sha1": "asdf", +            "size": 6, +        } +        model = file_rev_schema.load(e) +        print(model) +        fatcat.db.session.add(model.data) +        fatcat.db.session.commit() +        assert FileRev.query.count() == 1 +        model_after = FileRev.query.first() +        serial = file_rev_schema.dump(model_after).data +        check_file(serial) +        for k in e.keys(): +            assert e[k] == serial[k]  ## API Tests ################################################################# | 
