Skip to content

Commit

Permalink
legacy: add extra formats stub endpoints
Browse files Browse the repository at this point in the history
  • Loading branch information
slint committed Jun 20, 2023
1 parent aeb7b18 commit 47f0fc5
Show file tree
Hide file tree
Showing 4 changed files with 147 additions and 8 deletions.
3 changes: 2 additions & 1 deletion site/setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ invenio_base.api_apps =
zenodo_rdm_legacy = zenodo_rdm.legacy.ext:ZenodoLegacy
invenio_base.api_blueprints =
zenodo_rdm_legacy = zenodo_rdm.legacy.views:blueprint
zenodo_rdm_legacy_stub = zenodo_rdm.legacy.views:stub_blueprint
zenodo_rdm_legacy_records = zenodo_rdm.legacy.views:create_legacy_records_bp
zenodo_rdm_legacy_draft_files = zenodo_rdm.legacy.views:create_draft_files_bp

Expand Down Expand Up @@ -79,4 +80,4 @@ profile=black
[tool:pytest]
addopts = --black --isort --pydocstyle --doctest-glob="*.rst" --doctest-modules --cov=zenodo_rdm --cov-report=term-missing
testpaths = tests zenodo_rdm
live_server_scope = module
live_server_scope = module
6 changes: 0 additions & 6 deletions site/tests/legacy/deposits/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -213,9 +213,3 @@ def expected_record_metadata():
title="Test title",
upload_type="publication",
)


@pytest.fixture
def deposit_url():
"""Deposit API URL."""
return f"/api{LegacyRecordResourceConfig.url_prefix}"
63 changes: 63 additions & 0 deletions site/tests/legacy/test_stubs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# -*- coding: utf-8 -*-
#
# Copyright (C) 2023 CERN.
#
# Zenodo-RDM is free software; you can redistribute it and/or modify
# it under the terms of the MIT License; see LICENSE file for more details.
"""Test stub REST API endpoints."""


def test_extra_formats(
test_app,
client,
):
"""Test extra formats stub endpoints."""
mimetype = "application/custom+xml"
deposit_url = "/api/deposit/depositions/1234/formats"
record_url = "/api/records/1234/formats"

# GET /api/deposit/depositions/{:id}/formats
res = client.get(deposit_url, headers={"Accept": mimetype})
assert res.status_code == 200
assert res.json == {"message": f'Dummy content for "{mimetype}".'}

res = client.get(deposit_url, query_string={"mimetype": mimetype})
assert res.status_code == 200
assert res.json == {"message": f'Dummy content for "{mimetype}".'}

res = client.get(deposit_url)
assert res.status_code == 400
assert res.json == {"message": "Invalid extra format MIMEType.", "status": 400}

# PUT /api/deposit/depositions/{:id}/formats
res = client.put(deposit_url, headers={"Content-Type": mimetype})
assert res.status_code == 200
assert res.json == {"message": f'Extra format "{mimetype}" updated.'}

# DELETE /api/deposit/depositions/{:id}/formats
res = client.delete(deposit_url, headers={"Content-Type": mimetype})
assert res.status_code == 200
assert res.json == {"message": f'Extra format "{mimetype}" deleted.'}

# OPTIONS /api/deposit/depositions/{:id}/formats
res = client.options(deposit_url)
assert res.status_code == 200
assert res.json == []

# GET /api/records/{:id}/formats
res = client.get(record_url, headers={"Accept": mimetype})
assert res.status_code == 200
assert res.json == {"message": f'Dummy content for "{mimetype}".'}

res = client.get(record_url, query_string={"mimetype": mimetype})
assert res.status_code == 200
assert res.json == {"message": f'Dummy content for "{mimetype}".'}

res = client.get(record_url)
assert res.status_code == 400
assert res.json == {"message": "Invalid extra format MIMEType.", "status": 400}

# OPTIONS /api/records/{:id}/formats
res = client.options(record_url)
assert res.status_code == 200
assert res.json == []
83 changes: 82 additions & 1 deletion site/zenodo_rdm/legacy/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@

"""Zenodo legacy views."""

from flask import Blueprint
from functools import wraps

from flask import Blueprint, Flask, abort, jsonify, request
from flask.views import MethodView

blueprint = Blueprint("zenodo_rdm_legacy", __name__)

Expand All @@ -34,3 +37,81 @@ def create_draft_files_bp(app):
"""Create legacy draft files blueprint."""
ext = app.extensions["zenodo-rdm-legacy"]
return ext.legacy_draft_files_resource.as_blueprint()


#
# Legacy REST API Stubs
#
stub_blueprint = Blueprint("zenodo_rdm_legacy_stub", __name__)


def pass_extra_formats_mimetype(
from_query_string=None, from_content_type=None, from_accept=None
):
"""Decorator to validate the request's extra formats MIMEType."""
assert from_content_type or from_accept or from_query_string

def decorator(f):
@wraps(f)
def inner(*args, **kwargs):
mimetype = None
if from_query_string:
mimetype = request.args.get("mimetype")
if not mimetype and from_content_type:
mimetype = request.headers.get("Content-Type")
if not mimetype and from_accept:
mimetype = next((m for m, _ in request.accept_mimetypes), None)
if not mimetype:
return abort(400, "Invalid extra format MIMEType.")
return f(*args, mimetype=mimetype, **kwargs)

return inner

return decorator


class StubDepositExtraFormatsResource(MethodView):
"""Deposit extra formats resource."""

@pass_extra_formats_mimetype(from_query_string=True, from_accept=True)
def get(self, pid_value, mimetype=None):
"""Get an extra format."""
return {"message": f'Dummy content for "{mimetype}".'}

@pass_extra_formats_mimetype(from_content_type=True)
def put(self, pid_value, mimetype=None):
"""Create or replace an extra format."""
return {"message": f'Extra format "{mimetype}" updated.'}

@pass_extra_formats_mimetype(from_content_type=True)
def delete(self, pid_value, mimetype=None):
"""Delete an extra format."""
return {"message": f'Extra format "{mimetype}" deleted.'}

def options(self, pid_value):
"""Get a list of all extra formats."""
return jsonify([])


class StubRecordExtraFormatsResource(MethodView):
"""Record extra formats resource."""

@pass_extra_formats_mimetype(from_query_string=True, from_accept=True)
def get(self, pid_value, mimetype=None):
"""Get extra format."""
return {"message": f'Dummy content for "{mimetype}".'}

def options(self, pid_value):
"""Get available extra formats."""
return jsonify([])


stub_blueprint.add_url_rule(
"/deposit/depositions/<pid_value>/formats",
view_func=StubDepositExtraFormatsResource.as_view("draft_extra_formats_stub"),
)

stub_blueprint.add_url_rule(
"/records/<pid_value>/formats",
view_func=StubRecordExtraFormatsResource.as_view("record_extra_formats_stub"),
)

0 comments on commit 47f0fc5

Please sign in to comment.