1010from urllib3 import HTTPResponse
1111from pydantic import BaseModel
1212from 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
2540def 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
0 commit comments