From 369f2151500705843e9179d4d90d3cea56df4617 Mon Sep 17 00:00:00 2001
From: Jean-Paul Calderone <exarkun@twistedmatrix.com>
Date: Wed, 29 Apr 2020 12:20:11 -0400
Subject: [PATCH] Replace assumptions with guarantees

This makes the tests faster and avoids hypothesis complaints about assumptions
that fail too often.
---
 src/_zkapauthorizer/tests/test_controller.py | 29 ++++++++------------
 1 file changed, 12 insertions(+), 17 deletions(-)

diff --git a/src/_zkapauthorizer/tests/test_controller.py b/src/_zkapauthorizer/tests/test_controller.py
index 0f4ef59..f86bc3a 100644
--- a/src/_zkapauthorizer/tests/test_controller.py
+++ b/src/_zkapauthorizer/tests/test_controller.py
@@ -478,16 +478,15 @@ class RistrettoRedeemerTests(TestCase):
             ),
         )
 
-    @given(voucher_objects(), voucher_counters(), integers(min_value=1, max_value=100))
-    def test_redemption_denied_alreadyspent(self, voucher, counter, num_tokens):
+    @given(voucher_objects(), voucher_counters(), integers(min_value=0, max_value=100))
+    def test_redemption_denied_alreadyspent(self, voucher, counter, extra_tokens):
         """
         If the issuer declines to allow the voucher to be redeemed and gives a
         reason that the voucher has already been spent, ``RistrettoRedeem``
         returns a ``Deferred`` that fires with a ``Failure`` wrapping
         ``AlreadySpent``.
         """
-        assume(num_tokens >= counter)
-
+        num_tokens = counter + extra_tokens
         issuer = AlreadySpentRedemption()
         treq = treq_for_loopback_ristretto(issuer)
         redeemer = RistrettoRedeemer(treq, NOWHERE)
@@ -507,16 +506,15 @@ class RistrettoRedeemerTests(TestCase):
             ),
         )
 
-    @given(voucher_objects(), voucher_counters(), integers(min_value=1, max_value=100))
-    def test_redemption_denied_unpaid(self, voucher, counter, num_tokens):
+    @given(voucher_objects(), voucher_counters(), integers(min_value=0, max_value=100))
+    def test_redemption_denied_unpaid(self, voucher, counter, extra_tokens):
         """
         If the issuer declines to allow the voucher to be redeemed and gives a
         reason that the voucher has not been paid for, ``RistrettoRedeem``
         returns a ``Deferred`` that fires with a ``Failure`` wrapping
         ``Unpaid``.
         """
-        assume(num_tokens >= counter)
-
+        num_tokens = counter + extra_tokens
         issuer = UnpaidRedemption()
         treq = treq_for_loopback_ristretto(issuer)
         redeemer = RistrettoRedeemer(treq, NOWHERE)
@@ -536,15 +534,14 @@ class RistrettoRedeemerTests(TestCase):
             ),
         )
 
-    @given(voucher_objects(), voucher_counters(), integers(min_value=1, max_value=100))
-    def test_bad_ristretto_redemption(self, voucher, counter, num_tokens):
+    @given(voucher_objects(), voucher_counters(), integers(min_value=0, max_value=100))
+    def test_bad_ristretto_redemption(self, voucher, counter, extra_tokens):
         """
         If the issuer returns a successful result with an invalid proof then
         ``RistrettoRedeemer.redeem`` returns a ``Deferred`` that fires with a
         ``Failure`` wrapping ``SecurityException``.
         """
-        assume(num_tokens >= counter)
-
+        num_tokens = counter + extra_tokens
         signing_key = random_signing_key()
         issuer = RistrettoRedemption(signing_key)
 
@@ -572,16 +569,14 @@ class RistrettoRedeemerTests(TestCase):
             ),
         )
 
-    @given(voucher_objects(), voucher_counters(), integers(min_value=1, max_value=100))
-    def test_ristretto_pass_construction(self, voucher, counter, num_tokens):
+    @given(voucher_objects(), voucher_counters(), integers(min_value=0, max_value=100))
+    def test_ristretto_pass_construction(self, voucher, counter, extra_tokens):
         """
         The passes constructed using unblinded tokens and messages pass the
         Ristretto verification check.
         """
-        assume(num_tokens >= counter)
-
+        num_tokens = counter + extra_tokens
         message = b"hello world"
-
         signing_key = random_signing_key()
         issuer = RistrettoRedemption(signing_key)
         treq = treq_for_loopback_ristretto(issuer)
-- 
GitLab