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.rb is 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()

TestExpectedโœ“
Click icon when hidden โ†’ icons revealHidden icons appear to LEFT of separator
Click icon when expanded โ†’ icons hideHidden icons disappear
With auth enabled โ†’ prompts for passwordTouch ID / password dialog appears

2. Right-Click Menu

Flow: statusItemClicked โ†’ showStatusMenu

TestExpectedโœ“
Right-click shows menuMenu with Find Icon, Settings, Quit appears
"Find Icon..." opens searchSearch window opens
"Settings..." opens settingsSettings window opens
"Check for Updates..." worksSparkle update check runs
"Quit SaneBar" quitsApp terminates

3. Option-Click

TestExpectedโœ“
Option+click opens settingsSettings window opens directly

โš™๏ธ SETTINGS - GENERAL TAB

Show Dock Icon

Binding: menuBarManager.settings.showDockIcon

TestExpectedโœ“
Toggle ON โ†’ dock icon appearsSaneBar icon visible in Dock
Toggle OFF โ†’ dock icon hiddenNo SaneBar in Dock

Require Password

Binding: menuBarManager.settings.requireAuthToShowHiddenIcons

TestExpectedโœ“
Toggle ON โ†’ auth required to revealLeft-click prompts for Touch ID
Toggle OFF โ†’ no auth neededLeft-click reveals immediately
Does NOT auto-reveal when toggledIcons stay hidden after toggle

Auto-Check for Updates

Binding: menuBarManager.settings.checkForUpdatesAutomatically

TestExpectedโœ“
Toggle ON โ†’ Sparkle checks at launchUpdate check on next launch
Toggle OFF โ†’ no auto-checkMust manually check

โš™๏ธ SETTINGS - RULES TAB

Auto-Rehide After Reveal

Binding: menuBarManager.settings.autoRehide

TestExpectedโœ“
Toggle ON โ†’ icons hide after delayIcons auto-hide after set seconds
Toggle OFF โ†’ icons stay revealedMust manually click to hide
Delay slider changes timingVerify 1s, 3s, 5s delays work

Show on Hover

Binding: menuBarManager.settings.showOnHover Flow: HoverService.onTrigger โ†’ showHiddenItemsNow

TestExpectedโœ“
Toggle ON โ†’ hover reveals iconsMouse near separator reveals
Toggle OFF โ†’ hover does nothingMust click to reveal
Delay slider worksVerify hover delay timing

Show on Scroll

Binding: menuBarManager.settings.showOnScroll

TestExpectedโœ“
Toggle ON โ†’ scroll in menu bar revealsScroll gesture reveals icons
Toggle OFF โ†’ scroll does nothingScroll has no effect

Show on Low Battery

Binding: menuBarManager.settings.showOnLowBattery Flow: TriggerService.checkBatteryLevel โ†’ showHiddenItems

TestExpectedโœ“
Toggle ON โ†’ reveals at 20% batteryTest with battery simulation
Toggle OFF โ†’ no battery triggerBattery level ignored

Show on App Launch

Binding: menuBarManager.settings.showOnAppLaunch Flow: TriggerService.handleAppLaunch โ†’ showHiddenItems

TestExpectedโœ“
Toggle ON + add app โ†’ launch revealsStart selected app, icons reveal
Toggle OFF โ†’ app launch ignoredApps don't trigger reveal
App picker adds/removes appsApps appear in list correctly

Show on Network Change

Binding: menuBarManager.settings.showOnNetworkChange Flow: NetworkTriggerService.handleNetworkChange โ†’ showHiddenItems

TestExpectedโœ“
Toggle ON + add network โ†’ revealsConnect to listed WiFi, icons reveal
Toggle OFF โ†’ network changes ignoredWiFi changes don't trigger
Network picker adds/removes SSIDsSSIDs appear in list

โš™๏ธ SETTINGS - APPEARANCE TAB

Divider Style

Binding: menuBarManager.settings.dividerStyle

TestExpectedโœ“
Slash (/) selectedSeparator shows "/"
Backslash () selectedSeparator shows ""
Pipe () selectedSeparator shows "
Thin Pipe selectedSeparator shows thin "โ˜"
Dot selectedSeparator shows dot

Spacer Count (0-12)

Binding: menuBarManager.settings.spacerCount

TestExpectedโœ“
Set to 0 โ†’ no extra spacersOnly main + separator visible
Set to 3 โ†’ three spacers appearThree "โ”‚" or "โ€ข" in menu bar
Set to 12 (max) โ†’ twelve spacersAll 12 visible in menu bar

Spacer Style (when count > 0)

Binding: menuBarManager.settings.spacerStyle

TestExpectedโœ“
Line style โ†’ "โ”‚" charactersVertical line spacers
Dot style โ†’ "โ€ข" charactersDot spacers

Spacer Width

Binding: menuBarManager.settings.spacerWidth

TestExpectedโœ“
Compact โ†’ narrow spacing8px wide spacers
Normal โ†’ medium spacing12px wide spacers
Wide โ†’ wide spacing20px wide spacers

Binding: menuBarManager.settings.menuBarAppearance.*

TestExpectedโœ“
Enable appearance โ†’ overlay visibleTinted background on menu bar
Disable โ†’ no overlayStandard menu bar
Liquid Glass toggleBlur effect on/off
Shadow toggleDrop shadow on/off
Border toggleBorder line on/off
Rounded corners toggleRounded vs square corners

๐Ÿ” FIND ICON (Search Window)

TestExpectedโœ“
Cmd+Shift+Space opens windowSearch window appears
Typing filters resultsApp list filters in real-time
Arrow keys navigateSelection moves up/down
Enter/click activatesSelected app comes to front
Escape closesWindow closes

๐Ÿ”ง TRACING TOOLS REFERENCE

button_map.rb

Shows ALL UI controls and their bindings:

./Scripts/button_map.rb

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

SymptomLikely CauseCheck
Toggle doesn't persistSettings not savingCheck saveSettings() call
Toggle reveals icons unexpectedlySettings observer side effectCheck $settings sink
Spacers not visibleCount is 0 or positions wrongCheck spacerCount value
Auth bypassedTrigger path skips authTrace flow to authenticate()
Menu bar overlay missingAppearance disabledCheck 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! ๐Ÿš€