new apps.epic app migrations for token expiration & cooldown; reject token renamed to return token everywhere; new mapps.epic.models & .views for expiration & cooldown; new apps.dash.views to manage stacking of like Token types not just in the kit bag but in the Gameboard's Game Kit applet & in the Dashwallet's Tokens applet; Free Tokens now display correctly in kit bag; apps.lyric.admin now ensures superuser cannot grant Free Tokens without an expiration date; corresponding tests in .tests.integrated.test_admin.TokenAdminFormTest; screendumps occurring for every test, regardless of passfail status, after one fail fixed in FTs.base; FTs.test_gatekeeper.GameKitInsertTest.test_free_token_insert_via_kit_consumed_on_confirm, for test purposes only, ensures starting Free Token deleted before fresh one assigned w. full 7d expiration battery
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
from datetime import timedelta
|
||||
from django.test import TestCase
|
||||
from django.urls import reverse
|
||||
from django.utils import timezone
|
||||
@@ -189,7 +190,7 @@ class ConfirmTokenViewTest(TestCase):
|
||||
self.assertEqual(self.slot.status, GateSlot.EMPTY)
|
||||
|
||||
|
||||
class RejectTokenViewTest(TestCase):
|
||||
class ReturnTokenViewTest(TestCase):
|
||||
def setUp(self):
|
||||
self.gamer = User.objects.create(email="gamer@test.io")
|
||||
self.client.force_login(self.gamer)
|
||||
@@ -201,33 +202,73 @@ class RejectTokenViewTest(TestCase):
|
||||
self.slot.reserved_at = timezone.now()
|
||||
self.slot.save()
|
||||
|
||||
def test_reject_clears_reserved_slot(self):
|
||||
def test_return_clears_reserved_slot(self):
|
||||
self.client.post(
|
||||
reverse("epic:reject_token", kwargs={"room_id": self.room.id})
|
||||
reverse("epic:return_token", kwargs={"room_id": self.room.id})
|
||||
)
|
||||
self.slot.refresh_from_db()
|
||||
self.assertEqual(self.slot.status, GateSlot.EMPTY)
|
||||
self.assertIsNone(self.slot.gamer)
|
||||
self.assertIsNone(self.slot.reserved_at)
|
||||
|
||||
def test_reject_after_confirm_clears_filled_slot(self):
|
||||
def test_return_after_confirm_clears_filled_slot(self):
|
||||
self.slot.status = GateSlot.FILLED
|
||||
self.slot.save()
|
||||
self.client.post(
|
||||
reverse("epic:reject_token", kwargs={"room_id": self.room.id})
|
||||
reverse("epic:return_token", kwargs={"room_id": self.room.id})
|
||||
)
|
||||
self.slot.refresh_from_db()
|
||||
self.assertEqual(self.slot.status, GateSlot.EMPTY)
|
||||
self.assertIsNone(self.slot.gamer)
|
||||
|
||||
def test_reject_redirects_to_gatekeeper(self):
|
||||
def test_return_redirects_to_gatekeeper(self):
|
||||
response = self.client.post(
|
||||
reverse("epic:reject_token", kwargs={"room_id": self.room.id})
|
||||
reverse("epic:return_token", kwargs={"room_id": self.room.id})
|
||||
)
|
||||
self.assertRedirects(
|
||||
response, reverse("epic:gatekeeper", args=[self.room.id])
|
||||
)
|
||||
|
||||
def test_return_restores_coin_token(self):
|
||||
coin = Token.objects.get(user=self.gamer, token_type=Token.COIN)
|
||||
coin.current_room = self.room
|
||||
coin.next_ready_at = timezone.now() + timedelta(days=7)
|
||||
coin.save()
|
||||
self.slot.status = GateSlot.FILLED
|
||||
self.slot.debited_token_type = Token.COIN
|
||||
self.slot.save()
|
||||
self.client.post(
|
||||
reverse("epic:return_token", kwargs={"room_id": self.room.id})
|
||||
)
|
||||
coin.refresh_from_db()
|
||||
self.assertIsNone(coin.current_room)
|
||||
self.assertIsNone(coin.next_ready_at)
|
||||
|
||||
def test_return_restores_free_token(self):
|
||||
Token.objects.filter(user=self.gamer, token_type=Token.FREE).delete()
|
||||
expires = timezone.now() + timedelta(days=3)
|
||||
self.slot.status = GateSlot.FILLED
|
||||
self.slot.debited_token_type = Token.FREE
|
||||
self.slot.debited_token_expires_at = expires
|
||||
self.slot.save()
|
||||
self.client.post(
|
||||
reverse("epic:return_token", kwargs={"room_id": self.room.id})
|
||||
)
|
||||
restored = Token.objects.filter(user=self.gamer, token_type=Token.FREE).first()
|
||||
self.assertIsNotNone(restored)
|
||||
self.assertEqual(restored.expires_at, expires)
|
||||
|
||||
def test_return_restores_tithe_token(self):
|
||||
self.slot.status = GateSlot.FILLED
|
||||
self.slot.debited_token_type = Token.TITHE
|
||||
self.slot.save()
|
||||
self.client.post(
|
||||
reverse("epic:return_token", kwargs={"room_id": self.room.id})
|
||||
)
|
||||
self.assertTrue(
|
||||
Token.objects.filter(user=self.gamer, token_type=Token.TITHE).exists()
|
||||
)
|
||||
|
||||
|
||||
class DropTokenAvailabilityViewTest(TestCase):
|
||||
def setUp(self):
|
||||
|
||||
Reference in New Issue
Block a user