"""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)