Skip to content

Commit

Permalink
test: add respx mock route for /repository{id} endpoint (#114)
Browse files Browse the repository at this point in the history
Fixes #112
  • Loading branch information
afuetterer committed Jun 3, 2024
1 parent b0468f8 commit 4400ca0
Show file tree
Hide file tree
Showing 5 changed files with 198 additions and 108 deletions.
1 change: 1 addition & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ repos:
hooks:
- id: typos
args: [--force-exclude]
exclude: tests/conftest

- repo: https://github.com/FHPythonUtils/LicenseCheck/
rev: b2b50f4d40c95b15478279a7a00553a1dc2925ef # frozen: 2024.2
Expand Down
87 changes: 0 additions & 87 deletions tests/cassettes/repository.yaml
Original file line number Diff line number Diff line change
@@ -1,91 +1,4 @@
interactions:
- request:
body: ''
headers:
accept:
- text/xml; charset=utf-8
accept-encoding:
- gzip, deflate
connection:
- keep-alive
host:
- www.re3data.org
user-agent:
- python-re3data/0.1.0
method: GET
uri: https://www.re3data.org/api/beta/repository/r3d100010468
response:
body:
string: !!binary |
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
g7rrp0RvgF5U4dBs/qxGbEfn4D9yCaEjmSsAAA==
headers:
Cache-Control:
- no-cache, private
Connection:
- Keep-Alive
Content-Encoding:
- gzip
Content-Length:
- '2536'
Content-Type:
- text/xml; charset=UTF-8
Date:
- Tue, 21 May 2024 13:55:12 GMT
Keep-Alive:
- timeout=5, max=100
Link:
- /api/beta/repositories; rel="index"
Server:
- Apache/2.4.41 (Ubuntu)
Vary:
- Accept-Encoding
status:
code: 200
message: OK
- request:
body: ''
headers:
Expand Down
184 changes: 184 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,3 +60,187 @@ def mock_repository_list_route(respx_mock: MockRouter) -> Route:
return respx_mock.get("https://www.re3data.org/api/beta/repositories").mock(
return_value=httpx.Response(httpx.codes.OK, text=REPOSITORY_LIST_XML)
)


REPOSITORY_GET_XML: str = """<?xml version="1.0" encoding="utf-8"?>
<!--re3data.org Schema for the Description of Research
Data Repositories. Version 2.2, December 2014. doi:10.2312/re3.006-->
<r3d:re3data xmlns:r3d="http://www.re3data.org/schema/2-2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.re3data.org/schema/2-2 http://schema.re3data.org/2-2/re3dataV2-2.xsd">
<r3d:repository>
<r3d:re3data.orgIdentifier>r3d100010468</r3d:re3data.orgIdentifier>
<r3d:repositoryName language="eng">Zenodo</r3d:repositoryName>
<r3d:repositoryURL>https://zenodo.org/</r3d:repositoryURL>
<r3d:repositoryIdentifier>FAIRsharing_doi:10.25504/FAIRsharing.wy4egf</r3d:repositoryIdentifier>
<r3d:repositoryIdentifier>RRID:SCR_004129</r3d:repositoryIdentifier>
<r3d:repositoryIdentifier>RRID:nlx_158614</r3d:repositoryIdentifier>
<r3d:description language="eng">ZENODO builds and operates a simple and innovative service that
enables researchers, scientists, EU projects and institutions to share and showcase
multidisciplinary research results (data and publications) that are not part of the existing
institutional or subject-based repositories of the research communities.
ZENODO enables researchers, scientists, EU projects and institutions to:
easily share the long tail of small research results in a wide variety of formats including
text, spreadsheets, audio, video, and images across all fields of science.
display their research results and get credited by making the research results citable and
integrate them into existing reporting lines to funding agencies like the European Commission.
easily access and reuse shared research results.</r3d:description>
<r3d:repositoryContact>https://zenodo.org/contact</r3d:repositoryContact>
<r3d:repositoryContact>[email protected]</r3d:repositoryContact>
<r3d:type>other</r3d:type>
<r3d:size updated="2023-04-26">2.916.709 results</r3d:size>
<r3d:startDate>2013-05-08</r3d:startDate>
<r3d:endDate></r3d:endDate>
<r3d:repositoryLanguage>eng</r3d:repositoryLanguage>
<r3d:subject subjectScheme="DFG">1 Humanities and Social Sciences</r3d:subject>
<r3d:subject subjectScheme="DFG">2 Life Sciences</r3d:subject>
<r3d:subject subjectScheme="DFG">3 Natural Sciences</r3d:subject>
<r3d:subject subjectScheme="DFG">4 Engineering Sciences</r3d:subject>
<r3d:missionStatementURL>https://about.zenodo.org/</r3d:missionStatementURL>
<r3d:contentType contentTypeScheme="parse">Archived data</r3d:contentType>
<r3d:contentType contentTypeScheme="parse">Audiovisual data</r3d:contentType>
<r3d:contentType contentTypeScheme="parse">Images</r3d:contentType>
<r3d:contentType contentTypeScheme="parse">Networkbased data</r3d:contentType>
<r3d:contentType contentTypeScheme="parse">Plain text</r3d:contentType>
<r3d:contentType contentTypeScheme="parse">Raw data</r3d:contentType>
<r3d:contentType contentTypeScheme="parse">Scientific and statistical data formats</r3d:contentType>
<r3d:contentType contentTypeScheme="parse">Source code</r3d:contentType>
<r3d:contentType contentTypeScheme="parse">Standard office documents</r3d:contentType>
<r3d:contentType contentTypeScheme="parse">Structured graphics</r3d:contentType>
<r3d:contentType contentTypeScheme="parse">Structured text</r3d:contentType>
<r3d:contentType contentTypeScheme="parse">other</r3d:contentType>
<r3d:providerType>dataProvider</r3d:providerType>
<r3d:keyword>FAIR</r3d:keyword>
<r3d:keyword>multidisciplinary</r3d:keyword>
<r3d:institution>
<r3d:institutionName language="eng">European Commission, Horizon 2020</r3d:institutionName>
<r3d:institutionCountry>EEC</r3d:institutionCountry>
<r3d:responsibilityType>funding</r3d:responsibilityType>
<r3d:institutionType>non-profit</r3d:institutionType>
<r3d:institutionURL>
https://research-and-innovation.ec.europa.eu/funding/funding-opportunities/funding-programmes-and-open-calls/horizon-2020_en</r3d:institutionURL>
<r3d:responsibilityStartDate>2014</r3d:responsibilityStartDate>
<r3d:responsibilityEndDate>2020</r3d:responsibilityEndDate>
<r3d:institutionContact>https://research-and-innovation.ec.europa.eu/contact-us_en</r3d:institutionContact>
</r3d:institution>
<r3d:institution>
<r3d:institutionName language="eng">European Commission, Research &amp; Innovation, Seventh Framework Programm - FP7</r3d:institutionName>
<r3d:institutionAdditionalName language="eng">FP7</r3d:institutionAdditionalName>
<r3d:institutionCountry>EEC</r3d:institutionCountry>
<r3d:responsibilityType>funding</r3d:responsibilityType>
<r3d:institutionType>non-profit</r3d:institutionType>
<r3d:institutionURL>https://commission.europa.eu/research-and-innovation_en</r3d:institutionURL>
<r3d:responsibilityStartDate></r3d:responsibilityStartDate>
<r3d:responsibilityEndDate></r3d:responsibilityEndDate>
<r3d:institutionContact>https://research-and-innovation.ec.europa.eu/contact-us_en</r3d:institutionContact>
</r3d:institution>
<r3d:institution>
<r3d:institutionName language="eng">European Organization for Nuclear Research</r3d:institutionName>
<r3d:institutionAdditionalName language="fra">CERN</r3d:institutionAdditionalName>
<r3d:institutionAdditionalName language="fra">Centre Européen pour la Recherche Nucléaire</r3d:institutionAdditionalName>
<r3d:institutionCountry>EEC</r3d:institutionCountry>
<r3d:responsibilityType>funding</r3d:responsibilityType>
<r3d:responsibilityType>general</r3d:responsibilityType>
<r3d:responsibilityType>technical</r3d:responsibilityType>
<r3d:institutionType>non-profit</r3d:institutionType>
<r3d:institutionURL>https://home.cern/</r3d:institutionURL>
<r3d:institutionIdentifier>ROR:01ggx4157</r3d:institutionIdentifier>
<r3d:responsibilityStartDate></r3d:responsibilityStartDate>
<r3d:responsibilityEndDate></r3d:responsibilityEndDate>
<r3d:institutionContact>https://about.zenodo.org/contact/</r3d:institutionContact>
</r3d:institution>
<r3d:institution>
<r3d:institutionName language="eng">OpenAIRE</r3d:institutionName>
<r3d:institutionAdditionalName language="eng">Open Access Infrastructure for Research in Europa</r3d:institutionAdditionalName>
<r3d:institutionCountry>EEC</r3d:institutionCountry>
<r3d:responsibilityType>funding</r3d:responsibilityType>
<r3d:responsibilityType>general</r3d:responsibilityType>
<r3d:institutionType>non-profit</r3d:institutionType>
<r3d:institutionURL>https://www.openaire.eu/</r3d:institutionURL>
<r3d:institutionIdentifier>ROR:019kf3481</r3d:institutionIdentifier>
<r3d:institutionIdentifier>RRID:SCR_013740</r3d:institutionIdentifier>
<r3d:responsibilityStartDate></r3d:responsibilityStartDate>
<r3d:responsibilityEndDate></r3d:responsibilityEndDate>
<r3d:institutionContact>https://www.openaire.eu/contact-us</r3d:institutionContact>
</r3d:institution>
<r3d:policy>
<r3d:policyName>Policies</r3d:policyName>
<r3d:policyURL>https://about.zenodo.org/policies/</r3d:policyURL>
</r3d:policy>
<r3d:policy>
<r3d:policyName>Terms of use</r3d:policyName>
<r3d:policyURL>https://about.zenodo.org/terms/</r3d:policyURL>
</r3d:policy>
<r3d:databaseAccess>
<r3d:databaseAccessType>open</r3d:databaseAccessType>
</r3d:databaseAccess>
<r3d:databaseLicense>
<r3d:databaseLicenseName>CC0</r3d:databaseLicenseName>
<r3d:databaseLicenseURL>https://creativecommons.org/publicdomain/zero/1.0/</r3d:databaseLicenseURL>
</r3d:databaseLicense>
<r3d:dataAccess>
<r3d:dataAccessType>closed</r3d:dataAccessType>
</r3d:dataAccess>
<r3d:dataAccess>
<r3d:dataAccessType>embargoed</r3d:dataAccessType>
</r3d:dataAccess>
<r3d:dataAccess>
<r3d:dataAccessType>open</r3d:dataAccessType>
</r3d:dataAccess>
<r3d:dataAccess>
<r3d:dataAccessType>restricted</r3d:dataAccessType>
<r3d:dataAccessRestriction>registration</r3d:dataAccessRestriction>
</r3d:dataAccess>
<r3d:dataLicense>
<r3d:dataLicenseName>CC</r3d:dataLicenseName>
<r3d:dataLicenseURL>https://creativecommons.org/</r3d:dataLicenseURL>
</r3d:dataLicense>
<r3d:dataLicense>
<r3d:dataLicenseName>CC0</r3d:dataLicenseName>
<r3d:dataLicenseURL>https://creativecommons.org/publicdomain/zero/1.0/</r3d:dataLicenseURL>
</r3d:dataLicense>
<r3d:dataLicense>
<r3d:dataLicenseName>other</r3d:dataLicenseName>
<r3d:dataLicenseURL>https://about.zenodo.org/policies/</r3d:dataLicenseURL>
</r3d:dataLicense>
<r3d:dataUpload>
<r3d:dataUploadType>restricted</r3d:dataUploadType>
<r3d:dataUploadRestriction>registration</r3d:dataUploadRestriction>
</r3d:dataUpload>
<r3d:dataUploadLicense>
<r3d:dataUploadLicenseName>Policies</r3d:dataUploadLicenseName>
<r3d:dataUploadLicenseURL>https://about.zenodo.org/policies/</r3d:dataUploadLicenseURL>
</r3d:dataUploadLicense>
<r3d:software>
<r3d:softwareName>other</r3d:softwareName>
</r3d:software>
<r3d:versioning>yes</r3d:versioning>
<r3d:api apiType="OAI-PMH">https://zenodo.org/oai2d</r3d:api>
<r3d:api apiType="REST">https://developers.zenodo.org/</r3d:api>
<r3d:pidSystem>DOI</r3d:pidSystem>
<r3d:citationGuidelineURL>https://about.zenodo.org/</r3d:citationGuidelineURL>
<r3d:aidSystem>ORCID</r3d:aidSystem>
<r3d:enhancedPublication>yes</r3d:enhancedPublication>
<r3d:qualityManagement>no</r3d:qualityManagement>
<r3d:metadataStandard>
<r3d:metadataStandardName metadataStandardScheme="DCC">DataCite Metadata Schema</r3d:metadataStandardName>
<r3d:metadataStandardURL>
http://www.dcc.ac.uk/resources/metadata-standards/datacite-metadata-schema</r3d:metadataStandardURL>
</r3d:metadataStandard>
<r3d:metadataStandard>
<r3d:metadataStandardName metadataStandardScheme="DCC">Dublin Core</r3d:metadataStandardName>
<r3d:metadataStandardURL>http://www.dcc.ac.uk/resources/metadata-standards/dublin-core</r3d:metadataStandardURL>
</r3d:metadataStandard>
<r3d:remarks>Zenodo is covered by Thomson Reuters Data Citation Index. Zenodo uses Altmetric metrics and provides impact information in the form of software citations (15.01.2019). Zenodo uses invenio repository software. OpenAIRE Orphan Record Repository got a make-over and was re-branded as ZENODO. Zenodo uses Invenio repository software. ZENODO was launched within the OpenAIREplus project as part of a European-wide research infrastructure. Easy upload and semi-automatic metadata completion by communication with existing online services such as DropBox for upload, Mendeley/ORCID/CrossRef/OpenAIRE for upload and pre-filling metadata.</r3d:remarks>
<r3d:entryDate>2013-06-13</r3d:entryDate>
<r3d:lastUpdate>2023-04-26</r3d:lastUpdate>
</r3d:repository>
</r3d:re3data>
"""


@pytest.fixture()
def mock_repository_get_route(respx_mock: MockRouter) -> Route:
return respx_mock.get("https://www.re3data.org/api/beta/repository/r3d100010468").mock(
return_value=httpx.Response(httpx.codes.OK, text=REPOSITORY_GET_XML)
)
16 changes: 5 additions & 11 deletions tests/integration/test_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,34 +99,28 @@ def test_repository_get_without_repository_id(mock_repository_list_route: Route)
assert "Missing argument" in result.output


@pytest.mark.default_cassette("repository.yaml")
@pytest.mark.vcr()
def test_repository_get_with_repository_id_default_return_type(zenodo_id: str) -> None:
def test_repository_get_with_repository_id_default_return_type(
mock_repository_get_route: Route, zenodo_id: str
) -> None:
result = runner.invoke(app, ["repository", "get", zenodo_id])
assert result.exit_code == 0
assert "<r3d:repository>" in result.output
assert "<r3d:re3data.orgIdentifier>r3d100010468" in result.output


@pytest.mark.default_cassette("repository.yaml")
@pytest.mark.vcr()
def test_repository_get_with_repository_id_xml(zenodo_id: str) -> None:
def test_repository_get_with_repository_id_xml(mock_repository_get_route: Route, zenodo_id: str) -> None:
result = runner.invoke(app, ["repository", "get", zenodo_id, "--return-type", "xml"])
assert result.exit_code == 0
assert "<r3d:repository>" in result.output
assert "<r3d:re3data.orgIdentifier>r3d100010468" in result.output


@pytest.mark.default_cassette("repository.yaml")
@pytest.mark.vcr()
def test_repository_get_with_repository_id_response(zenodo_id: str) -> None:
def test_repository_get_with_repository_id_response(mock_repository_get_route: Route, zenodo_id: str) -> None:
result = runner.invoke(app, ["repository", "get", zenodo_id, "--return-type", "response"])
assert result.exit_code == 0
assert "<Response [200 OK]>" in result.output


@pytest.mark.default_cassette("repository.yaml")
@pytest.mark.vcr()
def test_repository_get_with_repository_id_invalid_return_type(zenodo_id: str) -> None:
result = runner.invoke(app, ["repository", "get", zenodo_id, "--return-type", "json"])
assert result.exit_code == 2
Expand Down
Loading

0 comments on commit 4400ca0

Please sign in to comment.