SaneBar End-to-End Testing Checklist
July 2, 2026 ยท View on GitHub
This is a manual, per-setting end-to-end pass over the real app: launch a build, exercise each control, and verify the observable result in the menu bar.
- Launch a build for testing with
./Scripts/SaneMaster.rb test_mode. Scripts/live_zone_smoke.rbis the automated cousin of this checklist (maintainer tooling for scripted browse/move smoke).- For active menu bar regressions, start with
docs/MENU_BAR_RUNTIME_PLAYBOOK.md.
Pre-Test Setup
# 1. Build and launch fresh
./Scripts/SaneMaster.rb test_mode
# 2. Generate button map (see all UI controls)
./Scripts/button_map.rb
# 3. Trace specific function (if debugging)
rg "function_name" Core UI Tests
๐ฑ๏ธ CORE INTERACTIONS
1. Left-Click on SaneBar Icon
Flow: statusItemClicked โ toggleHiddenItems โ [auth check] โ hidingService.toggle()
| Test | Expected | โ |
|---|---|---|
| Click icon when hidden โ icons reveal | Hidden icons appear to LEFT of separator | |
| Click icon when expanded โ icons hide | Hidden icons disappear | |
| With auth enabled โ prompts for password | Touch ID / password dialog appears |
2. Right-Click Menu
Flow: statusItemClicked โ showStatusMenu
| Test | Expected | โ |
|---|---|---|
| Right-click shows menu | Menu with Find Icon, Settings, Quit appears | |
| "Find Icon..." opens search | Search window opens | |
| "Settings..." opens settings | Settings window opens | |
| "Check for Updates..." works | Sparkle update check runs | |
| "Quit SaneBar" quits | App terminates |
3. Option-Click
| Test | Expected | โ |
|---|---|---|
| Option+click opens settings | Settings window opens directly |
โ๏ธ SETTINGS - GENERAL TAB
Show Dock Icon
Binding: menuBarManager.settings.showDockIcon
| Test | Expected | โ |
|---|---|---|
| Toggle ON โ dock icon appears | SaneBar icon visible in Dock | |
| Toggle OFF โ dock icon hidden | No SaneBar in Dock |
Require Password
Binding: menuBarManager.settings.requireAuthToShowHiddenIcons
| Test | Expected | โ |
|---|---|---|
| Toggle ON โ auth required to reveal | Left-click prompts for Touch ID | |
| Toggle OFF โ no auth needed | Left-click reveals immediately | |
| Does NOT auto-reveal when toggled | Icons stay hidden after toggle |
Auto-Check for Updates
Binding: menuBarManager.settings.checkForUpdatesAutomatically
| Test | Expected | โ |
|---|---|---|
| Toggle ON โ Sparkle checks at launch | Update check on next launch | |
| Toggle OFF โ no auto-check | Must manually check |
โ๏ธ SETTINGS - RULES TAB
Auto-Rehide After Reveal
Binding: menuBarManager.settings.autoRehide
| Test | Expected | โ |
|---|---|---|
| Toggle ON โ icons hide after delay | Icons auto-hide after set seconds | |
| Toggle OFF โ icons stay revealed | Must manually click to hide | |
| Delay slider changes timing | Verify 1s, 3s, 5s delays work |
Show on Hover
Binding: menuBarManager.settings.showOnHover
Flow: HoverService.onTrigger โ showHiddenItemsNow
| Test | Expected | โ |
|---|---|---|
| Toggle ON โ hover reveals icons | Mouse near separator reveals | |
| Toggle OFF โ hover does nothing | Must click to reveal | |
| Delay slider works | Verify hover delay timing |
Show on Scroll
Binding: menuBarManager.settings.showOnScroll
| Test | Expected | โ |
|---|---|---|
| Toggle ON โ scroll in menu bar reveals | Scroll gesture reveals icons | |
| Toggle OFF โ scroll does nothing | Scroll has no effect |
Show on Low Battery
Binding: menuBarManager.settings.showOnLowBattery
Flow: TriggerService.checkBatteryLevel โ showHiddenItems
| Test | Expected | โ |
|---|---|---|
| Toggle ON โ reveals at 20% battery | Test with battery simulation | |
| Toggle OFF โ no battery trigger | Battery level ignored |
Show on App Launch
Binding: menuBarManager.settings.showOnAppLaunch
Flow: TriggerService.handleAppLaunch โ showHiddenItems
| Test | Expected | โ |
|---|---|---|
| Toggle ON + add app โ launch reveals | Start selected app, icons reveal | |
| Toggle OFF โ app launch ignored | Apps don't trigger reveal | |
| App picker adds/removes apps | Apps appear in list correctly |
Show on Network Change
Binding: menuBarManager.settings.showOnNetworkChange
Flow: NetworkTriggerService.handleNetworkChange โ showHiddenItems
| Test | Expected | โ |
|---|---|---|
| Toggle ON + add network โ reveals | Connect to listed WiFi, icons reveal | |
| Toggle OFF โ network changes ignored | WiFi changes don't trigger | |
| Network picker adds/removes SSIDs | SSIDs appear in list |
โ๏ธ SETTINGS - APPEARANCE TAB
Divider Style
Binding: menuBarManager.settings.dividerStyle
| Test | Expected | โ |
|---|---|---|
| Slash (/) selected | Separator shows "/" | |
| Backslash () selected | Separator shows "" | |
| Pipe ( | ) selected | Separator shows " |
| Thin Pipe selected | Separator shows thin "โ" | |
| Dot selected | Separator shows dot |
Spacer Count (0-12)
Binding: menuBarManager.settings.spacerCount
| Test | Expected | โ |
|---|---|---|
| Set to 0 โ no extra spacers | Only main + separator visible | |
| Set to 3 โ three spacers appear | Three "โ" or "โข" in menu bar | |
| Set to 12 (max) โ twelve spacers | All 12 visible in menu bar |
Spacer Style (when count > 0)
Binding: menuBarManager.settings.spacerStyle
| Test | Expected | โ |
|---|---|---|
| Line style โ "โ" characters | Vertical line spacers | |
| Dot style โ "โข" characters | Dot spacers |
Spacer Width
Binding: menuBarManager.settings.spacerWidth
| Test | Expected | โ |
|---|---|---|
| Compact โ narrow spacing | 8px wide spacers | |
| Normal โ medium spacing | 12px wide spacers | |
| Wide โ wide spacing | 20px wide spacers |
Menu Bar Appearance (Visual Zones)
Binding: menuBarManager.settings.menuBarAppearance.*
| Test | Expected | โ |
|---|---|---|
| Enable appearance โ overlay visible | Tinted background on menu bar | |
| Disable โ no overlay | Standard menu bar | |
| Liquid Glass toggle | Blur effect on/off | |
| Shadow toggle | Drop shadow on/off | |
| Border toggle | Border line on/off | |
| Rounded corners toggle | Rounded vs square corners |
๐ FIND ICON (Search Window)
| Test | Expected | โ |
|---|---|---|
| Cmd+Shift+Space opens window | Search window appears | |
| Typing filters results | App list filters in real-time | |
| Arrow keys navigate | Selection moves up/down | |
| Enter/click activates | Selected app comes to front | |
| Escape closes | Window closes |
๐ง TRACING TOOLS REFERENCE
button_map.rb
Shows ALL UI controls and their bindings:
./Scripts/button_map.rb
Source Search
Search for specific functions:
rg "toggleHiddenItems" Core UI Tests
rg "showOnHover" Core UI Tests
Class Diagram
Visual architecture: docs/class_diagram.png
๐ COMMON FAILURE MODES
| Symptom | Likely Cause | Check |
|---|---|---|
| Toggle doesn't persist | Settings not saving | Check saveSettings() call |
| Toggle reveals icons unexpectedly | Settings observer side effect | Check $settings sink |
| Spacers not visible | Count is 0 or positions wrong | Check spacerCount value |
| Auth bypassed | Trigger path skips auth | Trace flow to authenticate() |
| Menu bar overlay missing | Appearance disabled | Check isEnabled flag |
Post-Test
# Verify no crashes in logs
./Scripts/SaneMaster.rb logs --tail 50
# Check for warnings
log show --predicate 'subsystem == "com.sanebar.app"' --last 5m --style compact
Sign-off: All tests passing? Ship it! ๐