mirror of
https://github.com/enpaul/keyosk.git
synced 2024-11-24 23:47:49 +00:00
Add tests for new Epoch and RawMultiType fields
Fix bug with PathString field not dumping NoneType properly
This commit is contained in:
parent
b7596bdd3f
commit
7a88b0ddac
@ -78,7 +78,7 @@ class PathString(msh.fields.String):
|
|||||||
"""Translate between a string and a path object"""
|
"""Translate between a string and a path object"""
|
||||||
|
|
||||||
def _serialize(self, value: Union[str, Path], attr, obj, **kwargs) -> str:
|
def _serialize(self, value: Union[str, Path], attr, obj, **kwargs) -> str:
|
||||||
return super()._serialize(str(value), attr, obj, **kwargs)
|
return super()._serialize(str(value) if value else value, attr, obj, **kwargs)
|
||||||
|
|
||||||
def _deserialize(self, value: str, attr, data, **kwargs) -> Path:
|
def _deserialize(self, value: str, attr, data, **kwargs) -> Path:
|
||||||
return Path(super()._deserialize(value, attr, data, **kwargs))
|
return Path(super()._deserialize(value, attr, data, **kwargs))
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
|
import datetime
|
||||||
import enum
|
import enum
|
||||||
|
import time
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
import marshmallow
|
import marshmallow
|
||||||
@ -135,3 +137,126 @@ def test_pathstring():
|
|||||||
for data in bad_data:
|
for data in bad_data:
|
||||||
with pytest.raises(marshmallow.ValidationError):
|
with pytest.raises(marshmallow.ValidationError):
|
||||||
serializer.load(data)
|
serializer.load(data)
|
||||||
|
|
||||||
|
|
||||||
|
def test_pathstring_none():
|
||||||
|
class TestSchema(marshmallow.Schema):
|
||||||
|
iampath = fields.PathString(allow_none=True)
|
||||||
|
|
||||||
|
good_data = [
|
||||||
|
{"iampath": "/etc/sooper/seekret/place.stuff"},
|
||||||
|
{"iampath": "fizzbuzz.foobar"},
|
||||||
|
{"iampath": None},
|
||||||
|
]
|
||||||
|
|
||||||
|
serializer = TestSchema()
|
||||||
|
|
||||||
|
for item in good_data:
|
||||||
|
loaded = serializer.load(item)
|
||||||
|
if item["iampath"] is None:
|
||||||
|
assert loaded["iampath"] is None
|
||||||
|
else:
|
||||||
|
assert isinstance(loaded["iampath"], Path)
|
||||||
|
assert item == serializer.dump(loaded)
|
||||||
|
|
||||||
|
|
||||||
|
def test_epoch():
|
||||||
|
class TestSchema(marshmallow.Schema):
|
||||||
|
iamepoch = fields.Epoch()
|
||||||
|
|
||||||
|
good_data = [
|
||||||
|
{"iamepoch": 123456789},
|
||||||
|
{"iamepoch": 0},
|
||||||
|
{"iamepoch": int(time.time())},
|
||||||
|
]
|
||||||
|
|
||||||
|
bad_data = [
|
||||||
|
{"iamepoch": -1},
|
||||||
|
{"iamepoch": (1, 2, 3)},
|
||||||
|
{"iamepoch": datetime.datetime.utcnow()},
|
||||||
|
{"iamepoch": -1234},
|
||||||
|
{"iamepoch": None},
|
||||||
|
]
|
||||||
|
|
||||||
|
serializer = TestSchema()
|
||||||
|
|
||||||
|
for data in good_data:
|
||||||
|
loaded = serializer.load(data)
|
||||||
|
assert isinstance(loaded["iamepoch"], datetime.datetime)
|
||||||
|
assert int(loaded["iamepoch"].timestamp()) == data["iamepoch"]
|
||||||
|
assert data == serializer.dump(loaded)
|
||||||
|
|
||||||
|
for data in bad_data:
|
||||||
|
with pytest.raises(marshmallow.ValidationError):
|
||||||
|
serializer.load(data)
|
||||||
|
|
||||||
|
|
||||||
|
def test_epoch_none():
|
||||||
|
class TestSchema(marshmallow.Schema):
|
||||||
|
iamepoch = fields.Epoch(allow_none=True)
|
||||||
|
|
||||||
|
good_data = [
|
||||||
|
{"iamepoch": 123456789},
|
||||||
|
{"iamepoch": 0},
|
||||||
|
{"iamepoch": int(time.time())},
|
||||||
|
{"iamepoch": None},
|
||||||
|
]
|
||||||
|
|
||||||
|
serializer = TestSchema()
|
||||||
|
|
||||||
|
for item in good_data:
|
||||||
|
loaded = serializer.load(item)
|
||||||
|
if item["iamepoch"] is None:
|
||||||
|
assert loaded["iamepoch"] is None
|
||||||
|
else:
|
||||||
|
assert isinstance(loaded["iamepoch"], datetime.datetime)
|
||||||
|
assert int(loaded["iamepoch"].timestamp()) == item["iamepoch"]
|
||||||
|
assert item == serializer.dump(loaded)
|
||||||
|
|
||||||
|
|
||||||
|
def test_rawmultitype():
|
||||||
|
class TestSchema(marshmallow.Schema):
|
||||||
|
iamraw = fields.RawMultiType([str, bool, datetime.datetime, Path])
|
||||||
|
|
||||||
|
good_data = [
|
||||||
|
{"iamraw": "haveyoueverheardthetragedyofdarthplageiusthewise"},
|
||||||
|
{"iamraw": True},
|
||||||
|
{"iamraw": datetime.datetime.utcnow()},
|
||||||
|
{"iamraw": Path("/all", "your", "hackz", "are", "belong", "to", "me")},
|
||||||
|
]
|
||||||
|
|
||||||
|
bad_data = [
|
||||||
|
{"iamraw": 1234},
|
||||||
|
{"iamraw": datetime.timedelta(seconds=30)},
|
||||||
|
{"iamraw": ["hello", "there"]},
|
||||||
|
{"iamraw": None},
|
||||||
|
]
|
||||||
|
|
||||||
|
serializer = TestSchema()
|
||||||
|
|
||||||
|
for data in good_data:
|
||||||
|
loaded = serializer.load(data)
|
||||||
|
assert loaded == data
|
||||||
|
assert data == serializer.dump(loaded)
|
||||||
|
|
||||||
|
for data in bad_data:
|
||||||
|
with pytest.raises(marshmallow.ValidationError):
|
||||||
|
serializer.load(data)
|
||||||
|
|
||||||
|
|
||||||
|
def test_rawmultitype_none():
|
||||||
|
class TestSchema(marshmallow.Schema):
|
||||||
|
iamraw = fields.RawMultiType([str, datetime.datetime], allow_none=True)
|
||||||
|
|
||||||
|
good_data = [
|
||||||
|
{"iamraw": "haveyoueverheardthetragedyofdarthplageiusthewise"},
|
||||||
|
{"iamraw": datetime.datetime.utcnow()},
|
||||||
|
{"iamraw": None},
|
||||||
|
]
|
||||||
|
|
||||||
|
serializer = TestSchema()
|
||||||
|
|
||||||
|
for data in good_data:
|
||||||
|
loaded = serializer.load(data)
|
||||||
|
assert loaded == data
|
||||||
|
assert data == serializer.dump(loaded)
|
||||||
|
Loading…
Reference in New Issue
Block a user