diff --git a/src/_zkapauthorizer/model.py b/src/_zkapauthorizer/model.py index c8d2a3258efcfa9d074308de9a9aa79723a27459..331ec04a990f526cd651abd15e3e3c0cb2a14739 100644 --- a/src/_zkapauthorizer/model.py +++ b/src/_zkapauthorizer/model.py @@ -460,7 +460,12 @@ class Voucher(object): @classmethod def from_json_v1(cls, values): - return cls(**values) + return cls( + number=values[u"number"], + created=None if values[u"created"] is None else parse_datetime(values[u"created"]), + redeemed=values[u"redeemed"], + token_count=values[u"token_count"], + ) def to_json(self): @@ -476,5 +481,6 @@ class Voucher(object): u"number": self.number, u"created": None if self.created is None else self.created.isoformat(), u"redeemed": self.redeemed, + u"token_count": self.token_count, u"version": 1, } diff --git a/src/_zkapauthorizer/tests/strategies.py b/src/_zkapauthorizer/tests/strategies.py index c9c7ec226b7df5be6a4065850fa3fe07edd2280a..6b21896d9a0c70d15766044cff5cd9ef68064d3d 100644 --- a/src/_zkapauthorizer/tests/strategies.py +++ b/src/_zkapauthorizer/tests/strategies.py @@ -25,6 +25,8 @@ import attr from hypothesis.strategies import ( one_of, just, + none, + booleans, binary, characters, text, @@ -35,6 +37,7 @@ from hypothesis.strategies import ( dictionaries, fixed_dictionaries, builds, + datetimes, ) from twisted.web.test.requesthelper import ( @@ -52,7 +55,8 @@ from allmydata.client import ( from ..model import ( Pass, RandomToken, - UnblindedToken + UnblindedToken, + Voucher, ) @@ -216,6 +220,16 @@ def vouchers(): ) +def voucher_objects(): + return builds( + Voucher, + number=vouchers(), + created=one_of(none(), datetimes()), + redeemed=booleans(), + token_count=one_of(none(), integers(min_value=1)), + ) + + def random_tokens(): """ Build random tokens as unicode strings. diff --git a/src/_zkapauthorizer/tests/test_model.py b/src/_zkapauthorizer/tests/test_model.py index f53bd5b35fc0066a764c252856f71726e2776dff..925f464fe664fe85d0a18ef0b16bd98f65d59ccc 100644 --- a/src/_zkapauthorizer/tests/test_model.py +++ b/src/_zkapauthorizer/tests/test_model.py @@ -72,6 +72,7 @@ from ..model import ( from .strategies import ( tahoe_configs, vouchers, + voucher_objects, random_tokens, unblinded_tokens, ) @@ -261,15 +262,14 @@ class VoucherTests(TestCase): """ Tests for ``Voucher``. """ - @given(vouchers()) - def test_json_roundtrip(self, voucher): + @given(voucher_objects()) + def test_json_roundtrip(self, reference): """ ``Voucher.to_json . Voucher.from_json → id`` """ - ref = Voucher(voucher) self.assertThat( - Voucher.from_json(ref.to_json()), - Equals(ref), + Voucher.from_json(reference.to_json()), + Equals(reference), )