//go:build darwin package platform import ( "os" "strings" "testing" ) func TestSetLaunchAtLoginInstallsAndRemoves(t *testing.T) { t.Setenv("HOME", t.TempDir()) if IsLaunchAtLoginEnabled() { t.Fatal("should start disabled") } if err := SetLaunchAtLogin(true); err != nil { t.Fatalf("enable: %v", err) } if !IsLaunchAtLoginEnabled() { t.Error("should be enabled after install") } p, _ := launchAgentPath() data, err := os.ReadFile(p) if err != nil { t.Fatalf("read plist: %v", err) } plist := string(data) if !strings.Contains(plist, "Label") || !strings.Contains(plist, launchAgentLabel) || !strings.Contains(plist, "RunAtLoad") { t.Errorf("plist missing expected keys:\n%s", plist) } // Disabling removes the file; removing again is a no-op success. if err := SetLaunchAtLogin(false); err != nil { t.Fatalf("disable: %v", err) } if IsLaunchAtLoginEnabled() { t.Error("should be disabled after removal") } if err := SetLaunchAtLogin(false); err != nil { t.Errorf("removing an absent agent should be a no-op, got %v", err) } } func TestAppBundlePath(t *testing.T) { cases := map[string]string{ "/Apps/cdrop.app/Contents/MacOS/desktop": "/Apps/cdrop.app", "/usr/local/bin/desktop": "", } for in, want := range cases { if got := appBundlePath(in); got != want { t.Errorf("appBundlePath(%q) = %q, want %q", in, got, want) } } } func TestXMLEscape(t *testing.T) { got := xmlEscape(`a&b"d"`) if !strings.Contains(got, "&") || !strings.Contains(got, "<") || !strings.Contains(got, """) { t.Errorf("xmlEscape did not escape specials: %q", got) } }