mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-10-29 14:37:47 -04:00
211 lines
5.3 KiB
Go
211 lines
5.3 KiB
Go
package desktop
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestSetDefaultsPreservesUnrelatedContent(t *testing.T) {
|
|
configHome, _ := setupFakeXDG(t)
|
|
path := filepath.Join(configHome, "mimeapps.list")
|
|
writeFile(t, path, `# managed by hand
|
|
[Default Applications]
|
|
text/html=firefox.desktop
|
|
# pinned image viewer
|
|
image/png=eog.desktop
|
|
|
|
[Added Associations]
|
|
text/html=firefox.desktop;
|
|
|
|
[Custom Section]
|
|
foo=bar
|
|
`)
|
|
|
|
if err := SetDefaults([]string{"inode/directory", "x-scheme-handler/sftp"}, "org.kde.dolphin.desktop"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
data, err := os.ReadFile(path)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
got := string(data)
|
|
|
|
preserved := []string{
|
|
"# managed by hand",
|
|
"# pinned image viewer",
|
|
"text/html=firefox.desktop",
|
|
"image/png=eog.desktop",
|
|
"[Custom Section]",
|
|
"foo=bar",
|
|
}
|
|
for _, want := range preserved {
|
|
if !strings.Contains(got, want) {
|
|
t.Errorf("rewrite lost %q:\n%s", want, got)
|
|
}
|
|
}
|
|
|
|
written := []string{
|
|
"inode/directory=org.kde.dolphin.desktop",
|
|
"x-scheme-handler/sftp=org.kde.dolphin.desktop",
|
|
}
|
|
for _, want := range written {
|
|
if !strings.Contains(got, want) {
|
|
t.Errorf("rewrite missing %q:\n%s", want, got)
|
|
}
|
|
}
|
|
|
|
if got := GetDefault("inode/directory"); got != "org.kde.dolphin.desktop" {
|
|
t.Errorf("GetDefault(inode/directory) = %q", got)
|
|
}
|
|
if got := GetDefault("x-scheme-handler/sftp"); got != "org.kde.dolphin.desktop" {
|
|
t.Errorf("GetDefault(x-scheme-handler/sftp) = %q", got)
|
|
}
|
|
}
|
|
|
|
func TestSetDefaultReplacesKeyInPlace(t *testing.T) {
|
|
configHome, _ := setupFakeXDG(t)
|
|
path := filepath.Join(configHome, "mimeapps.list")
|
|
writeFile(t, path, `[Default Applications]
|
|
inode/directory=foot.desktop
|
|
text/html=firefox.desktop
|
|
`)
|
|
|
|
if err := SetDefault("inode/directory", "org.gnome.Nautilus.desktop"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
data, err := os.ReadFile(path)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
got := string(data)
|
|
|
|
if n := strings.Count(got, "inode/directory=org.gnome.Nautilus.desktop\n"); n != 1 {
|
|
t.Errorf("expected exactly one replaced default line, got %d:\n%s", n, got)
|
|
}
|
|
if strings.Contains(got, "foot.desktop") {
|
|
t.Errorf("old default still present:\n%s", got)
|
|
}
|
|
if !strings.Contains(got, "text/html=firefox.desktop") {
|
|
t.Errorf("unrelated default lost:\n%s", got)
|
|
}
|
|
}
|
|
|
|
func TestSetDefaultsCreatesFileWhenAbsent(t *testing.T) {
|
|
configHome, _ := setupFakeXDG(t)
|
|
path := filepath.Join(configHome, "mimeapps.list")
|
|
|
|
if err := SetDefaults([]string{"inode/directory", "x-scheme-handler/sftp"}, "org.kde.dolphin"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
data, err := os.ReadFile(path)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
got := string(data)
|
|
|
|
expected := []string{
|
|
"[Default Applications]",
|
|
"inode/directory=org.kde.dolphin.desktop",
|
|
"x-scheme-handler/sftp=org.kde.dolphin.desktop",
|
|
"[Added Associations]",
|
|
}
|
|
for _, want := range expected {
|
|
if !strings.Contains(got, want) {
|
|
t.Errorf("new file missing %q:\n%s", want, got)
|
|
}
|
|
}
|
|
|
|
entries, err := os.ReadDir(configHome)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
for _, e := range entries {
|
|
if strings.HasSuffix(e.Name(), ".tmp") {
|
|
t.Errorf("leftover temp file %q", e.Name())
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestSetDefaultClearsRemovedAssociation(t *testing.T) {
|
|
configHome, _ := setupFakeXDG(t)
|
|
path := filepath.Join(configHome, "mimeapps.list")
|
|
writeFile(t, path, `[Removed Associations]
|
|
inode/directory=org.kde.dolphin.desktop;other.desktop;
|
|
`)
|
|
|
|
if err := SetDefault("inode/directory", "org.kde.dolphin.desktop"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
data, err := os.ReadFile(path)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
got := string(data)
|
|
|
|
if !strings.Contains(got, "inode/directory=other.desktop;") {
|
|
t.Errorf("unrelated removed entry lost:\n%s", got)
|
|
}
|
|
if strings.Contains(got, "org.kde.dolphin.desktop;other.desktop") {
|
|
t.Errorf("chosen app still in removed list:\n%s", got)
|
|
}
|
|
if got := GetDefault("inode/directory"); got != "org.kde.dolphin.desktop" {
|
|
t.Errorf("GetDefault = %q", got)
|
|
}
|
|
}
|
|
|
|
func TestHandlersForMimeExcludesTerminalAndNoDisplay(t *testing.T) {
|
|
_, dataHome := setupFakeXDG(t)
|
|
apps := filepath.Join(dataHome, "applications")
|
|
writeFile(t, filepath.Join(apps, "org.kde.dolphin.desktop"), `[Desktop Entry]
|
|
Type=Application
|
|
Name=Dolphin
|
|
Icon=system-file-manager
|
|
MimeType=inode/directory;
|
|
`)
|
|
writeFile(t, filepath.Join(apps, "ghost-term.desktop"), `[Desktop Entry]
|
|
Type=Application
|
|
Name=Ghost Terminal
|
|
Terminal=true
|
|
MimeType=inode/directory;
|
|
`)
|
|
writeFile(t, filepath.Join(apps, "hidden-fm.desktop"), `[Desktop Entry]
|
|
Type=Application
|
|
Name=Hidden FM
|
|
NoDisplay=true
|
|
MimeType=inode/directory;
|
|
`)
|
|
writeFile(t, filepath.Join(apps, "mimeinfo.cache"), `[MIME Cache]
|
|
inode/directory=ghost-term.desktop;org.kde.dolphin.desktop;hidden-fm.desktop;stale.desktop;
|
|
`)
|
|
|
|
handlers := HandlersForMime("inode/directory")
|
|
byID := make(map[string]*Entry, len(handlers))
|
|
for _, h := range handlers {
|
|
byID[h.ID] = h
|
|
}
|
|
|
|
dolphin := byID["org.kde.dolphin.desktop"]
|
|
if dolphin == nil {
|
|
t.Fatal("org.kde.dolphin.desktop missing from handlers")
|
|
}
|
|
if dolphin.Name != "Dolphin" {
|
|
t.Errorf("Name = %q", dolphin.Name)
|
|
}
|
|
if dolphin.Icon != "system-file-manager" {
|
|
t.Errorf("Icon = %q", dolphin.Icon)
|
|
}
|
|
|
|
excluded := []string{"ghost-term.desktop", "hidden-fm.desktop", "stale.desktop"}
|
|
for _, id := range excluded {
|
|
if byID[id] != nil {
|
|
t.Errorf("%s should be excluded from handlers", id)
|
|
}
|
|
}
|
|
}
|