76 lines
3.2 KiB
Python
76 lines
3.2 KiB
Python
|
|
"""FT for the My Buddies page — buddy btn + slide-out add flow.
|
||
|
|
|
||
|
|
Phase 1 of the buddies sprint: explicit add via my_buddies.html. Phase 2
|
||
|
|
will layer autocomplete (sky-place-style top-3 username suggestions) and
|
||
|
|
implicit auto-add on post-share / gate-invite.
|
||
|
|
"""
|
||
|
|
from selenium.webdriver.common.by import By
|
||
|
|
from selenium.webdriver.common.keys import Keys
|
||
|
|
|
||
|
|
from apps.lyric.models import User
|
||
|
|
|
||
|
|
from .base import FunctionalTest
|
||
|
|
|
||
|
|
|
||
|
|
class MyBuddiesPageTest(FunctionalTest):
|
||
|
|
def setUp(self):
|
||
|
|
super().setUp()
|
||
|
|
self.gamer = User.objects.create(email="me@test.io", username="me")
|
||
|
|
self.alice = User.objects.create(email="alice@test.io", username="alice")
|
||
|
|
self.create_pre_authenticated_session("me@test.io")
|
||
|
|
|
||
|
|
def test_renders_existing_buddies(self):
|
||
|
|
"""Pre-existing buddies show up as entries on first render."""
|
||
|
|
self.gamer.buddies.add(self.alice)
|
||
|
|
self.browser.get(self.live_server_url + "/billboard/my-buddies/")
|
||
|
|
entry = self.wait_for(
|
||
|
|
lambda: self.browser.find_element(By.CSS_SELECTOR, ".buddy-entry .buddy-name")
|
||
|
|
)
|
||
|
|
self.assertEqual(entry.text, "alice")
|
||
|
|
|
||
|
|
def test_empty_state_when_no_buddies(self):
|
||
|
|
self.browser.get(self.live_server_url + "/billboard/my-buddies/")
|
||
|
|
empty = self.wait_for(
|
||
|
|
lambda: self.browser.find_element(By.CSS_SELECTOR, ".buddy-entry--empty")
|
||
|
|
)
|
||
|
|
self.assertIn("No buddies yet", empty.text)
|
||
|
|
|
||
|
|
def test_add_buddy_via_buddy_btn_appends_entry(self):
|
||
|
|
self.browser.get(self.live_server_url + "/billboard/my-buddies/")
|
||
|
|
btn = self.wait_for(lambda: self.browser.find_element(By.ID, "id_buddy_btn"))
|
||
|
|
btn.click()
|
||
|
|
|
||
|
|
recipient = self.wait_for(lambda: self.browser.find_element(By.ID, "id_recipient"))
|
||
|
|
recipient.send_keys("alice@test.io")
|
||
|
|
ok = self.browser.find_element(By.CSS_SELECTOR, "#id_buddy_panel .btn.btn-confirm")
|
||
|
|
ok.click()
|
||
|
|
|
||
|
|
# New entry appears w. alice's username (not the bare email)
|
||
|
|
self.wait_for(lambda: self.assertEqual(
|
||
|
|
self.browser.find_element(
|
||
|
|
By.CSS_SELECTOR, f".buddy-entry[data-buddy-id='{self.alice.id}'] .buddy-name"
|
||
|
|
).text,
|
||
|
|
"alice",
|
||
|
|
))
|
||
|
|
# Server-side persisted
|
||
|
|
self.wait_for(lambda: self.assertIn(
|
||
|
|
self.alice, list(self.gamer.buddies.all())
|
||
|
|
))
|
||
|
|
|
||
|
|
def test_add_unregistered_email_is_silent_noop(self):
|
||
|
|
self.browser.get(self.live_server_url + "/billboard/my-buddies/")
|
||
|
|
btn = self.wait_for(lambda: self.browser.find_element(By.ID, "id_buddy_btn"))
|
||
|
|
btn.click()
|
||
|
|
recipient = self.wait_for(lambda: self.browser.find_element(By.ID, "id_recipient"))
|
||
|
|
recipient.send_keys("ghost@test.io")
|
||
|
|
ok = self.browser.find_element(By.CSS_SELECTOR, "#id_buddy_panel .btn.btn-confirm")
|
||
|
|
ok.click()
|
||
|
|
|
||
|
|
# Wait for the panel close (a positive signal the request landed)
|
||
|
|
self.wait_for(lambda: self.assertNotIn(
|
||
|
|
"active", btn.get_attribute("class")
|
||
|
|
))
|
||
|
|
# No entries beyond the empty-state row
|
||
|
|
entries = self.browser.find_elements(By.CSS_SELECTOR, ".buddy-entry:not(.buddy-entry--empty)")
|
||
|
|
self.assertEqual(len(entries), 0)
|