from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from .base import FunctionalTest from apps.epic.models import DeckVariant, Room from apps.lyric.models import Token, User class GameKitTest(FunctionalTest): """Game Kit : opens from footer, shows token cards, dismisses.""" def setUp(self): super().setUp() self.earthman, _ = DeckVariant.objects.get_or_create( slug="earthman", defaults={"name": "Earthman Deck", "card_count": 108, "is_default": True}, ) self.create_pre_authenticated_session("gamer@kit.io") self.gamer = User.objects.get(email="gamer@kit.io") self.gamer.equipped_deck = self.earthman self.gamer.save(update_fields=["equipped_deck"]) self.gamer.unlocked_decks.add(self.earthman) 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() self.wait_for( lambda: self.assertTrue( self.browser.find_element(By.ID, "id_kit_bag_dialog").is_displayed() ) ) 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() self.wait_for( lambda: self.assertTrue( self.browser.find_element(By.ID, "id_kit_bag_dialog").is_displayed() ) ) dialog = self.browser.find_element(By.ID, "id_kit_bag_dialog") 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()) 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", ) ) 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)