Skip to content

Commit fb1716c

Browse files
authored
Merge pull request #74 from hydroshare/fix-ResourcePreview-model
Fix resource preview model
2 parents f9d70b0 + 25ceb9e commit fb1716c

File tree

3 files changed

+81
-30
lines changed

3 files changed

+81
-30
lines changed

hsclient/json_models.py

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from datetime import datetime
2-
from typing import Dict, List, Tuple, Optional
2+
from typing import Dict, List, Tuple, Optional, Union, Any
33

44
from hsmodels.schemas.enums import UserIdentifierType
55
from pydantic import AnyUrl, BaseModel, HttpUrl, field_validator
@@ -34,24 +34,24 @@ def handle_empty_website(cls, v):
3434

3535

3636
class ResourcePreview(BaseModel):
37-
resource_type: str = None
38-
resource_title: str = None
39-
resource_id: str = None
40-
abstract: str = None
37+
resource_type: str
38+
resource_title: str
39+
resource_id: str
40+
abstract: Optional[str] = None
4141
authors: List[str] = []
42-
creator: str = None
43-
doi: str = None
44-
date_created: str = None
45-
date_last_updated: str = None
46-
public: bool = None
47-
discoverable: bool = None
48-
shareable: bool = None
49-
coverages: Dict[str, str] = None
50-
immutable: bool = None
51-
published: bool = None
52-
resource_url: str = None
53-
resource_map_url: str = None
54-
resource_metadata_url: str = None
42+
creator: str
43+
doi: Optional[str] = None
44+
date_created: str
45+
date_last_updated: str
46+
public: bool
47+
discoverable: bool
48+
shareable: bool
49+
coverages: Union[List[Dict[str, Any]], List] = []
50+
immutable: bool
51+
published: bool
52+
resource_url: str
53+
resource_map_url: str
54+
science_metadata_url: str
5555

5656
@field_validator("authors", mode='before')
5757
def handle_null_author(cls, v):
@@ -64,3 +64,10 @@ def handle_null_author(cls, v):
6464

6565
# filter to remove all empty x's in v ("", None, or equivalent)
6666
return list(filter(lambda x: x, v))
67+
68+
@field_validator("coverages", mode='before')
69+
def handle_null_coverages(cls, v):
70+
# return empty list when supplied coverages field is None.
71+
if v is None:
72+
return []
73+
return v

hsclient/oauth2_model.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@
88
class Token(BaseModel):
99
access_token: str
1010
token_type: str
11-
scope: Optional[str]
12-
state: Optional[str]
13-
expires_in: Optional[int]
14-
refresh_token: Optional[str]
11+
scope: Optional[str] = None
12+
state: Optional[str] = None
13+
expires_in: Optional[int] = None
14+
refresh_token: Optional[str] = None
1515

1616
class Config:
1717
# do not allow extra fields

tests/test_json_models.py

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,32 @@ def test_null_subject_areas():
2828
assert o.subject_areas == []
2929

3030

31-
AuthorsFieldResourcePreviewTestData = (
32-
json.dumps({"authors": None}),
33-
json.dumps({"authors": []}),
34-
json.dumps({"authors": [None]}),
35-
json.dumps({"authors": [""]}),
36-
json.dumps({"authors": [[]]}),
37-
)
31+
def generate_resource_preview_test_data(authors_field):
32+
data = ResourcePreviewTestRequiredData.copy()
33+
data.update(authors_field)
34+
data = json.dumps(data)
35+
return data
36+
37+
38+
ResourcePreviewTestRequiredData = {
39+
"resource_type": "CompositeResource",
40+
"resource_title": "Test Resource",
41+
"resource_id": "97523bdb7b174901b3fc2d89813458f1",
42+
"creator": "John Doe",
43+
"date_created": "2021-01-01T00:00:00.000Z",
44+
"date_last_updated": "2021-01-01T00:00:00.000Z",
45+
"public": True,
46+
"discoverable": True,
47+
"shareable": True,
48+
"immutable": False,
49+
"published": False,
50+
"resource_url": "http://beta.hydroshare.org/resource/97523bdb7b174901b3fc2d89813458f1/",
51+
"resource_map_url": "http://beta.hydroshare.org/resource/97523bdb7b174901b3fc2d89813458f1/map/",
52+
"science_metadata_url": "http://beta.hydroshare.org/resource/97523bdb7b174901b3fc2d89813458f1/science-metadata/",
53+
}
54+
55+
authors = [{"authors": x} for x in [None, [], [None], [""], [[]]]]
56+
AuthorsFieldResourcePreviewTestData = map(generate_resource_preview_test_data, authors)
3857

3958

4059
@pytest.mark.parametrize("test_data", AuthorsFieldResourcePreviewTestData)
@@ -57,12 +76,37 @@ def test_resource_preview_authors_raises_validation_error_on_string_input():
5776
"""verify that a string passed to authors field raises pydantic.ValidationError"""
5877
from pydantic import ValidationError
5978

60-
data = json.dumps({"authors": "should_fail"})
79+
data = ResourcePreviewTestRequiredData.copy()
80+
data.update({"authors": "should_fail"})
81+
data = json.dumps(data)
6182

6283
with pytest.raises(ValidationError):
6384
ResourcePreview.model_validate_json(data)
6485

6586

87+
def test_resource_preview_required_fields():
88+
resource_preview = ResourcePreview.model_validate_json(json.dumps(ResourcePreviewTestRequiredData))
89+
assert resource_preview.resource_type == "CompositeResource"
90+
assert resource_preview.resource_title == "Test Resource"
91+
assert resource_preview.resource_id == "97523bdb7b174901b3fc2d89813458f1"
92+
assert resource_preview.creator == "John Doe"
93+
assert resource_preview.date_created == "2021-01-01T00:00:00.000Z"
94+
assert resource_preview.date_last_updated == "2021-01-01T00:00:00.000Z"
95+
assert resource_preview.public
96+
assert resource_preview.discoverable
97+
assert resource_preview.shareable
98+
assert not resource_preview.immutable
99+
assert not resource_preview.published
100+
assert resource_preview.resource_url == "http://beta.hydroshare.org/resource/97523bdb7b174901b3fc2d89813458f1/"
101+
assert resource_preview.resource_map_url == "http://beta.hydroshare.org/resource/97523bdb7b174901b3fc2d89813458f1/map/"
102+
assert resource_preview.science_metadata_url == "http://beta.hydroshare.org/resource/97523bdb7b174901b3fc2d89813458f1/science-metadata/"
103+
# check the optional fields
104+
assert resource_preview.abstract is None
105+
assert resource_preview.authors == []
106+
assert resource_preview.doi is None
107+
assert resource_preview.coverages == []
108+
109+
66110
def test_user_info(user):
67111
assert user.name == "Castronova, Anthony M."
68112
assert user.email == "[email protected]"

0 commit comments

Comments
 (0)