Skip to content

Commit 1ef0fd5

Browse files
committed
extract models from openapi specs
1 parent 295c827 commit 1ef0fd5

File tree

2 files changed

+41
-52
lines changed

2 files changed

+41
-52
lines changed

clients/python/test/test_osparc/conftest.py

Lines changed: 29 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@
1010
from urllib3 import HTTPResponse
1111
from pydantic import BaseModel
1212
from typing import Callable, Generator
13+
from prance import ResolvingParser
14+
import json
15+
from tempfile import NamedTemporaryFile
16+
from pathlib import Path
17+
from typing import Any, Type, TypeVar
1318

1419

1520
@pytest.fixture
@@ -21,6 +26,16 @@ def cfg(faker: Faker) -> osparc.Configuration:
2126
)
2227

2328

29+
@pytest.fixture
30+
def osparc_openapi_specs() -> Generator[dict[str, Any], None, None]:
31+
with NamedTemporaryFile(suffix=".json") as file:
32+
file = Path(file.name)
33+
file.write_text(json.dumps(osparc.openapi()))
34+
osparc_spec = ResolvingParser(f"{file.resolve()}").specification
35+
assert osparc_spec is not None
36+
yield osparc_spec
37+
38+
2439
@pytest.fixture
2540
def api_client(cfg: osparc.Configuration) -> osparc.ApiClient:
2641
return osparc.ApiClient(configuration=cfg)
@@ -55,53 +70,20 @@ def _sideeffect(
5570
yield _mock_server
5671

5772

58-
@pytest.fixture
59-
def job_metadata_update(faker: Faker):
60-
return osparc.JobMetadataUpdate(
61-
metadata={
62-
"boolean": faker.boolean(),
63-
"float": faker.pyfloat(),
64-
"int": faker.pyint(),
65-
"str": faker.text(),
66-
"None": None,
67-
}
68-
)
69-
70-
71-
@pytest.fixture
72-
def job_metadata(
73-
faker: Faker, job_metadata_update: osparc.JobMetadataUpdate
74-
) -> osparc.JobMetadata:
75-
return osparc.JobMetadata(
76-
job_id=f"{faker.uuid4()}",
77-
metadata=job_metadata_update.metadata,
78-
url=faker.url(),
79-
)
73+
T = TypeVar("T", bound=BaseModel)
8074

8175

8276
@pytest.fixture
83-
def job_inputs(faker: Faker) -> osparc.JobInputs:
84-
return osparc.JobInputs(
85-
{
86-
"File": osparc.File(id=f"{faker.uuid4()}", filename=faker.file_name()),
87-
"bool": faker.boolean(),
88-
"float": faker.pyfloat(),
89-
"int": faker.pyint(),
90-
"str": faker.text(),
91-
"None": None,
92-
}
93-
)
94-
95-
96-
@pytest.fixture
97-
def job(faker: Faker) -> osparc.Job:
98-
return osparc.Job(
99-
id=f"{faker.uuid4()}",
100-
name=faker.file_name(),
101-
inputs_checksum=f"{faker.sha256()}",
102-
created_at=faker.date_time(),
103-
runner_name="runner1", # must validate regexp, hence hardcoded
104-
url=None,
105-
runner_url=None,
106-
outputs_url=None,
107-
)
77+
def create_osparc_response_model(
78+
osparc_openapi_specs: dict[str, Any],
79+
) -> Generator[Callable[[Type[T]], T], None, None]:
80+
def _create_model(model_type: Type[T]) -> T:
81+
schemas = osparc_openapi_specs.get("components", {}).get("schemas", {})
82+
example_data = schemas.get(model_type.__name__, {}).get("example", {})
83+
assert example_data, (
84+
"Could not extract example data for",
85+
" '{model_type.__name__}' from openapi specs",
86+
)
87+
return model_type.model_validate(example_data)
88+
89+
yield _create_model

clients/python/test/test_osparc/test_solvers_api.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
from typing import Callable, Generator
44
from pydantic import BaseModel
55
import pytest
6+
from typing import Type, TypeVar
7+
8+
T = TypeVar("T", bound=BaseModel)
69

710

811
@pytest.fixture
@@ -12,10 +15,12 @@ def solvers_api(api_client: ApiClient) -> Generator[SolversApi, None, None]:
1215

1316
def test_create_job(
1417
create_server_mock: Callable[[int, BaseModel], None],
15-
job_inputs: JobInputs,
16-
job: Job,
18+
create_osparc_response_model: Callable,
1719
solvers_api: SolversApi,
1820
):
21+
job_inputs = create_osparc_response_model(JobInputs)
22+
job = create_osparc_response_model(Job)
23+
1924
create_server_mock(201, job)
2025

2126
_job = solvers_api.create_job(
@@ -26,10 +31,11 @@ def test_create_job(
2631

2732
def test_get_job_custom_metadata(
2833
create_server_mock: Callable[[int, BaseModel], None],
29-
job_metadata: JobMetadata,
34+
create_osparc_response_model: Callable[[Type[JobMetadata]], JobMetadata],
3035
faker: Faker,
3136
solvers_api: SolversApi,
3237
):
38+
job_metadata = create_osparc_response_model(JobMetadata)
3339
create_server_mock(200, job_metadata)
3440

3541
metadata = solvers_api.get_job_custom_metadata(
@@ -40,11 +46,12 @@ def test_get_job_custom_metadata(
4046

4147
def test_replace_job_custom_metadata(
4248
create_server_mock: Callable[[int, BaseModel], None],
43-
job_metadata: JobMetadata,
44-
job_metadata_update: JobMetadataUpdate,
49+
create_osparc_response_model: Callable,
4550
solvers_api: SolversApi,
4651
faker: Faker,
4752
):
53+
job_metadata = create_osparc_response_model(JobMetadata)
54+
job_metadata_update = create_osparc_response_model(JobMetadataUpdate)
4855
create_server_mock(200, job_metadata)
4956

5057
_job_metadata = solvers_api.replace_job_custom_metadata(

0 commit comments

Comments
 (0)