Files
magpie/internal/gui/scheme_linux_test.go
T
TryWorld e85a803eaa fix(gui): skip scheme registration inside Flatpak (#849)
Leave the host desktop entry to the Flatpak package when FLATPAK_ID is set. A sandbox executable path must not replace the native magpie:// handler.

Add Linux cases for absent and existing entries, command suppression, normal registration, and repeated registration. Reference #222; autostart is outside this change.
2026-10-05 10:57:22 +08:00

88 lines
2.7 KiB
Go

package gui
import (
"os"
"path/filepath"
"strings"
"testing"
)
func TestRegisterScheme(t *testing.T) {
for _, tc := range []struct {
name string
flatpak bool
existing bool
}{
{"flatpak without entry", true, false},
{"flatpak with entry", true, true},
{"native without entry", false, false},
{"native with entry", false, true},
} {
t.Run(tc.name, func(t *testing.T) {
t.Setenv("FLATPAK_ID", "")
if tc.flatpak {
t.Setenv("FLATPAK_ID", "ai.usemagpie.Magpie")
}
root := t.TempDir()
data := filepath.Join(root, "data")
t.Setenv("XDG_DATA_HOME", data)
bin := filepath.Join(root, "bin")
if err := os.Mkdir(bin, 0o755); err != nil {
t.Fatal(err)
}
calls := filepath.Join(root, "calls")
t.Setenv("MAGPIE_SCHEME_TEST_CALLS", calls)
t.Setenv("PATH", bin)
for _, name := range []string{"update-desktop-database", "xdg-mime"} {
script := "#!/bin/sh\nprintf '%s\\n' '" + name + "' \"$@\" >> \"$MAGPIE_SCHEME_TEST_CALLS\"\n"
if err := os.WriteFile(filepath.Join(bin, name), []byte(script), 0o755); err != nil {
t.Fatal(err)
}
}
dir := filepath.Join(data, "applications")
path := filepath.Join(dir, "magpie.desktop")
const old = "[Desktop Entry]\nExec=/usr/bin/magpie %u\nMimeType=x-scheme-handler/magpie;\n"
if tc.existing {
if err := os.MkdirAll(dir, 0o755); err != nil {
t.Fatal(err)
}
if err := os.WriteFile(path, []byte(old), 0o644); err != nil {
t.Fatal(err)
}
}
if err := registerScheme(); err != nil {
t.Fatal(err)
}
if tc.flatpak {
if tc.existing {
if got, err := os.ReadFile(path); err != nil || string(got) != old {
t.Fatalf("existing desktop entry changed: %q, %v", got, err)
}
} else if _, err := os.Stat(dir); !os.IsNotExist(err) {
t.Fatalf("applications directory was created: %v", err)
}
if got, err := os.ReadFile(calls); !os.IsNotExist(err) {
t.Fatalf("desktop registration ran: %q, %v", got, err)
}
return
}
exe, err := os.Executable()
if err != nil {
t.Fatal(err)
}
got, err := os.ReadFile(path)
if err != nil || !strings.Contains(string(got), "Exec="+exe+" %u\n") || !strings.Contains(string(got), "MimeType=x-scheme-handler/magpie;\n") {
t.Fatalf("desktop entry: %q, %v", got, err)
}
// An entry for this executable is already registered on the next run.
if err := registerScheme(); err != nil {
t.Fatal(err)
}
want := "update-desktop-database\n" + dir + "\nxdg-mime\ndefault\nmagpie.desktop\nx-scheme-handler/magpie\n"
if got, err := os.ReadFile(calls); err != nil || string(got) != want {
t.Fatalf("registration calls: %q, want %q (%v)", got, want, err)
}
})
}
}