LazyRun v1.0.0: shortcut maker untuk executable dan PWA

- Fungsi A: shortcut dari file executable (ELF/AppImage/script)
- Fungsi B: shortcut PWA/URL dengan deteksi browser (native, /opt, Flatpak)
- Checkbox Menu Aplikasi / Desktop, desktop-only pakai NoDisplay=true
- List + uninstall + deteksi shortcut yang file .desktop-nya hilang
- Metadata ~/.config/lazyrun/shortcuts.json, refresh cache XDG/KDE
- AppImage + zsync update info via build.sh
This commit is contained in:
oxpoe committed 2026-10-13 08:00:12 +07:00
1 parent 9cd5a1f82d
commit da31f7d7d7
31 files changed
+2916

No files matched your search

+89
View File
@@ -0,0 +1,89 @@
package shortcut
import (
"strings"
"testing"
)
func TestRender(t *testing.T) {
e := Entry{
Name: "Winbox",
ExecArgs: []string{"/home/user/.local/bin/winbox"},
Icon: "/home/user/.local/share/icons/hicolor/512x512/apps/winbox.png",
Categories: "Network;",
}
want := `[Desktop Entry]
Type=Application
Name=Winbox
Exec=/home/user/.local/bin/winbox
Icon=/home/user/.local/share/icons/hicolor/512x512/apps/winbox.png
Terminal=false
Categories=Network;
Comment=Created by LazyRun
`
if got := e.Render(); got != want {
t.Errorf("Render()\ngot:\n%s\nwant:\n%s", got, want)
}
}
func TestRenderNoDisplayWhenDesktopOnly(t *testing.T) {
e := Entry{Name: "X", ExecArgs: []string{"/x"}, NoDisplay: true}
if !strings.Contains(e.Render(), "NoDisplay=true\n") {
t.Errorf("entry desktop-only harus NoDisplay=true:\n%s", e.Render())
}
}
func TestExecQuote(t *testing.T) {
tests := []struct {
in, want string
}{
{"/usr/bin/winbox", "/usr/bin/winbox"},
{"/home/user/my app/app", `"/home/user/my app/app"`},
{"/opt/a$b", `"/opt/a\$b"`},
{"back\\slash path", `"back\\slash path"`},
{`say "hi"`, `"say \"hi\""`},
{"", `""`},
{"--app=https://web.whatsapp.com", "--app=https://web.whatsapp.com"},
}
for _, tc := range tests {
if got := execQuote(tc.in); got != tc.want {
t.Errorf("execQuote(%q) = %q, want %q", tc.in, got, tc.want)
}
}
}
func TestExecArgsJoinsArgs(t *testing.T) {
got := execArgs([]string{"/usr/bin/chromium", "--app=https://web.whatsapp.com"})
want := "/usr/bin/chromium --app=https://web.whatsapp.com"
if got != want {
t.Errorf("execArgs() = %q, want %q", got, want)
}
}
func TestSlugify(t *testing.T) {
tests := map[string]string{
"WhatsApp Web": "whatsapp-web",
"Winbox": "winbox",
"my-go-app": "my-go-app",
" spaced ": "spaced",
"Café #1": "café-1",
"!!": "",
}
for in, want := range tests {
if got := slugify(in); got != want {
t.Errorf("slugify(%q) = %q, want %q", in, got, want)
}
}
}
func TestNormalizeURL(t *testing.T) {
if got, err := normalizeURL("web.whatsapp.com"); err != nil || got != "https://web.whatsapp.com" {
t.Errorf("normalizeURL tanpa skema = %q, %v", got, err)
}
if _, err := normalizeURL(""); err == nil {
t.Error("URL kosong harus error")
}
if _, err := normalizeURL("ftp://example.com"); err == nil {
t.Error("skema selain http(s) harus error")
}
}