SIG SELECT: Nomad/Schizo locked by default; Note-unlock gate — TDD

- _filter_major_unlocks(cards, user): strips Major 0 (Nomad) and Major 1
  (Schizo) unless user has matching 'nomad'/'schizo' Note; unauthenticated
  users see 0 majors
- levity_sig_cards(room, user) / gravity_sig_cards(room, user): accept user
  param; default 16 court cards, up to 18 with both Note unlocks
- View wires user into both calls; _sig_unique_cards / sig_deck_cards unchanged
  (game-table deck still includes all 18 unique)
- _full_sig_setUp: seats now carry deck_variant=earthman
- SigCardHelperTest: 4 new ITs (default 16, nomad +1, schizo +1); empty-deck
  test updated to clear seats + owner
- SigSelectRenderingTest: 18-card test updated to 16-default + 3 Note-unlock ITs

Pending: superusers auto-granted nomad + schizo Notes on creation (ask user)

Code architected by Disco DeDisco <discodedisco@outlook.com>
Git commit message Co-Authored-By:
Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Disco DeDisco
2026-04-28 01:05:25 -04:00
parent eaff2a1edb
commit 1c2b8f96ab
4 changed files with 77 additions and 25 deletions

View File

@@ -5,7 +5,7 @@ from django.test import TestCase
from django.urls import reverse
from django.utils import timezone
from apps.drama.models import GameEvent
from apps.drama.models import GameEvent, Note
from apps.lyric.models import Token, User
from apps.epic.models import (
Character, DeckVariant, GateSlot, Room, RoomInvite, SigReservation, TableSeat, TarotCard,
@@ -1032,7 +1032,8 @@ def _full_sig_setUp(test_case, role_order=None):
slot.status = GateSlot.FILLED
slot.save()
TableSeat.objects.create(
room=room, gamer=gamer, slot_number=i, role=role, role_revealed=True,
room=room, gamer=gamer, slot_number=i, role=role,
role_revealed=True, deck_variant=earthman,
)
room.gate_status = Room.OPEN
room.table_status = Room.SIG_SELECT
@@ -1055,7 +1056,24 @@ class SigSelectRenderingTest(TestCase):
response = self.client.get(self.url)
self.assertContains(response, "id_sig_deck")
def test_sig_deck_contains_18_sig_cards(self):
def test_sig_deck_contains_16_sig_cards_by_default(self):
"""Without Note unlocks the deck shows only 16 court cards (no Nomad/Schizo)."""
response = self.client.get(self.url)
self.assertEqual(response.content.decode().count('data-card-id='), 16)
def test_nomad_note_adds_nomad_to_sig_deck(self):
Note.objects.create(user=self.gamers[0], slug="nomad", earned_at=timezone.now())
response = self.client.get(self.url)
self.assertEqual(response.content.decode().count('data-card-id='), 17)
def test_schizo_note_adds_schizo_to_sig_deck(self):
Note.objects.create(user=self.gamers[0], slug="schizo", earned_at=timezone.now())
response = self.client.get(self.url)
self.assertEqual(response.content.decode().count('data-card-id='), 17)
def test_both_notes_gives_18_sig_cards(self):
Note.objects.create(user=self.gamers[0], slug="nomad", earned_at=timezone.now())
Note.objects.create(user=self.gamers[0], slug="schizo", earned_at=timezone.now())
response = self.client.get(self.url)
self.assertEqual(response.content.decode().count('data-card-id='), 18)