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

102 lines
4.8 KiB
Python
Raw Normal View History

from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from .base import FunctionalTest
class DashboardMaintenanceTest(FunctionalTest):
def test_user_without_username_can_claim_unclaimed_username(self):
# 1. Create a pre-authenticated session for discoman@example.com
self.create_pre_authenticated_session("discoman@example.com")
# 2. Navigate to self.live_server_url + "/"
self.browser.get(self.live_server_url)
# 3. Find the username applet on the page; look for a <section> or <div> with id="id_username_applet"
self.browser.find_element(By.ID, "id_applet_username")
# 4. Assert it shows the current display name (truncated email: di…an@e…e.com)
self.assertIn("di…an@e…e.com", self.browser.find_element(By.ID, "id_applet_username").text)
# 5. Find the username input field inside the applet & type a username
username_input = self.browser.find_element(By.CSS_SELECTOR, "#id_new_username")
# 6. Type a username, e.g., discoman
username_input.send_keys("discoman")
self.wait_for(
lambda: self.browser.find_element(By.CSS_SELECTOR, "#id_new_username:valid")
)
# 7. Submit the form (click a btn or press Enter)
username_input.send_keys(Keys.ENTER)
# 8. Without a page reload, wait for the navbar to update; user wait_for() to check that the navbar text now contains "discoman"
self.wait_for(
lambda: self.assertIn(
"discoman",
self.browser.find_element(By.CLASS_NAME, "navbar-text").text
)
)
# 9. Also assert the applet input now shows "discoman" as its value
self.wait_for(
lambda: self.assertEqual(
"discoman",
self.browser.find_element(By.CSS_SELECTOR, "#id_new_username").get_attribute("value")
)
)
def test_user_can_toggle_applet_visibility_via_gear_menu(self):
# 1. Auth as discoman@example.com, navigate home
self.create_pre_authenticated_session("discoman@example.com")
self.browser.get(self.live_server_url)
# 2. Assert both applets present on page (id_applet_username, id_applet_theme_switcher)
self.browser.find_element(By.ID, "id_applet_username")
self.browser.find_element(By.ID, "id_applet_theme_switcher")
# 3. Click el w. id="id_dash_gear"
dash_gear = self.browser.find_element(By.ID, "id_dash_gear")
dash_gear.click()
# 4. A menu appears; wait_for el w. id="id_applet_menu"
self.wait_for(
lambda: self.browser.find_element(By.ID, "id_applet_menu")
)
# 5. Find two checkboxes in menu, name="username" & name="theme-switcher"; assert both .is_selected()
menu = self.browser.find_element(By.ID, "id_applet_menu")
username_cb = menu.find_element(By.NAME, "username")
theme_cb = menu.find_element(By.NAME, "theme-switcher")
self.assertTrue(username_cb.is_selected())
self.assertTrue(theme_cb.is_selected())
# 6. Click theme-switcher box to uncheck it
theme_cb.click()
self.assertFalse(theme_cb.is_selected())
self.browser.execute_script("window.__no_reload_marker = True")
# 7. Submit the menu form via [type="submit"] btn inside menu
menu.find_element(By.CSS_SELECTOR, '[type="submit"]').click()
self.wait_for(
lambda: self.assertFalse(
self.browser.find_element(By.ID, "id_applet_menu").is_displayed()
)
)
# 8. wait_for theme-switcher applet to be gone
self.wait_for(
lambda: self.assertRaises(
NoSuchElementException,
self.browser.find_element,
By.ID, "id_applet_theme_switcher"
)
)
# 9. assert id_applet_username remains
self.browser.find_element(By.ID, "id_applet_username")
# 10. Click gear again, find menu, find theme-switcher checkbox; assert now NOT selected
dash_gear.click()
self.assertFalse(theme_cb.is_selected())
# 11. Click it to re-check box; submit
theme_cb.click()
self.assertTrue(theme_cb.is_selected())
menu.find_element(By.CSS_SELECTOR, '[type="submit"]').click()
# 12. wait_for id_applet_theme_switcher to reappear
self.wait_for(
lambda: self.assertFalse(
self.browser.find_element(By.ID, "id_applet_menu").is_displayed()
)
)
self.wait_for(
lambda: self.assertTrue(
self.browser.find_element(By.ID, "id_applet_theme_switcher")
)
)
self.assertTrue(self.browser.execute_script("return window.__no_reload_marker === true"))