From 30497dc400eb4b26df168cf96516081dd40854d8 Mon Sep 17 00:00:00 2001
From: Jean-Paul Calderone <exarkun@twistedmatrix.com>
Date: Mon, 2 Dec 2019 11:15:18 -0500
Subject: [PATCH] Have and use a voucher store fixture

---
 src/_zkapauthorizer/tests/fixtures.py        | 32 +++++++++++++
 src/_zkapauthorizer/tests/test_controller.py | 50 ++++----------------
 src/_zkapauthorizer/tests/test_model.py      | 21 ++++----
 3 files changed, 52 insertions(+), 51 deletions(-)

diff --git a/src/_zkapauthorizer/tests/fixtures.py b/src/_zkapauthorizer/tests/fixtures.py
index dbb49e6..eb64887 100644
--- a/src/_zkapauthorizer/tests/fixtures.py
+++ b/src/_zkapauthorizer/tests/fixtures.py
@@ -20,6 +20,8 @@ from __future__ import (
     absolute_import,
 )
 
+import attr
+
 from fixtures import (
     Fixture,
     TempDir,
@@ -33,6 +35,11 @@ from allmydata.storage.server import (
     StorageServer,
 )
 
+from ..model import (
+    VoucherStore,
+    memory_connect,
+)
+
 class AnonymousStorageServer(Fixture):
     """
     Supply an instance of allmydata.storage.server.StorageServer which
@@ -50,3 +57,28 @@ class AnonymousStorageServer(Fixture):
             self.tempdir.asBytesMode().path,
             b"x" * 20,
         )
+
+
+@attr.s
+class TemporaryVoucherStore(Fixture):
+    """
+    Create a ``VoucherStore`` in a temporary directory associated with the
+    given test case.
+
+    :ivar get_config: A function like the one built by ``tahoe_configs``.
+    :ivar get_now: A no-argument callable that returns a datetime giving a
+        time to consider as "now".
+
+    :ivar store: A newly created temporary store.
+    """
+    get_config = attr.ib()
+    get_now = attr.ib()
+
+    def _setUp(self):
+        self.tempdir = self.useFixture(TempDir())
+        self.config = self.get_config(self.tempdir.join(b"node"), b"tub.port")
+        self.store = VoucherStore.from_node_config(
+            self.config,
+            self.get_now,
+            memory_connect,
+        )
diff --git a/src/_zkapauthorizer/tests/test_controller.py b/src/_zkapauthorizer/tests/test_controller.py
index 1684e62..b36a78c 100644
--- a/src/_zkapauthorizer/tests/test_controller.py
+++ b/src/_zkapauthorizer/tests/test_controller.py
@@ -50,10 +50,6 @@ from testtools.twistedsupport import (
     failed,
 )
 
-from fixtures import (
-    TempDir,
-)
-
 from hypothesis import (
     given,
 )
@@ -105,8 +101,6 @@ from ..controller import (
 )
 
 from ..model import (
-    memory_connect,
-    VoucherStore,
     UnblindedToken,
     Pending as model_Pending,
     DoubleSpend as model_DoubleSpend,
@@ -122,6 +116,10 @@ from .strategies import (
 from .matchers import (
     Provides,
 )
+from .fixtures import (
+    TemporaryVoucherStore,
+)
+
 
 class PaymentControllerTests(TestCase):
     """
@@ -133,15 +131,7 @@ class PaymentControllerTests(TestCase):
         A ``Voucher`` is not marked redeemed before ``IRedeemer.redeem``
         completes.
         """
-        tempdir = self.useFixture(TempDir())
-        store = VoucherStore.from_node_config(
-            get_config(
-                tempdir.join(b"node"),
-                b"tub.port",
-            ),
-            now=lambda: now,
-            connect=memory_connect,
-        )
+        store = self.useFixture(TemporaryVoucherStore(get_config, lambda: now)).store
         controller = PaymentController(
             store,
             NonRedeemer(),
@@ -159,15 +149,7 @@ class PaymentControllerTests(TestCase):
         """
         A ``Voucher`` is marked as redeemed after ``IRedeemer.redeem`` succeeds.
         """
-        tempdir = self.useFixture(TempDir())
-        store = VoucherStore.from_node_config(
-            get_config(
-                tempdir.join(b"node"),
-                b"tub.port",
-            ),
-            now=lambda: now,
-            connect=memory_connect,
-        )
+        store = self.useFixture(TemporaryVoucherStore(get_config, lambda: now)).store
         controller = PaymentController(
             store,
             DummyRedeemer(),
@@ -189,15 +171,7 @@ class PaymentControllerTests(TestCase):
         A ``Voucher`` is marked as double-spent after ``IRedeemer.redeem`` fails
         with ``AlreadySpent``.
         """
-        tempdir = self.useFixture(TempDir())
-        store = VoucherStore.from_node_config(
-            get_config(
-                tempdir.join(b"node"),
-                b"tub.port",
-            ),
-            now=lambda: now,
-            connect=memory_connect,
-        )
+        store = self.useFixture(TemporaryVoucherStore(get_config, lambda: now)).store
         controller = PaymentController(
             store,
             DoubleSpendRedeemer(),
@@ -220,15 +194,7 @@ class PaymentControllerTests(TestCase):
         When ``PaymentController`` is created, any vouchers in the store in the
         pending state are redeemed.
         """
-        tempdir = self.useFixture(TempDir())
-        store = VoucherStore.from_node_config(
-            get_config(
-                tempdir.join(b"node"),
-                b"tub.port",
-            ),
-            now=lambda: now,
-            connect=memory_connect,
-        )
+        store = self.useFixture(TemporaryVoucherStore(get_config, lambda: now)).store
         # Create the voucher state in the store with a redemption that will
         # certainly fail.
         unpaid_controller = PaymentController(
diff --git a/src/_zkapauthorizer/tests/test_model.py b/src/_zkapauthorizer/tests/test_model.py
index 7414c67..d31e669 100644
--- a/src/_zkapauthorizer/tests/test_model.py
+++ b/src/_zkapauthorizer/tests/test_model.py
@@ -79,6 +79,9 @@ from .strategies import (
     random_tokens,
     unblinded_tokens,
 )
+from .fixtures import (
+    TemporaryVoucherStore,
+)
 
 
 class VoucherStoreTests(TestCase):
@@ -107,7 +110,7 @@ class VoucherStoreTests(TestCase):
         ``VoucherStore.get`` raises ``KeyError`` when called with a
         voucher not previously added to the store.
         """
-        store = store_for_test(self, get_config, lambda: now)
+        store = self.useFixture(TemporaryVoucherStore(get_config, lambda: now)).store
         self.assertThat(
             lambda: store.get(voucher),
             raises(KeyError),
@@ -119,7 +122,7 @@ class VoucherStoreTests(TestCase):
         ``VoucherStore.get`` returns a ``Voucher`` representing a voucher
         previously added to the store with ``VoucherStore.add``.
         """
-        store = store_for_test(self, get_config, lambda: now)
+        store = self.useFixture(TemporaryVoucherStore(get_config, lambda: now)).store
         store.add(voucher, tokens)
         self.assertThat(
             store.get(voucher),
@@ -136,7 +139,7 @@ class VoucherStoreTests(TestCase):
         More than one call to ``VoucherStore.add`` with the same argument results
         in the same state as a single call.
         """
-        store = store_for_test(self, get_config, lambda: now)
+        store = self.useFixture(TemporaryVoucherStore(get_config, lambda: now)).store
         store.add(voucher, tokens)
         store.add(voucher, [])
         self.assertThat(
@@ -155,7 +158,7 @@ class VoucherStoreTests(TestCase):
         ``VoucherStore.list`` returns a ``list`` containing a ``Voucher`` object
         for each voucher previously added.
         """
-        store = store_for_test(self, get_config, lambda: now)
+        store = self.useFixture(TemporaryVoucherStore(get_config, lambda: now)).store
         for voucher in vouchers:
             store.add(voucher, [])
 
@@ -259,7 +262,7 @@ class UnblindedTokenStoreTests(TestCase):
         """
         Unblinded tokens that are added to the store can later be retrieved.
         """
-        store = store_for_test(self, get_config, lambda: now)
+        store = self.useFixture(TemporaryVoucherStore(get_config, lambda: now)).store
         store.insert_unblinded_tokens_for_voucher(voucher_value, tokens)
         retrieved_tokens = store.extract_unblinded_tokens(len(tokens))
         self.expectThat(tokens, AfterPreprocessing(sorted, Equals(retrieved_tokens)))
@@ -297,7 +300,7 @@ class UnblindedTokenStoreTests(TestCase):
             ),
         )
 
-        store = store_for_test(self, get_config, lambda: now)
+        store = self.useFixture(TemporaryVoucherStore(get_config, lambda: now)).store
         store.add(voucher_value, random)
         store.insert_unblinded_tokens_for_voucher(voucher_value, unblinded)
         loaded_voucher = store.get(voucher_value)
@@ -322,7 +325,7 @@ class UnblindedTokenStoreTests(TestCase):
         A voucher which is reported as double-spent is marked in the database as
         such.
         """
-        store = store_for_test(self, get_config, lambda: now)
+        store = self.useFixture(TemporaryVoucherStore(get_config, lambda: now)).store
         store.add(voucher_value, random_tokens)
         store.mark_voucher_double_spent(voucher_value)
         voucher = store.get(voucher_value)
@@ -362,7 +365,7 @@ class UnblindedTokenStoreTests(TestCase):
                 unique=True,
             ),
         )
-        store = store_for_test(self, get_config, lambda: now)
+        store = self.useFixture(TemporaryVoucherStore(get_config, lambda: now)).store
         store.add(voucher_value, random)
         store.insert_unblinded_tokens_for_voucher(voucher_value, unblinded)
         try:
@@ -383,7 +386,7 @@ class UnblindedTokenStoreTests(TestCase):
         """
         A voucher which is not known cannot be marked as double-spent.
         """
-        store = store_for_test(self, get_config, lambda: now)
+        store = self.useFixture(TemporaryVoucherStore(get_config, lambda: now)).store
         try:
             result = store.mark_voucher_double_spent(voucher_value)
         except ValueError:
-- 
GitLab