2026-03-24 23:29:32 -04:00
|
|
|
from selenium.webdriver.common.action_chains import ActionChains
|
2026-03-15 01:17:09 -04:00
|
|
|
from selenium.webdriver.common.by import By
|
|
|
|
|
from selenium.webdriver.common.keys import Keys
|
|
|
|
|
|
|
|
|
|
from .base import FunctionalTest
|
2026-03-25 01:08:12 -04:00
|
|
|
from apps.epic.models import DeckVariant, Room
|
2026-03-15 01:17:09 -04:00
|
|
|
from apps.lyric.models import Token, User
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class GameKitTest(FunctionalTest):
|
|
|
|
|
"""Game Kit <dialog>: opens from footer, shows token cards, dismisses."""
|
|
|
|
|
|
|
|
|
|
def setUp(self):
|
|
|
|
|
super().setUp()
|
2026-03-25 01:08:12 -04:00
|
|
|
self.earthman, _ = DeckVariant.objects.get_or_create(
|
|
|
|
|
slug="earthman",
|
|
|
|
|
defaults={"name": "Earthman Deck", "card_count": 108, "is_default": True},
|
|
|
|
|
)
|
2026-03-15 01:17:09 -04:00
|
|
|
self.create_pre_authenticated_session("gamer@kit.io")
|
|
|
|
|
self.gamer = User.objects.get(email="gamer@kit.io")
|
2026-03-25 01:08:12 -04:00
|
|
|
self.gamer.equipped_deck = self.earthman
|
|
|
|
|
self.gamer.save(update_fields=["equipped_deck"])
|
|
|
|
|
self.gamer.unlocked_decks.add(self.earthman)
|
2026-03-15 01:17:09 -04:00
|
|
|
self.token = self.gamer.tokens.filter(token_type=Token.COIN).first()
|
|
|
|
|
self.room = Room.objects.create(name="Kit Room", owner=self.gamer)
|
|
|
|
|
self.gate_url = self.live_server_url + f"/gameboard/room/{self.room.id}/gate/"
|
|
|
|
|
|
|
|
|
|
def test_kit_btn_in_footer_opens_dialog(self):
|
|
|
|
|
self.browser.get(self.gate_url)
|
|
|
|
|
kit_btn = self.wait_for(
|
|
|
|
|
lambda: self.browser.find_element(By.ID, "id_kit_btn")
|
|
|
|
|
)
|
|
|
|
|
self.assertTrue(kit_btn.is_displayed())
|
|
|
|
|
kit_btn.click()
|
2026-03-15 01:46:11 -04:00
|
|
|
self.wait_for(
|
|
|
|
|
lambda: self.assertTrue(
|
|
|
|
|
self.browser.find_element(By.ID, "id_kit_bag_dialog").is_displayed()
|
|
|
|
|
)
|
2026-03-15 01:17:09 -04:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def test_kit_dialog_shows_token_cards(self):
|
|
|
|
|
self.browser.get(self.gate_url)
|
|
|
|
|
self.browser.find_element(By.ID, "id_kit_btn").click()
|
|
|
|
|
self.wait_for(
|
|
|
|
|
lambda: self.browser.find_element(
|
|
|
|
|
By.CSS_SELECTOR,
|
|
|
|
|
f"#id_kit_bag_dialog [data-token-id='{self.token.id}']",
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def test_kit_dialog_closes_on_escape(self):
|
|
|
|
|
self.browser.get(self.gate_url)
|
|
|
|
|
self.browser.find_element(By.ID, "id_kit_btn").click()
|
2026-03-15 01:46:11 -04:00
|
|
|
self.wait_for(
|
|
|
|
|
lambda: self.assertTrue(
|
|
|
|
|
self.browser.find_element(By.ID, "id_kit_bag_dialog").is_displayed()
|
|
|
|
|
)
|
2026-03-15 01:17:09 -04:00
|
|
|
)
|
2026-03-15 01:46:11 -04:00
|
|
|
dialog = self.browser.find_element(By.ID, "id_kit_bag_dialog")
|
2026-03-15 01:17:09 -04:00
|
|
|
dialog.send_keys(Keys.ESCAPE)
|
|
|
|
|
self.wait_for(
|
|
|
|
|
lambda: self.assertFalse(
|
|
|
|
|
self.browser.find_element(By.ID, "id_kit_bag_dialog").is_displayed()
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def test_kit_btn_visible_outside_room(self):
|
|
|
|
|
self.browser.get(self.live_server_url + "/")
|
|
|
|
|
kit_btn = self.wait_for(
|
|
|
|
|
lambda: self.browser.find_element(By.ID, "id_kit_btn")
|
|
|
|
|
)
|
|
|
|
|
self.assertTrue(kit_btn.is_displayed())
|
2026-03-24 23:18:04 -04:00
|
|
|
|
|
|
|
|
def test_kit_dialog_shows_equipped_deck(self):
|
|
|
|
|
"""New user auto-gets Earthman equipped; kit bar shows its deck card."""
|
|
|
|
|
self.browser.get(self.gate_url)
|
|
|
|
|
self.browser.find_element(By.ID, "id_kit_btn").click()
|
|
|
|
|
self.wait_for(
|
|
|
|
|
lambda: self.browser.find_element(
|
|
|
|
|
By.CSS_SELECTOR,
|
|
|
|
|
f"#id_kit_bag_dialog .kit-bag-deck[data-deck-id='{self.gamer.equipped_deck.pk}']",
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def test_kit_dialog_always_shows_dice_placeholder(self):
|
|
|
|
|
self.browser.get(self.gate_url)
|
|
|
|
|
self.browser.find_element(By.ID, "id_kit_btn").click()
|
|
|
|
|
self.wait_for(
|
|
|
|
|
lambda: self.browser.find_element(
|
|
|
|
|
By.CSS_SELECTOR,
|
|
|
|
|
"#id_kit_bag_dialog .kit-bag-placeholder",
|
|
|
|
|
)
|
|
|
|
|
)
|
2026-03-24 23:29:32 -04:00
|
|
|
|
|
|
|
|
def test_kit_dialog_deck_tooltip_shows_name_count_availability_and_stock_version(self):
|
|
|
|
|
self.browser.get(self.gate_url)
|
|
|
|
|
self.browser.find_element(By.ID, "id_kit_btn").click()
|
|
|
|
|
deck_el = self.wait_for(
|
|
|
|
|
lambda: self.browser.find_element(
|
|
|
|
|
By.CSS_SELECTOR, "#id_kit_bag_dialog .kit-bag-deck"
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
ActionChains(self.browser).move_to_element(deck_el).perform()
|
|
|
|
|
tooltip = self.browser.find_element(
|
|
|
|
|
By.CSS_SELECTOR, "#id_kit_bag_dialog .kit-bag-deck .token-tooltip"
|
|
|
|
|
)
|
|
|
|
|
self.wait_for(lambda: self.assertTrue(tooltip.is_displayed()))
|
|
|
|
|
text = tooltip.text
|
|
|
|
|
self.assertIn("Earthman", text)
|
|
|
|
|
self.assertIn("(Default)", text)
|
|
|
|
|
self.assertIn("108", text)
|
|
|
|
|
self.assertIn("active", text)
|
|
|
|
|
self.assertIn("Stock version", text)
|