From df5b4183b2d3aa83f68990344faf8c248b836feb Mon Sep 17 00:00:00 2001
From: Jean-Paul Calderone <exarkun@twistedmatrix.com>
Date: Wed, 13 Nov 2019 14:28:23 -0500
Subject: [PATCH] Fix Voucher/json round-trip test and implementation

---
 src/_zkapauthorizer/model.py            |  8 +++++++-
 src/_zkapauthorizer/tests/strategies.py | 16 +++++++++++++++-
 src/_zkapauthorizer/tests/test_model.py | 10 +++++-----
 3 files changed, 27 insertions(+), 7 deletions(-)

diff --git a/src/_zkapauthorizer/model.py b/src/_zkapauthorizer/model.py
index c8d2a32..331ec04 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 c9c7ec2..6b21896 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 f53bd5b..925f464 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),
         )
 
 
-- 
GitLab