package web import ( "net/http" "net/http/httptest" "os" "path/filepath" "testing" "gitgud.io/mike/mpv-manager/pkg/config" "gitgud.io/mike/mpv-manager/pkg/constants" ) // setInstalledUITypeForTest sets the installed UI type and restores the // previous value when the test finishes. func setInstalledUITypeForTest(t *testing.T, uiType string) { t.Helper() old := config.GetInstalledUIType() if err := config.SetInstalledUIType(uiType); err != nil { t.Fatalf("SetInstalledUIType(%q) failed: %v", uiType, err) } t.Cleanup(func() { if err := config.SetInstalledUIType(old); err != nil { t.Errorf("failed to restore installed UI type: %v", err) } }) } // findNavItem returns the nav item for the given URL, or nil. func findNavItem(items []NavItem, url string) *NavItem { for i := range items { if items[i].URL == url { return &items[i] } } return nil } func TestGetActiveNav_UISettingsIncludedWhenScriptInstalled(t *testing.T) { setupSandboxedConfigHome(t) setInstalledUITypeForTest(t, constants.UITypeUOSC) scriptsDir := filepath.Join(config.GetMPVConfigPath(), constants.ScriptsDir) if err := os.MkdirAll(scriptsDir, 0755); err != nil { t.Fatalf("failed to create scripts dir: %v", err) } if err := os.WriteFile(filepath.Join(scriptsDir, "modernz.lua"), []byte("-- test"), 0644); err != nil { t.Fatalf("failed to write modernz.lua: %v", err) } if findNavItem(getActiveNav("/ui-settings"), "/ui-settings") == nil { t.Error("expected UI Settings navigation when scripts/modernz.lua exists") } } func TestGetActiveNav_UISettingsIncludedWhenUIInstalled(t *testing.T) { setupSandboxedConfigHome(t) setInstalledUITypeForTest(t, constants.UITypeModernZ) nav := getActiveNav("/ui-settings") item := findNavItem(nav, "/ui-settings") if item == nil { t.Fatal("expected nav to contain the UI Settings entry when a UI is installed") } if !item.Active { t.Error("expected UI Settings nav entry to be active for path /ui-settings") } if findNavItem(nav, "/modernz") != nil { t.Error("expected nav to not contain a /modernz entry") } } func TestGetActiveNav_UISettingsActiveForLegacyModernZPath(t *testing.T) { setupSandboxedConfigHome(t) setInstalledUITypeForTest(t, constants.UITypeModernZ) nav := getActiveNav("/modernz") item := findNavItem(nav, "/ui-settings") if item == nil { t.Fatal("expected nav to contain the UI Settings entry when a UI is installed") } if !item.Active { t.Error("expected UI Settings nav entry to be active for legacy path /modernz") } } func TestGetActiveNav_UISettingsExcludedWhenNoUIInstalled(t *testing.T) { setupSandboxedConfigHome(t) setInstalledUITypeForTest(t, constants.UITypeUOSC) removeMPVAppsForTest(t) nav := getActiveNav("/ui-settings") if item := findNavItem(nav, "/ui-settings"); item != nil { t.Error("expected nav to not contain the UI Settings entry when no UI is installed") } } // TestHandleModernZ_RedirectsToUISettings verifies the legacy /modernz page // redirects to the generalized UI settings page. func TestHandleModernZ_RedirectsToUISettings(t *testing.T) { setupSandboxedConfigHome(t) setInstalledUITypeForTest(t, constants.UITypeUOSC) server := &Server{} req := httptest.NewRequest(http.MethodGet, "/modernz", nil) w := httptest.NewRecorder() server.handleModernZ(w, req) if w.Code != http.StatusFound { t.Errorf("expected status %d for /modernz redirect, got %d", http.StatusFound, w.Code) } if loc := w.Header().Get("Location"); loc != "/ui-settings" { t.Errorf("expected redirect Location %q, got %q", "/ui-settings", loc) } }