From deca344a6f5ef90bbd05756bd4326d4f7e748361 Mon Sep 17 00:00:00 2001
From: Jean-Paul Calderone <exarkun@twistedmatrix.com>
Date: Mon, 4 May 2020 11:01:25 -0400
Subject: [PATCH] Fix json round-tripping for Redeeming state

---
 src/_zkapauthorizer/model.py            |  3 ++-
 src/_zkapauthorizer/tests/strategies.py | 36 +++++++++++++++----------
 2 files changed, 24 insertions(+), 15 deletions(-)

diff --git a/src/_zkapauthorizer/model.py b/src/_zkapauthorizer/model.py
index 329d0b8..636c3a1 100644
--- a/src/_zkapauthorizer/model.py
+++ b/src/_zkapauthorizer/model.py
@@ -793,6 +793,7 @@ class Redeeming(object):
         return {
             u"name": u"redeeming",
             u"started": self.started.isoformat(),
+            u"counter": self.counter,
         }
 
 
@@ -981,7 +982,7 @@ class Voucher(object):
         elif state_name == u"redeeming":
             state = Redeeming(
                 started=parse_datetime(state_json[u"started"]),
-                counter=0,
+                counter=state_json[u"counter"],
             )
         elif state_name == u"double-spend":
             state = DoubleSpend(
diff --git a/src/_zkapauthorizer/tests/strategies.py b/src/_zkapauthorizer/tests/strategies.py
index 9a4c325..13ea72a 100644
--- a/src/_zkapauthorizer/tests/strategies.py
+++ b/src/_zkapauthorizer/tests/strategies.py
@@ -77,6 +77,7 @@ from ..model import (
     DoubleSpend,
     Unpaid,
     Error,
+    Redeeming,
     Redeemed,
 )
 
@@ -297,6 +298,7 @@ def vouchers():
         lambda voucher: voucher.decode("ascii"),
     )
 
+
 def redeemed_states():
     """
     Build ``Redeemed`` instances.
@@ -308,6 +310,20 @@ def redeemed_states():
         public_key=dummy_ristretto_keys(),
     )
 
+
+def voucher_counters():
+    """
+    Build integers usable as counters in the voucher redemption process.
+    """
+    return integers(
+        min_value=0,
+        # This may or may not be the actual maximum value accepted by a
+        # PaymentServer.  If it is not exactly the maximum, it's probably at
+        # least in the same ballpark.
+        max_value=256,
+    )
+
+
 def voucher_states():
     """
     Build Python objects representing states a Voucher can be in.
@@ -315,7 +331,12 @@ def voucher_states():
     return one_of(
         builds(
             Pending,
-            integers(min_value=0),
+            counter=integers(min_value=0),
+        ),
+        builds(
+            Redeeming,
+            started=datetimes(),
+            counter=voucher_counters(),
         ),
         redeemed_states(),
         builds(
@@ -347,19 +368,6 @@ def voucher_objects(states=voucher_states()):
     )
 
 
-def voucher_counters():
-    """
-    Build integers usable as counters in the voucher redemption process.
-    """
-    return integers(
-        min_value=0,
-        # This may or may not be the actual maximum value accepted by a
-        # PaymentServer.  If it is not exactly the maximum, it's probably at
-        # least in the same ballpark.
-        max_value=256,
-    )
-
-
 def redemption_group_counts():
     """
     Build integers which can represent the number of groups in the redemption
-- 
GitLab