diff options
-rw-r--r-- | python/tests/subentity_state.py | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/python/tests/subentity_state.py b/python/tests/subentity_state.py new file mode 100644 index 00000000..74fce208 --- /dev/null +++ b/python/tests/subentity_state.py @@ -0,0 +1,224 @@ + +import json +import pytest +from copy import copy + +from fatcat_client import * +from fatcat_client.rest import ApiException +from fixtures import * + +""" +This file has API and webface tests for when an entity references another +entity which is deleted/redirected/wip. For example, a release points to a +container (via container_id) which is deleted. + +Current set of such references: + + => release -> collection + => release -> creator + => release -> file + => file -> release + => release -> work + => work -> release +""" + +def test_relation_stats(api, app): + + j1 = ContainerEntity(name="test journal") + j2 = ContainerEntity(name="another test journal") + c1 = CreatorEntity(display_name="test person") + r1 = ReleaseEntity(title="test article") + r2 = ReleaseEntity(title="another test article") + f1 = FileEntity(md5="c60f5b093ef5e6caad9d7b45268be409") + f2 = FileEntity(md5="0000000000000000ad9d7b45268be409") + + # WIP container + eg = quick_eg(api) + j2 = api.get_container(api.create_container(j2, editgroup=eg.id).ident) + rv = app.get('/container/{}'.format(j2.ident)) + assert rv.status_code == 200 + + # create inter-related entities + eg = quick_eg(api) + j1 = api.get_container(api.create_container(j1, editgroup=eg.id).ident) + c1 = api.get_creator(api.create_creator(c1, editgroup=eg.id).ident) + r1.container_id = j1.ident + r1.contribs = [ReleaseContrib(creator_id=c1.ident)] + r1 = api.get_release(api.create_release(r1, editgroup=eg.id).ident) + r2 = api.get_release(api.create_release(r2, editgroup=eg.id).ident) + f1.releases = [r1.ident] + f1 = api.get_file(api.create_file(f1, editgroup=eg.id).ident) + api.accept_editgroup(eg.id) + + r1 = api.get_release(r1.ident, expand="container,creators,files") + assert r1.container.name == "test journal" + assert r1.files[0].md5 == "c60f5b093ef5e6caad9d7b45268be409" + assert r1.contribs[0].creator_id == c1.ident + assert r1.contribs[0].creator.display_name == "test person" + assert r1.contribs[0].creator.state == "active" + rv = app.get('/release/{}'.format(r1.ident)) + assert rv.status_code == 200 + + # delete creator + eg = quick_eg(api) + api.delete_creator(c1.ident, editgroup=eg.id) + api.accept_editgroup(eg.id) + rv = app.get('/creator/{}'.format(c1.ident)) + assert rv.status_code == 200 # TODO: HTTP status "Gone"? + + c1_deleted = api.get_creator(c1.ident) + assert c1_deleted.state == "deleted" + assert c1_deleted.display_name is None + + r1 = api.get_release(r1.ident, expand="container,creators,files") + assert r1.container.name == "test journal" + assert r1.files[0].md5 == "c60f5b093ef5e6caad9d7b45268be409" + assert r1.contribs[0].creator_id == c1.ident + assert r1.contribs[0].creator.display_name is None + assert r1.contribs[0].creator.state == "deleted" + rv = app.get('/release/{}'.format(r1.ident)) + assert rv.status_code == 200 + + # wip container + eg = quick_eg(api) + r1.container_id = j2.ident + api.update_release(r1.ident, r1, editgroup=eg.id) + api.accept_editgroup(eg.id) + + r1 = api.get_release(r1.ident, expand="container,creators,files") + assert r1.container_id == j2.ident + assert r1.container.name == "another test journal" + assert r1.container.state == "wip" + assert r1.files[0].md5 == "c60f5b093ef5e6caad9d7b45268be409" + assert r1.contribs[0].creator_id == c1.ident + assert r1.contribs[0].creator.display_name is None + assert r1.contribs[0].creator.state == "deleted" + rv = app.get('/release/{}'.format(r1.ident)) + assert rv.status_code == 200 + + # redirect release + r2 = api.get_release(r2.ident, expand="container,creators,files") + assert r2.files == [] + eg = quick_eg(api) + api.update_release(r2.ident, ReleaseEntity(redirect=r1.ident), editgroup=eg.id) + f2.releases = [r2.ident] + f2 = api.get_file(api.create_file(f2, editgroup=eg.id).ident) + api.accept_editgroup(eg.id) + r2 = api.get_release(r2.ident, expand="container,creators,files") + assert r2.container_id == j2.ident + assert r2.container.name == "another test journal" + assert r2.container.state == "wip" + # fetching for *target*; tricky! + assert r2.files[0].md5 == "c60f5b093ef5e6caad9d7b45268be409" + assert r2.contribs[0].creator_id == c1.ident + assert r2.contribs[0].creator.display_name is None + assert r2.contribs[0].creator.state == "deleted" + rv = app.get('/release/{}'.format(r2.ident)) + assert rv.status_code == 302 + rv = app.get('/file/{}'.format(f2.ident)) + assert rv.status_code == 200 + + # delete release + eg = quick_eg(api) + api.delete_release(r2.ident, editgroup=eg.id) + api.accept_editgroup(eg.id) + r2 = api.get_release(r2.ident, expand="container,creators,files") + assert r2.container_id is None + assert r2.container is None + assert r2.files is None + assert r2.contribs is None + rv = app.get('/release/{}'.format(r2.ident)) + assert rv.status_code == 200 # TODO: HTTP Gone? + rv = app.get('/file/{}'.format(f2.ident)) + print(rv.data) + assert rv.status_code == 200 + + +def test_app_entity_states(api, app): + + j1 = ContainerEntity(name="test journal") + j2 = ContainerEntity(name="another test journal") + c1 = CreatorEntity(display_name="test person") + c2 = CreatorEntity(display_name="another test person") + r1 = ReleaseEntity(title="test article") + r2 = ReleaseEntity(title="another test article") + f1 = FileEntity(md5="c60f5b093ef5e6caad9d7b45268be409") + f2 = FileEntity(md5="0000000000000000ad9d7b45268be409") + + # create inter-related entities + eg = quick_eg(api) + j1 = api.get_container(api.create_container(j1, editgroup=eg.id).ident) + j2 = api.get_container(api.create_container(j2, editgroup=eg.id).ident) + c1 = api.get_creator(api.create_creator(c1, editgroup=eg.id).ident) + c2 = api.get_creator(api.create_creator(c2, editgroup=eg.id).ident) + r1.container_id = j1.ident + r1.contribs = [ReleaseContrib(creator_id=c1.ident)] + r1 = api.get_release(api.create_release(r1, editgroup=eg.id).ident) + r2 = api.get_release(api.create_release(r2, editgroup=eg.id).ident) + f1.releases = [r1.ident] + f1 = api.get_file(api.create_file(f1, editgroup=eg.id).ident) + f2 = api.get_file(api.create_file(f2, editgroup=eg.id).ident) + api.accept_editgroup(eg.id) + + # create redirects + eg = quick_eg(api) + api.update_container(j2.ident, ContainerEntity(redirect=j1.ident), editgroup=eg.id) + api.update_creator(c2.ident, CreatorEntity(redirect=c1.ident), editgroup=eg.id) + api.update_file(f2.ident, FileEntity(redirect=f1.ident), editgroup=eg.id) + api.update_release(r2.ident, ReleaseEntity(redirect=r1.ident), editgroup=eg.id) + api.update_work(r2.work_id, WorkEntity(redirect=r1.work_id), editgroup=eg.id) + api.accept_editgroup(eg.id) + + # all entities + rv = app.get('/container/{}'.format(j1.ident)) + assert rv.status_code == 200 + rv = app.get('/container/{}'.format(j2.ident)) + assert rv.status_code == 302 + rv = app.get('/creator/{}'.format(c1.ident)) + assert rv.status_code == 200 + rv = app.get('/creator/{}'.format(c2.ident)) + assert rv.status_code == 302 + rv = app.get('/file/{}'.format(f1.ident)) + assert rv.status_code == 200 + rv = app.get('/file/{}'.format(f2.ident)) + assert rv.status_code == 302 + rv = app.get('/release/{}'.format(r1.ident)) + assert rv.status_code == 200 + rv = app.get('/release/{}'.format(r2.ident)) + assert rv.status_code == 302 + rv = app.get('/work/{}'.format(r1.work_id)) + assert rv.status_code == 200 + rv = app.get('/work/{}'.format(r2.work_id)) + assert rv.status_code == 302 + + # delete targets + eg = quick_eg(api) + api.delete_container(j1.ident, editgroup=eg.id) + api.delete_creator(c1.ident, editgroup=eg.id) + api.delete_file(f1.ident, editgroup=eg.id) + api.delete_release(r1.ident, editgroup=eg.id) + api.delete_work(r1.work_id, editgroup=eg.id) + api.accept_editgroup(eg.id) + + # all entities + rv = app.get('/container/{}'.format(j1.ident)) + assert rv.status_code == 200 + rv = app.get('/container/{}'.format(j2.ident)) + assert rv.status_code == 302 + rv = app.get('/creator/{}'.format(c1.ident)) + assert rv.status_code == 200 + rv = app.get('/creator/{}'.format(c2.ident)) + assert rv.status_code == 302 + rv = app.get('/file/{}'.format(f1.ident)) + assert rv.status_code == 200 + rv = app.get('/file/{}'.format(f2.ident)) + assert rv.status_code == 302 + rv = app.get('/release/{}'.format(r1.ident)) + assert rv.status_code == 200 + rv = app.get('/release/{}'.format(r2.ident)) + assert rv.status_code == 302 + rv = app.get('/work/{}'.format(r1.work_id)) + assert rv.status_code == 200 + rv = app.get('/work/{}'.format(r2.work_id)) + assert rv.status_code == 302 + |