Files
python-tdd/src/functional_tests/test_pick_sky.py

126 lines
4.7 KiB
Python
Raw Normal View History

"""Functional tests for the PICK SKY overlay — natal chart entry."""
from selenium.webdriver.common.by import By
from apps.applets.models import Applet
from apps.epic.models import GateSlot, Room
from apps.lyric.models import User
from .base import FunctionalTest
def _make_sky_select_room():
"""Minimal SKY_SELECT room — just enough for the overlay to render."""
email = "founder@test.io"
gamer, _ = User.objects.get_or_create(email=email)
room = Room.objects.create(name="Sky Test Room", table_status=Room.SKY_SELECT, owner=gamer)
# Put the founder in slot 1 so the view recognises them as a participant
slot = room.gate_slots.get(slot_number=1)
slot.gamer = gamer
slot.status = GateSlot.FILLED
slot.save()
room.gate_status = Room.OPEN
room.save()
return room, gamer, email
class PickSkyLocalStorageTest(FunctionalTest):
"""PICK SKY form fields persist to localStorage."""
def setUp(self):
super().setUp()
Applet.objects.get_or_create(
slug="new-game", defaults={"name": "New Game", "context": "gameboard"}
)
Applet.objects.get_or_create(
slug="my-games", defaults={"name": "My Games", "context": "gameboard"}
)
self.room, self.founder, self.founder_email = _make_sky_select_room()
self.room_url = (
self.live_server_url + f"/gameboard/room/{self.room.id}/"
)
def _open_overlay(self):
btn = self.wait_for(
lambda: self.browser.find_element(By.ID, "id_pick_sky_btn")
)
self.browser.execute_script("arguments[0].click()", btn)
self.wait_for(
lambda: self.browser.find_element(By.ID, "id_natus_overlay")
)
def _fill_form(self):
"""Set date, lat, lon directly (bypasses Nominatim network call)."""
self.browser.execute_script(
"document.getElementById('id_nf_date').value = '1990-02-28';"
"document.getElementById('id_nf_lat').value = '39.8244';"
"document.getElementById('id_nf_lon').value = '-74.9970';"
"document.getElementById('id_nf_place').value = 'Lindenwold, NJ';"
"document.getElementById('id_nf_tz').value = 'America/New_York';"
)
# Fire input events so the save listener triggers
self.browser.execute_script("""
['id_nf_date','id_nf_lat','id_nf_lon','id_nf_place','id_nf_tz'].forEach(id => {
const el = document.getElementById(id);
el.dispatchEvent(new Event('input', {bubbles: true}));
});
""")
def _field_values(self):
return self.browser.execute_script("""
return {
date: document.getElementById('id_nf_date').value,
lat: document.getElementById('id_nf_lat').value,
lon: document.getElementById('id_nf_lon').value,
place: document.getElementById('id_nf_place').value,
tz: document.getElementById('id_nf_tz').value,
};
""")
# ------------------------------------------------------------------ #
# T1 — fields survive NVM (close + reopen, same page load) #
# ------------------------------------------------------------------ #
def test_form_fields_repopulated_after_nvm(self):
self.create_pre_authenticated_session(self.founder_email)
self.browser.get(self.room_url)
self._open_overlay()
self._fill_form()
# Close via NVM
self.browser.find_element(By.ID, "id_natus_cancel").click()
# Reopen
self._open_overlay()
values = self._field_values()
self.assertEqual(values["date"], "1990-02-28")
self.assertEqual(values["lat"], "39.8244")
self.assertEqual(values["lon"], "-74.9970")
self.assertEqual(values["place"], "Lindenwold, NJ")
self.assertEqual(values["tz"], "America/New_York")
# ------------------------------------------------------------------ #
# T2 — fields survive a page refresh #
# ------------------------------------------------------------------ #
def test_form_fields_repopulated_after_page_refresh(self):
self.create_pre_authenticated_session(self.founder_email)
self.browser.get(self.room_url)
self._open_overlay()
self._fill_form()
# Refresh the page
self.browser.refresh()
self._open_overlay()
values = self._field_values()
self.assertEqual(values["date"], "1990-02-28")
self.assertEqual(values["lat"], "39.8244")
self.assertEqual(values["lon"], "-74.9970")
self.assertEqual(values["place"], "Lindenwold, NJ")
self.assertEqual(values["tz"], "America/New_York")