From f88bf0393979b37a56151250fd94db4e3ac0625d Mon Sep 17 00:00:00 2001 From: jimmy Date: Sun, 8 Feb 2026 13:51:21 +1300 Subject: [PATCH] Update browser tests for mobile preset layout. This keeps UI checks aligned with the new tab/preset flows. Co-authored-by: Cursor --- tests/test_browser.py | 196 +++++++++++++++++++++++------------------- 1 file changed, 107 insertions(+), 89 deletions(-) diff --git a/tests/test_browser.py b/tests/test_browser.py index 4a1ea6d..a6de8b8 100644 --- a/tests/test_browser.py +++ b/tests/test_browser.py @@ -9,18 +9,14 @@ import time import requests from typing import Optional, List -try: - from selenium import webdriver - from selenium.webdriver.common.by import By - from selenium.webdriver.support.ui import WebDriverWait - from selenium.webdriver.support import expected_conditions as EC - from selenium.webdriver.chrome.options import Options - from selenium.webdriver.chrome.service import Service - from selenium.webdriver.common.action_chains import ActionChains - from selenium.common.exceptions import TimeoutException, NoSuchElementException -except ImportError: - print("Selenium not installed. Install with: pip install selenium") - sys.exit(1) +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.chrome.options import Options +from selenium.webdriver.chrome.service import Service +from selenium.webdriver.common.action_chains import ActionChains +from selenium.common.exceptions import TimeoutException, NoSuchElementException # Base URL for the device BASE_URL = "http://192.168.4.1" @@ -533,6 +529,44 @@ def test_profiles_ui(browser: BrowserTest) -> bool: print(f"\nBrowser profiles UI tests: {passed}/{total} passed") return passed == total + +def test_mobile_tab_presets_two_columns(): + """ + Verify that the tab preset selecting area shows roughly two preset tiles per row + on a phone-sized viewport. + """ + bt = BrowserTest(base_url=BASE_URL, headless=True) + if not bt.setup(): + assert False, "Failed to start browser" + + try: + # Simulate a mobile viewport + bt.driver.set_window_size(400, 800) + assert bt.navigate('/'), "Failed to load main page" + + # Click the first tab button to load presets for that tab + first_tab = bt.wait_for_element(By.CSS_SELECTOR, '.tab-button', timeout=10) + assert first_tab is not None, "No tab buttons found" + first_tab.click() + time.sleep(1) + + container = bt.wait_for_element(By.ID, 'presets-list-tab', timeout=10) + assert container is not None, "presets-list-tab not found" + + tiles = bt.driver.find_elements(By.CSS_SELECTOR, '#presets-list-tab .draggable-preset') + # Need at least 2 presets to make this meaningful + assert len(tiles) >= 2, "Fewer than 2 presets found for tab" + + container_width = container.size['width'] + first_width = tiles[0].size['width'] + + # Each tile should be about half the container width (tolerate some margin) + assert 0.4 * container_width <= first_width <= 0.6 * container_width, ( + f"Preset tile width {first_width} not ~half of container {container_width}" + ) + finally: + bt.teardown() + def test_presets_ui(browser: BrowserTest) -> bool: """Test presets UI in browser.""" print("\n=== Testing Presets UI in Browser ===") @@ -825,57 +859,44 @@ def test_preset_drag_and_drop(browser: BrowserTest) -> bool: print("✓ Created 3 presets for drag test") passed += 1 - # Test 4: Add presets to the tab + # Test 4: Add presets to the tab (via Edit Tab modal – Select buttons in list) total += 1 try: - # Click "Add Preset" button in the tab area - add_preset_btn = browser.wait_for_element(By.ID, 'preset-add-btn-tab', timeout=5) - if add_preset_btn: - browser.click_element(By.ID, 'preset-add-btn-tab', use_js=True) - time.sleep(1.5) # Wait for modal to fully render - - # Wait for the add preset modal - add_modal = browser.wait_for_element(By.ID, 'add-preset-to-tab-modal', timeout=5) - if add_modal: - # Find "Add" buttons (not "Remove" buttons) in the modal - add_buttons = browser.driver.find_elements(By.XPATH, "//div[@id='add-preset-list']//button[text()='Add']") - if len(add_buttons) >= 2: - # Add first preset - the modal will close after clicking - browser.driver.execute_script("arguments[0].click();", add_buttons[0]) - time.sleep(2) # Wait for modal to close and tab to reload - browser.handle_alert(accept=True, timeout=1) # Handle any alerts - - # Re-open modal to add second preset - browser.click_element(By.ID, 'preset-add-btn-tab', use_js=True) + tab_id = browser.driver.execute_script( + "return (window.tabsManager && window.tabsManager.getCurrentTabId && window.tabsManager.getCurrentTabId()) || null;" + ) + if not tab_id: + print("✗ Could not get current tab id") + else: + browser.driver.execute_script( + "if (window.tabsManager && window.tabsManager.openEditTabModal) { window.tabsManager.openEditTabModal(arguments[0], null); }", + tab_id + ) + time.sleep(1) + list_el = browser.wait_for_element(By.ID, 'edit-tab-presets-list', timeout=5) + if list_el: + select_buttons = browser.driver.find_elements(By.XPATH, "//div[@id='edit-tab-presets-list']//button[text()='Select']") + if len(select_buttons) >= 2: + browser.driver.execute_script("arguments[0].click();", select_buttons[0]) time.sleep(1.5) - add_modal = browser.wait_for_element(By.ID, 'add-preset-to-tab-modal', timeout=5) - if add_modal: - # Find Add buttons again (first one might now be "Remove") - add_buttons = browser.driver.find_elements(By.XPATH, "//div[@id='add-preset-list']//button[text()='Add']") - if len(add_buttons) >= 1: - # Add second preset - browser.driver.execute_script("arguments[0].click();", add_buttons[0]) - time.sleep(2) # Wait for modal to close and tab to reload - browser.handle_alert(accept=True, timeout=1) - print(" ✓ Added 2 presets to tab") - else: - print(" ⚠ No more presets available to add (all may be added)") - else: - print(" ⚠ Modal didn't reopen for second preset") - - # Make sure modal is closed - try: - browser.click_element(By.ID, 'add-preset-to-tab-close-btn', use_js=True) - except: - pass # Modal might already be closed - time.sleep(1) + browser.handle_alert(accept=True, timeout=1) + select_buttons = browser.driver.find_elements(By.XPATH, "//div[@id='edit-tab-presets-list']//button[text()='Select']") + if len(select_buttons) >= 1: + browser.driver.execute_script("arguments[0].click();", select_buttons[0]) + time.sleep(1.5) + browser.handle_alert(accept=True, timeout=1) + print(" ✓ Added 2 presets to tab") + passed += 1 + elif len(select_buttons) == 1: + browser.driver.execute_script("arguments[0].click();", select_buttons[0]) + time.sleep(1.5) + browser.handle_alert(accept=True, timeout=1) + print(" ✓ Added 1 preset to tab") passed += 1 else: - print(f"✗ Not enough presets with 'Add' button in modal (found {len(add_buttons)})") + print(" ⚠ No presets available to add (all already in tab)") else: - print("✗ Add preset modal didn't open") - else: - print("✗ Add Preset button not found in tab") + print("✗ Edit tab presets list not found") except Exception as e: print(f"✗ Failed to add presets to tab: {e}") import traceback @@ -924,43 +945,40 @@ def test_preset_drag_and_drop(browser: BrowserTest) -> bool: print("✗ Presets disappeared after drag") elif len(draggable_presets) == 1: print(f"⚠ Only 1 preset found in tab (need 2 for drag test). Preset: {draggable_presets[0].text}") - # Try to add another preset - add_btn = browser.wait_for_element(By.ID, 'preset-add-btn-tab', timeout=2) - if add_btn: + tab_id = browser.driver.execute_script( + "return (window.tabsManager && window.tabsManager.getCurrentTabId && window.tabsManager.getCurrentTabId()) || null;" + ) + if tab_id: + browser.driver.execute_script( + "if (window.tabsManager && window.tabsManager.openEditTabModal) { window.tabsManager.openEditTabModal(arguments[0], null); }", + tab_id + ) + time.sleep(1) + select_buttons = browser.driver.find_elements(By.XPATH, "//div[@id='edit-tab-presets-list']//button[text()='Select']") + if select_buttons: print(" Attempting to add another preset...") - browser.click_element(By.ID, 'preset-add-btn-tab', use_js=True) + browser.driver.execute_script("arguments[0].click();", select_buttons[0]) time.sleep(1.5) - # Look for "Add" buttons specifically - add_buttons = browser.driver.find_elements(By.XPATH, "//div[@id='add-preset-list']//button[text()='Add']") - if add_buttons: - browser.driver.execute_script("arguments[0].click();", add_buttons[0]) - time.sleep(2) # Wait for modal to close and tab to reload - browser.handle_alert(accept=True, timeout=1) - # Make sure modal is closed - try: - browser.click_element(By.ID, 'add-preset-to-tab-close-btn', use_js=True) - except: - pass + browser.handle_alert(accept=True, timeout=1) + try: + browser.driver.execute_script("document.getElementById('edit-tab-modal').classList.remove('active');") + except Exception: + pass + time.sleep(1) + draggable_presets = browser.driver.find_elements(By.CSS_SELECTOR, '#presets-list-tab .draggable-preset') + if len(draggable_presets) >= 2: + print(" ✓ Added another preset, now testing drag...") + source = draggable_presets[0] + target = draggable_presets[1] + actions = ActionChains(browser.driver) + actions.click_and_hold(source).move_to_element(target).release().perform() time.sleep(1) - # Check again - wait a bit more for rendering - time.sleep(1) - draggable_presets = browser.driver.find_elements(By.CSS_SELECTOR, '#presets-list-tab .draggable-preset') - if len(draggable_presets) >= 2: - print(" ✓ Added another preset, now testing drag...") - # Try drag now - source = draggable_presets[0] - target = draggable_presets[1] - actions = ActionChains(browser.driver) - actions.click_and_hold(source).move_to_element(target).release().perform() - time.sleep(1) - print("✓ Performed drag and drop") - passed += 1 - else: - print(f" ✗ Still only {len(draggable_presets)} preset(s) after adding") + print("✓ Performed drag and drop") + passed += 1 else: - print(" ✗ No 'Add' buttons found in modal") + print(f" ✗ Still only {len(draggable_presets)} preset(s) after adding") else: - print(" ✗ Add Preset button not found") + print(" ✗ No Select buttons found in Edit Tab modal") else: print(f"✗ No presets found in tab (found {len(draggable_presets)})") else: