From 4cf667c283d54f769e73d76bb23bbb68b4329cf8 Mon Sep 17 00:00:00 2001 From: Bryan Newbold Date: Wed, 16 May 2018 18:34:19 -0700 Subject: move python code to subdirectory --- python/tests/api.py | 308 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 308 insertions(+) create mode 100644 python/tests/api.py (limited to 'python/tests/api.py') diff --git a/python/tests/api.py b/python/tests/api.py new file mode 100644 index 00000000..02875f64 --- /dev/null +++ b/python/tests/api.py @@ -0,0 +1,308 @@ + +import json +import unittest +import tempfile +import pytest +import fatcat +import fatcat.sql +from fatcat.models import * +from fixtures import * + + +def test_health(app): + rv = app.get('/health') + obj = json.loads(rv.data.decode('utf-8')) + assert obj['ok'] + +def test_api_work(app): + fatcat.dummy.insert_example_works() + + # Invalid Id + rv = app.get('/v0/work/_') + assert rv.status_code == 404 + + # Random + rv = app.get('/v0/work/random') + rv = app.get(rv.location) + work = json.loads(rv.data.decode('utf-8')) + check_entity_fields(work) + print(work) + assert work['title'] + assert work['work_type'] + + # Valid Id (from random above) + rv = app.get('/v0/work/{}'.format(work['id'])) + assert rv.status_code == 200 + + # Missing Id + rv = app.get('/v0/work/r3zga5b9cd7ef8gh084714iljk') + assert rv.status_code == 404 + +def test_api_work_create(app): + assert WorkIdent.query.count() == 0 + assert WorkRev.query.count() == 0 + assert WorkEdit.query.count() == 0 + rv = app.post('/v0/work', + data=json.dumps(dict(title="dummy", work_type="thing", extra=dict(a=1, b="zing"))), + headers={"content-type": "application/json"}) + print(rv) + assert rv.status_code == 200 + assert WorkIdent.query.count() == 1 + assert WorkRev.query.count() == 1 + assert WorkEdit.query.count() == 1 + # not alive yet + assert WorkIdent.query.filter(WorkIdent.is_live==True).count() == 0 + +def test_api_rich_create(app): + + # TODO: create user? + + rv = app.post('/v0/editgroup', + data=json.dumps(dict( + extra=dict(q=1, u="zing"))), + headers={"content-type": "application/json"}) + assert rv.status_code == 200 + obj = json.loads(rv.data.decode('utf-8')) + editgroup_id = obj['id'] + + for cls in (WorkIdent, WorkRev, WorkEdit, + ContainerIdent, ContainerRev, ContainerEdit, + CreatorIdent, CreatorRev, CreatorEdit, + ReleaseIdent, ReleaseRev, ReleaseEdit, + FileIdent, FileRev, FileEdit, + ChangelogEntry): + assert cls.query.count() == 0 + + rv = app.post('/v0/container', + data=json.dumps(dict( + name="schmournal", + publisher="society of authors", + issn="2222-3333", + editgroup=editgroup_id, + extra=dict(a=2, i="zing"))), + headers={"content-type": "application/json"}) + assert rv.status_code == 200 + obj = json.loads(rv.data.decode('utf-8')) + container_id = obj['id'] + + rv = app.post('/v0/creator', + data=json.dumps(dict( + name="anon y. mouse", + orcid="0000-0002-1825-0097", + editgroup=editgroup_id, + extra=dict(w=1, q="zing"))), + headers={"content-type": "application/json"}) + assert rv.status_code == 200 + obj = json.loads(rv.data.decode('utf-8')) + creator_id = obj['id'] + + rv = app.post('/v0/work', + data=json.dumps(dict( + title="dummy work", + work_type="book", + editgroup=editgroup_id, + extra=dict(a=3, b="zing"))), + headers={"content-type": "application/json"}) + assert rv.status_code == 200 + obj = json.loads(rv.data.decode('utf-8')) + work_id = obj['id'] + + # this stub work will be referenced + rv = app.post('/v0/release', + data=json.dumps(dict( + title="derivative work", + work_type="journal-article", + work=work_id, + creators=[creator_id], + doi="10.1234/58", + editgroup=editgroup_id, + refs=[ + dict(stub="some other journal article"), + ], + extra=dict(f=7, b="zing"))), + headers={"content-type": "application/json"}) + assert rv.status_code == 200 + obj = json.loads(rv.data.decode('utf-8')) + stub_release_id = obj['id'] + + rv = app.post('/v0/release', + data=json.dumps(dict( + title="dummy work", + work_type="book", + work=work_id, + container=container_id, + creators=[creator_id], + doi="10.1234/5678", + editgroup=editgroup_id, + refs=[ + dict(stub="some book", target=stub_release_id), + ], + extra=dict(f=7, b="loopy"))), + headers={"content-type": "application/json"}) + assert rv.status_code == 200 + obj = json.loads(rv.data.decode('utf-8')) + release_id = obj['id'] + + rv = app.post('/v0/file', + data=json.dumps(dict( + sha1="deadbeefdeadbeef", + size=1234, + releases=[release_id], + editgroup=editgroup_id, + extra=dict(f=4, b="zing"))), + headers={"content-type": "application/json"}) + assert rv.status_code == 200 + obj = json.loads(rv.data.decode('utf-8')) + file_id = obj['id'] + + for cls in (WorkIdent, WorkRev, WorkEdit, + ContainerIdent, ContainerRev, ContainerEdit, + CreatorIdent, CreatorRev, CreatorEdit, + FileIdent, FileRev, FileEdit): + assert cls.query.count() == 1 + for cls in (ReleaseIdent, ReleaseRev, ReleaseEdit): + assert cls.query.count() == 2 + + for cls in (WorkIdent, + ContainerIdent, + CreatorIdent, + ReleaseIdent, + FileIdent): + assert cls.query.filter(cls.is_live==True).count() == 0 + + assert ChangelogEntry.query.count() == 0 + rv = app.post('/v0/editgroup/{}/accept'.format(editgroup_id), + headers={"content-type": "application/json"}) + assert rv.status_code == 200 + assert ChangelogEntry.query.count() == 1 + + for cls in (WorkIdent, WorkRev, WorkEdit, + ContainerIdent, ContainerRev, ContainerEdit, + CreatorIdent, CreatorRev, CreatorEdit, + FileIdent, FileRev, FileEdit): + assert cls.query.count() == 1 + for cls in (ReleaseIdent, ReleaseRev, ReleaseEdit): + assert cls.query.count() == 2 + + for cls in (WorkIdent, + ContainerIdent, + CreatorIdent, + FileIdent): + assert cls.query.filter(cls.is_live==True).count() == 1 + assert ReleaseIdent.query.filter(ReleaseIdent.is_live==True).count() == 2 + + # Test that foreign key relations worked + release_rv = json.loads(app.get('/v0/release/{}'.format(release_id)).data.decode('utf-8')) + print(release_rv) + assert release_rv['creators'][0]['creator'] == creator_id + assert release_rv['container']['id'] == container_id + assert release_rv['work']['id'] == work_id + assert release_rv['refs'][0]['target'] == stub_release_id + + file_rv = json.loads(app.get('/v0/file/{}'.format(file_id)).data.decode('utf-8')) + print(file_rv) + assert file_rv['releases'][0]['release'] == release_id + + # test that editor's active edit group is now invalid + editor = Editor.query.first() + assert editor.active_editgroup is None + +def test_api_release_lookup(rich_app): + app = rich_app + + rv = app.get('/v0/release/1', + headers={"content-type": "application/json"}) + assert rv.status_code == 200 + obj = json.loads(rv.data.decode('utf-8')) + + rv = app.get('/v0/release/lookup', + data=json.dumps(dict(doi="10.1234/5678")), + headers={"content-type": "application/json"}) + assert rv.status_code == 200 + obj = json.loads(rv.data.decode('utf-8')) + assert obj['doi'] == "10.1234/5678" + assert obj.get('id') != None + + rv = app.get('/v0/release/lookup', + data=json.dumps(dict(doi="10.1234/5678_noexit")), + headers={"content-type": "application/json"}) + assert rv.status_code == 404 + + rv = app.get('/v0/release/lookup', + data=json.dumps(dict(doi="not_even_valid_doi")), + headers={"content-type": "application/json"}) + assert rv.status_code == 400 + +def test_api_creator_lookup(rich_app): + app = rich_app + + rv = app.get('/v0/creator/1', + headers={"content-type": "application/json"}) + assert rv.status_code == 200 + obj = json.loads(rv.data.decode('utf-8')) + + rv = app.get('/v0/creator/lookup', + data=json.dumps(dict(orcid="0000-0002-1825-0097")), + headers={"content-type": "application/json"}) + assert rv.status_code == 200 + obj = json.loads(rv.data.decode('utf-8')) + assert obj['orcid'] == "0000-0002-1825-0097" + assert obj.get('id') != None + + rv = app.get('/v0/creator/lookup', + data=json.dumps(dict(orcid="0000-0002-1825-0098")), + headers={"content-type": "application/json"}) + assert rv.status_code == 404 + + rv = app.get('/v0/creator/lookup', + data=json.dumps(dict(orcid="not_even_valid_orcid")), + headers={"content-type": "application/json"}) + assert rv.status_code == 400 + + +def test_api_container_lookup(rich_app): + app = rich_app + + rv = app.get('/v0/container/1', + headers={"content-type": "application/json"}) + assert rv.status_code == 200 + obj = json.loads(rv.data.decode('utf-8')) + + rv = app.get('/v0/container/lookup', + data=json.dumps(dict(issn="2222-3333")), + headers={"content-type": "application/json"}) + assert rv.status_code == 200 + obj = json.loads(rv.data.decode('utf-8')) + assert obj['issn'] == "2222-3333" + assert obj.get('id') != None + + rv = app.get('/v0/container/lookup', + data=json.dumps(dict(issn="2222-3334")), + headers={"content-type": "application/json"}) + assert rv.status_code == 404 + + rv = app.get('/v0/container/lookup', + data=json.dumps(dict(issn="not_even_valid_issn")), + headers={"content-type": "application/json"}) + assert rv.status_code == 400 + +def test_api_editor_get(rich_app): + app = rich_app + + rv = app.get('/v0/editor/admin', + headers={"content-type": "application/json"}) + assert rv.status_code == 200 + obj = json.loads(rv.data.decode('utf-8')) + print(obj) + assert obj['username'] == "admin" + assert obj['id'] == 1 + +def test_api_editor_changelog(rich_app): + app = rich_app + + rv = app.get('/v0/editor/admin/changelog', + headers={"content-type": "application/json"}) + assert rv.status_code == 200 + obj = json.loads(rv.data.decode('utf-8')) + print(obj) + assert len(obj) == 1 -- cgit v1.2.3