Skip to content

Commit afc6c61

Browse files
committed
chore: mock tests to succeed if envidat is unavailable
1 parent d10793b commit afc6c61

File tree

5 files changed

+72
-13
lines changed

5 files changed

+72
-13
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:

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
@@ -2488,7 +2488,40 @@ async def _mock(*args, **kwargs) -> DOIMetadata | None:
24882488
)
24892489

24902490

2491-
async def test_validate_envidat_data_connector() -> None:
2491+
def _mock_get_envidat_metadata(metadata: DOIMetadata, sanic_client: SanicASGITestClient, monkeypatch: "MonkeyPatch"):
2492+
"""Mock the _get_envidat_metadata method."""
2493+
2494+
# The Evnidat API may be unresponsive, so we mock its response
2495+
from renku_data_services.data_connectors.doi import metadata as metadata_mod
2496+
2497+
_orig_get_envidat_metadata = metadata_mod._get_envidat_metadata
2498+
2499+
def _mock_get_envidat_metadata(original_fn):
2500+
async def _mock(*args, **kwargs) -> DOIMetadata | None:
2501+
fetched_metadata = await original_fn(*args, **kwargs)
2502+
if fetched_metadata is not None:
2503+
assert fetched_metadata == metadata
2504+
return fetched_metadata
2505+
2506+
warnings.warn("Could not retrieve DOI metadata, returning saved one", stacklevel=2)
2507+
return metadata
2508+
2509+
return _mock
2510+
2511+
monkeypatch.setattr(metadata_mod, "_get_envidat_metadata", _mock_get_envidat_metadata(_orig_get_envidat_metadata))
2512+
monkeypatch.setattr(
2513+
metadata_mod,
2514+
"_get_envidat_metadata",
2515+
_mock_get_envidat_metadata(_orig_get_envidat_metadata),
2516+
)
2517+
2518+
2519+
async def test_validate_envidat_data_connector(
2520+
envidat_metadata: DOIMetadata,
2521+
sanic_client: SanicASGITestClient,
2522+
monkeypatch: "MonkeyPatch",
2523+
) -> None:
2524+
_mock_get_envidat_metadata(envidat_metadata, sanic_client, monkeypatch)
24922525
body = GlobalDataConnectorPost(
24932526
storage=CloudStorageCorePost(
24942527
storage_type="doi",
@@ -2518,10 +2551,16 @@ async def test_validate_envidat_data_connector() -> None:
25182551
assert res.publisher_name is not None
25192552

25202553

2521-
async def test_add_envidat_data_connector(sanic_client: SanicASGITestClient, user_headers) -> None:
2554+
async def test_add_envidat_data_connector(
2555+
sanic_client: SanicASGITestClient,
2556+
user_headers: dict[str, str],
2557+
envidat_metadata: DOIMetadata,
2558+
monkeypatch: "MonkeyPatch",
2559+
) -> None:
2560+
_mock_get_envidat_metadata(envidat_metadata, sanic_client, monkeypatch)
25222561
payload = {
25232562
"storage": {
2524-
"configuration": {"type": "doi", "doi": "10.16904/envidat.716"},
2563+
"configuration": {"type": "doi", "doi": "10.16904/12"},
25252564
"source_path": "/",
25262565
"target_path": "/",
25272566
"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)