new _kit_bag_panel.html partial in core to allow user to manage equipped kit items from anywhere on site; #id_kit_btn moved from _footer.html partial directly into a base.html include; new trinket for superusers now incl. in apps.lyric.models; apps.gameboard.views handles this new type of PASS token; apps.epic.views allows payment with several different token types based on rarity & expiration hierarchy; kit bag and PASS functionality now handled in apps.dashboard.views; /kit-bag/ now pathed in .urls; styles abound; fully passing test suite (tho much work to be done, chiefly with stacking like coins in FEFO order)
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
This commit is contained in:
61
src/functional_tests/test_game_kit.py
Normal file
61
src/functional_tests/test_game_kit.py
Normal file
@@ -0,0 +1,61 @@
|
||||
from selenium.webdriver.common.by import By
|
||||
from selenium.webdriver.common.keys import Keys
|
||||
|
||||
from .base import FunctionalTest
|
||||
from apps.epic.models import Room
|
||||
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()
|
||||
self.create_pre_authenticated_session("gamer@kit.io")
|
||||
self.gamer = User.objects.get(email="gamer@kit.io")
|
||||
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()
|
||||
dialog = self.wait_for(
|
||||
lambda: self.browser.find_element(By.ID, "id_kit_bag_dialog")
|
||||
)
|
||||
self.assertTrue(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()
|
||||
dialog = self.wait_for(
|
||||
lambda: self.browser.find_element(By.ID, "id_kit_bag_dialog")
|
||||
)
|
||||
self.assertTrue(dialog.is_displayed())
|
||||
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())
|
||||
@@ -501,3 +501,82 @@ class TokenPriorityTest(FunctionalTest):
|
||||
self.assertTrue(Token.objects.filter(pk=pass_token.pk).exists())
|
||||
self.coin.refresh_from_db()
|
||||
self.assertIsNone(self.coin.current_room)
|
||||
|
||||
|
||||
class GameKitInsertTest(FunctionalTest):
|
||||
"""Token selected from Game Kit, inserted via token-slot click."""
|
||||
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.create_pre_authenticated_session("gamer@insert.io")
|
||||
self.gamer = User.objects.get(email="gamer@insert.io")
|
||||
self.coin = self.gamer.tokens.filter(token_type=Token.COIN).first()
|
||||
self.room = Room.objects.create(name="Insert Room", owner=self.gamer)
|
||||
self.gate_url = self.live_server_url + f"/gameboard/room/{self.room.id}/gate/"
|
||||
|
||||
def _select_token_from_kit(self, token):
|
||||
self.browser.find_element(By.ID, "id_kit_btn").click()
|
||||
self.wait_for(
|
||||
lambda: self.browser.find_element(
|
||||
By.CSS_SELECTOR, f"[data-token-id='{token.id}']"
|
||||
).click()
|
||||
)
|
||||
self.wait_for(
|
||||
lambda: self.browser.find_element(By.CSS_SELECTOR, ".token-slot.ready")
|
||||
)
|
||||
|
||||
def test_coin_insert_via_kit_reserves_slot(self):
|
||||
self.browser.get(self.gate_url)
|
||||
self._select_token_from_kit(self.coin)
|
||||
self.browser.find_element(By.CSS_SELECTOR, "button.token-rails").click()
|
||||
self.wait_for(
|
||||
lambda: self.browser.find_element(By.CSS_SELECTOR, ".gate-slot.reserved")
|
||||
)
|
||||
self.assertEqual(self.browser.current_url, self.gate_url)
|
||||
|
||||
def test_free_token_insert_via_kit_consumed_on_confirm(self):
|
||||
token = Token.objects.create(
|
||||
user=self.gamer,
|
||||
token_type=Token.FREE,
|
||||
expires_at=timezone.now() + timedelta(days=7),
|
||||
)
|
||||
self.browser.get(self.gate_url)
|
||||
self._select_token_from_kit(token)
|
||||
self.browser.find_element(By.CSS_SELECTOR, "button.token-rails").click()
|
||||
self.wait_for(
|
||||
lambda: self.browser.find_element(
|
||||
By.CSS_SELECTOR, ".gate-slot[data-slot='1'] .btn-confirm"
|
||||
)
|
||||
).click()
|
||||
self.wait_for(
|
||||
lambda: self.browser.find_element(By.CSS_SELECTOR, ".gate-slot.filled")
|
||||
)
|
||||
self.assertFalse(Token.objects.filter(id=token.id).exists())
|
||||
|
||||
def test_tithe_token_insert_via_kit_consumed_on_confirm(self):
|
||||
token = Token.objects.create(user=self.gamer, token_type=Token.TITHE)
|
||||
self.browser.get(self.gate_url)
|
||||
self._select_token_from_kit(token)
|
||||
self.browser.find_element(By.CSS_SELECTOR, "button.token-rails").click()
|
||||
self.wait_for(
|
||||
lambda: self.browser.find_element(
|
||||
By.CSS_SELECTOR, ".gate-slot[data-slot='1'] .btn-confirm"
|
||||
)
|
||||
).click()
|
||||
self.wait_for(
|
||||
lambda: self.browser.find_element(By.CSS_SELECTOR, ".gate-slot.filled")
|
||||
)
|
||||
self.assertFalse(Token.objects.filter(id=token.id).exists())
|
||||
|
||||
def test_pass_token_insert_via_kit_not_consumed(self):
|
||||
self.gamer.is_staff = True
|
||||
self.gamer.save()
|
||||
pass_token = Token.objects.create(user=self.gamer, token_type=Token.PASS)
|
||||
self.browser.get(self.gate_url)
|
||||
self._select_token_from_kit(pass_token)
|
||||
self.browser.find_element(By.CSS_SELECTOR, "button.token-rails").click()
|
||||
self.wait_for(
|
||||
lambda: self.browser.find_element(By.CSS_SELECTOR, ".gate-slot.reserved")
|
||||
)
|
||||
self.assertTrue(Token.objects.filter(id=pass_token.id).exists())
|
||||
self.assertEqual(self.browser.current_url, self.gate_url)
|
||||
|
||||
Reference in New Issue
Block a user