tarot card icons + ranks; sig fallback for pre-sync Characters; DECKS label sizing — TDD
- migration 0011: The Nomad (0) → fa-hat-cowboy; The Schizo (1) → fa-hat-wizard - corner_rank: non-MAJOR pip card 1 → 'A' (Ace); court unchanged (M/J/Q/K); TDD - 17 unit model tests for corner_rank + suit_icon - _role_select_context: my_tray_sig falls back to seat.significator when confirmed_char.significator is None (Characters created before natus_save sync) - _card-deck.scss: DECKS label bigger (1rem, 0.32em letter-spacing) to fill stack height; sea-stack-name: opacity 0.6, scaleY(1.5), margin-top -0.4rem partially under face; sea-stack-face z-index:1 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:
72
src/apps/epic/tests/unit/test_models.py
Normal file
72
src/apps/epic/tests/unit/test_models.py
Normal file
@@ -0,0 +1,72 @@
|
||||
from django.test import SimpleTestCase
|
||||
|
||||
from apps.epic.models import TarotCard
|
||||
|
||||
|
||||
def _card(arcana, number, suit='', icon=''):
|
||||
c = TarotCard()
|
||||
c.arcana = arcana
|
||||
c.number = number
|
||||
c.suit = suit
|
||||
c.icon = icon
|
||||
return c
|
||||
|
||||
|
||||
class TarotCardCornerRankTest(SimpleTestCase):
|
||||
"""TarotCard.corner_rank — alphanumeric display labels."""
|
||||
|
||||
def test_major_arcana_0_gives_0(self):
|
||||
self.assertEqual(_card('MAJOR', 0).corner_rank, '0')
|
||||
|
||||
def test_major_arcana_1_gives_roman_I(self):
|
||||
self.assertEqual(_card('MAJOR', 1).corner_rank, 'I')
|
||||
|
||||
def test_major_arcana_2_gives_roman_II(self):
|
||||
self.assertEqual(_card('MAJOR', 2).corner_rank, 'II')
|
||||
|
||||
def test_non_major_pip_1_gives_A(self):
|
||||
"""Ace — pip card number 1 should show 'A', not '1'."""
|
||||
self.assertEqual(_card('MIDDLE', 1, 'BRANDS').corner_rank, 'A')
|
||||
|
||||
def test_non_major_pip_2_gives_2(self):
|
||||
self.assertEqual(_card('MIDDLE', 2, 'BRANDS').corner_rank, '2')
|
||||
|
||||
def test_non_major_pip_10_gives_10(self):
|
||||
self.assertEqual(_card('MIDDLE', 10, 'CROWNS').corner_rank, '10')
|
||||
|
||||
def test_court_maid_gives_M(self):
|
||||
self.assertEqual(_card('MIDDLE', 11, 'GRAILS').corner_rank, 'M')
|
||||
|
||||
def test_court_jack_gives_J(self):
|
||||
self.assertEqual(_card('MIDDLE', 12, 'BLADES').corner_rank, 'J')
|
||||
|
||||
def test_court_queen_gives_Q(self):
|
||||
self.assertEqual(_card('MIDDLE', 13, 'BRANDS').corner_rank, 'Q')
|
||||
|
||||
def test_court_king_gives_K(self):
|
||||
self.assertEqual(_card('MIDDLE', 14, 'CROWNS').corner_rank, 'K')
|
||||
|
||||
|
||||
class TarotCardSuitIconTest(SimpleTestCase):
|
||||
"""TarotCard.suit_icon — icon class resolution."""
|
||||
|
||||
def test_major_with_icon_returns_icon(self):
|
||||
self.assertEqual(_card('MAJOR', 0, icon='fa-hat-cowboy').suit_icon, 'fa-hat-cowboy')
|
||||
|
||||
def test_major_without_icon_returns_empty(self):
|
||||
self.assertEqual(_card('MAJOR', 5).suit_icon, '')
|
||||
|
||||
def test_brands_returns_wand_sparkles(self):
|
||||
self.assertEqual(_card('MIDDLE', 11, 'BRANDS').suit_icon, 'fa-wand-sparkles')
|
||||
|
||||
def test_grails_returns_trophy(self):
|
||||
self.assertEqual(_card('MIDDLE', 11, 'GRAILS').suit_icon, 'fa-trophy')
|
||||
|
||||
def test_blades_returns_gun(self):
|
||||
self.assertEqual(_card('MIDDLE', 11, 'BLADES').suit_icon, 'fa-gun')
|
||||
|
||||
def test_crowns_returns_crown(self):
|
||||
self.assertEqual(_card('MIDDLE', 11, 'CROWNS').suit_icon, 'fa-crown')
|
||||
|
||||
def test_icon_override_takes_priority_over_suit(self):
|
||||
self.assertEqual(_card('MIDDLE', 11, 'CROWNS', icon='fa-star').suit_icon, 'fa-star')
|
||||
Reference in New Issue
Block a user