Skip to content

Commit b2adaf7

Browse files
committed
chore: mock tests to succeed if envidat is unavailable
1 parent 21baf9d commit b2adaf7

File tree

6 files changed

+72
-16
lines changed

6 files changed

+72
-16
lines changed

components/renku_data_services/data_connectors/core.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -478,9 +478,19 @@ async def convert_envidat_v1_data_connector_to_s3(
478478
config = payload.configuration
479479
doi = config.get("doi")
480480
if not isinstance(doi, str):
481-
raise errors.ValidationError()
481+
if doi is None:
482+
raise errors.ValidationError(
483+
message="Cannot get configuration for Envidat data connector because "
484+
"the doi is missing from the payload."
485+
)
486+
raise errors.ValidationError(
487+
message=f"Cannot get configuration for Envidat data connector because the doi '{doi}' "
488+
"in the payload is not a string."
489+
)
482490
if len(doi) == 0:
483-
raise errors.ValidationError()
491+
raise errors.ValidationError(
492+
message="Cannot get configuration for Envidat data connector because the doi is a string with zero length."
493+
)
484494
doi = DOI(doi)
485495

486496
new_config = payload.model_copy(deep=True)
@@ -494,7 +504,11 @@ async def convert_envidat_v1_data_connector_to_s3(
494504
async with clnt:
495505
res = await clnt.get(envidat_url, params=query_params, headers=headers)
496506
if res.status_code != 200:
497-
raise errors.ProgrammingError()
507+
raise errors.ValidationError(
508+
message="Cannot get configuration for Envidat data connector because Envidat responded "
509+
f"with an unexpected {res.status_code} status code at {res.url}.",
510+
detail=f"Response from envidat: {res.text}",
511+
)
498512
dataset = SchemaOrgDataset.model_validate_json(res.text)
499513
s3_config = schema_org.get_rclone_config(
500514
dataset,

components/renku_data_services/data_connectors/doi/schema_org.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from dataclasses import dataclass
44
from enum import StrEnum
5+
from pathlib import PurePosixPath
56
from urllib.parse import parse_qs, urlparse
67

78
from renku_data_services.data_connectors.doi.models import SchemaOrgDataset
@@ -25,7 +26,8 @@ class S3Config:
2526
@property
2627
def path(self) -> str:
2728
"""Return the path including the bucket name and the prefix."""
28-
return f"/{self.bucket}{self.prefix}"
29+
# NOTE: PurePosixPath("/test") / "/subfolder" == /subfolder, so we still have to strip /
30+
return (PurePosixPath("/") / PurePosixPath(self.bucket) / self.prefix.lstrip("/")).as_posix()
2931

3032

3133
def get_rclone_config(dataset: SchemaOrgDataset, provider: DatasetProvider) -> S3Config:

components/renku_data_services/storage/rclone_patches.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -354,9 +354,6 @@ def apply_patches(spec: list[dict[str, Any]]) -> None:
354354
__patch_schema_remove_oauth_propeties,
355355
__patch_polybox_storage,
356356
__patch_switchdrive_storage,
357-
# __add_custom_doi_s3_provider("Envidat", "Envidat data provider", ENVIDAT_V1_PROVIDER),
358-
# TODO: Enable Scicat when it is ready in production
359-
# __add_custom_doi_s3_provider("SciCat", "SciCat data provider", SCICAT_V1_PROVIDER),
360357
__patch_schema_remove_banned_sftp_options,
361358
__patch_schema_add_openbis_type,
362359
]

test/bases/renku_data_services/data_api/test_data_connectors.py

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2480,7 +2480,40 @@ async def _mock(*args, **kwargs) -> DOIMetadata | None:
24802480
)
24812481

24822482

2483-
async def test_validate_envidat_data_connector() -> None:
2483+
def _mock_get_envidat_metadata(metadata: DOIMetadata, sanic_client: SanicASGITestClient, monkeypatch: "MonkeyPatch"):
2484+
"""Mock the _get_envidat_metadata method."""
2485+
2486+
# The Evnidat API may be unresponsive, so we mock its response
2487+
from renku_data_services.data_connectors.doi import metadata as metadata_mod
2488+
2489+
_orig_get_envidat_metadata = metadata_mod._get_envidat_metadata
2490+
2491+
def _mock_get_envidat_metadata(original_fn):
2492+
async def _mock(*args, **kwargs) -> DOIMetadata | None:
2493+
fetched_metadata = await original_fn(*args, **kwargs)
2494+
if fetched_metadata is not None:
2495+
assert fetched_metadata == metadata
2496+
return fetched_metadata
2497+
2498+
warnings.warn("Could not retrieve DOI metadata, returning saved one", stacklevel=2)
2499+
return metadata
2500+
2501+
return _mock
2502+
2503+
monkeypatch.setattr(metadata_mod, "_get_envidat_metadata", _mock_get_envidat_metadata(_orig_get_envidat_metadata))
2504+
monkeypatch.setattr(
2505+
metadata_mod,
2506+
"_get_envidat_metadata",
2507+
_mock_get_envidat_metadata(_orig_get_envidat_metadata),
2508+
)
2509+
2510+
2511+
async def test_validate_envidat_data_connector(
2512+
envidat_metadata: DOIMetadata,
2513+
sanic_client: SanicASGITestClient,
2514+
monkeypatch: "MonkeyPatch",
2515+
) -> None:
2516+
_mock_get_envidat_metadata(envidat_metadata, sanic_client, monkeypatch)
24842517
body = GlobalDataConnectorPost(
24852518
storage=CloudStorageCorePost(
24862519
storage_type="doi",
@@ -2510,10 +2543,16 @@ async def test_validate_envidat_data_connector() -> None:
25102543
assert res.publisher_name is not None
25112544

25122545

2513-
async def test_add_envidat_data_connector(sanic_client: SanicASGITestClient, user_headers) -> None:
2546+
async def test_add_envidat_data_connector(
2547+
sanic_client: SanicASGITestClient,
2548+
user_headers: dict[str, str],
2549+
envidat_metadata: DOIMetadata,
2550+
monkeypatch: "MonkeyPatch",
2551+
) -> None:
2552+
_mock_get_envidat_metadata(envidat_metadata, sanic_client, monkeypatch)
25142553
payload = {
25152554
"storage": {
2516-
"configuration": {"type": "doi", "doi": "10.16904/envidat.716"},
2555+
"configuration": {"type": "doi", "doi": "10.16904/12"},
25172556
"source_path": "/",
25182557
"target_path": "/",
25192558
"readonly": True,

test/conftest.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,14 @@
2929
from renku_data_services.app_config import logging
3030
from renku_data_services.authz.config import AuthzConfig
3131
from renku_data_services.data_api.dependencies import DependencyManager
32+
from renku_data_services.data_connectors.doi.models import DOIMetadata, SchemaOrgDataset
3233
from renku_data_services.db_config.config import DBConfig
3334
from renku_data_services.secrets_storage_api.dependencies import DependencyManager as SecretsDependencyManager
3435
from renku_data_services.solr import entity_schema
3536
from renku_data_services.solr.solr_client import SolrClientConfig
3637
from renku_data_services.solr.solr_migrate import SchemaMigrator
3738
from renku_data_services.users import models as user_preferences_models
39+
from test.constants import envidat_sample_response
3840
from test.utils import TestDependencyManager
3941

4042

@@ -489,3 +491,9 @@ def pytest_runtest_setup(item):
489491
),
490492
append=False,
491493
)
494+
495+
496+
@pytest.fixture()
497+
def envidat_metadata() -> DOIMetadata:
498+
md = SchemaOrgDataset.model_validate_json(envidat_sample_response)
499+
return DOIMetadata(name=md.name, description=md.description or "", keywords=md.keywords)

test/components/renku_data_services/data_connectors/test_metadata.py renamed to test/constants.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
from renku_data_services.data_connectors.doi.models import SchemaOrgDataset
1+
from typing import Final
22

3-
envidat_sample_response = """
3+
envidat_sample_response: Final[str] = """
44
{
55
"@context": "http://schema.org",
66
"@type": "https://schema.org/Dataset",
@@ -180,7 +180,3 @@
180180
"license": "https://opendefinition.org/licenses/odc-odbl"
181181
}
182182
""" # noqa: E501
183-
184-
185-
def test_envidat_metadata_parsing() -> None:
186-
SchemaOrgDataset.model_validate_json(envidat_sample_response)

0 commit comments

Comments
 (0)