mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-10-18 01:04:01 -04:00
- niri, mango & hyprland supported - `dms systemd enable/disable/status/start/stop/restart` supported
111 lines
4.2 KiB
Go
111 lines
4.2 KiB
Go
package config
|
|
|
|
import (
|
|
"errors"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/AvengeMedia/DankMaterialShell/core/internal/deps"
|
|
"github.com/AvengeMedia/DankMaterialShell/core/internal/mangoconf"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func stubMango(t *testing.T, dialect mangoconf.Dialect, target bool, addWants error) *int {
|
|
t.Helper()
|
|
prevDialect, prevTarget := mangoDialect, mangoSessionTargetInstalled
|
|
mangoDialect = func() mangoconf.Dialect { return dialect }
|
|
mangoSessionTargetInstalled = func() bool { return target }
|
|
t.Cleanup(func() { mangoDialect, mangoSessionTargetInstalled = prevDialect, prevTarget })
|
|
return stubAddWants(t, addWants)
|
|
}
|
|
|
|
func readMango(t *testing.T, home, rel string) string {
|
|
t.Helper()
|
|
data, err := os.ReadFile(filepath.Join(home, ".config", "mango", rel))
|
|
require.NoError(t, err)
|
|
return string(data)
|
|
}
|
|
|
|
const oldMangoConfig = `exec-once=waybar
|
|
bind=SUPER,Return,spawn,foot
|
|
keymode=resize
|
|
bind=NONE,h,resizewin,-10,0
|
|
monitorrule=name:^DP-1$,width:2560,height:1440,refresh:144,x:0,y:0,scale:1,rr:0,vrr:1,hdr:1
|
|
windowrule=appid:pavucontrol,isfloating:1
|
|
`
|
|
|
|
func TestMangoDeployMovesUserRulesAndKeepsBindsByDefault(t *testing.T) {
|
|
home := t.TempDir()
|
|
t.Setenv("HOME", home)
|
|
stubMango(t, mangoconf.Legacy, false, nil)
|
|
require.NoError(t, os.MkdirAll(filepath.Join(home, ".config", "mango"), 0o755))
|
|
require.NoError(t, os.WriteFile(filepath.Join(home, ".config", "mango", "config.conf"), []byte(oldMangoConfig), 0o644))
|
|
|
|
result, err := NewConfigDeployer(nil).DeployCompositor(deps.WindowManagerMango, "kitty", true)
|
|
require.NoError(t, err)
|
|
assert.NotEmpty(t, result.BackupPath)
|
|
|
|
assert.Contains(t, readMango(t, home, "config.conf"), "exec-once=dms run")
|
|
assert.Contains(t, readMango(t, home, "config.conf"), "source=./dms/input.conf")
|
|
assert.Equal(t, "", readMango(t, home, "dms/input.conf"))
|
|
binds := readMango(t, home, "dms/binds.conf")
|
|
assert.Contains(t, binds, "bind=SUPER,Return,spawn,foot\nkeymode=resize\nbind=NONE,h,resizewin,-10,0")
|
|
assert.NotContains(t, binds, "{{TERMINAL_COMMAND}}")
|
|
assert.Contains(t, readMango(t, home, "dms/outputs.conf"), "hdr:1")
|
|
assert.Contains(t, readMango(t, home, "dms/windowrules.conf"), "windowrule=appid:pavucontrol,isfloating:1")
|
|
}
|
|
|
|
func TestMangoDeployBindsChoiceAlwaysBacksUp(t *testing.T) {
|
|
for _, replace := range []bool{false, true} {
|
|
home := t.TempDir()
|
|
t.Setenv("HOME", home)
|
|
stubMango(t, mangoconf.Legacy, false, nil)
|
|
dms := filepath.Join(home, ".config", "mango", "dms")
|
|
require.NoError(t, os.MkdirAll(dms, 0o755))
|
|
require.NoError(t, os.WriteFile(filepath.Join(dms, "binds.conf"), []byte("bind=SUPER,x,killclient\n"), 0o644))
|
|
require.NoError(t, os.WriteFile(filepath.Join(dms, "windowrules.conf"), []byte("windowrule=appid:keep,isglobal:1\n"), 0o644))
|
|
|
|
cd := NewConfigDeployer(nil)
|
|
cd.SetReplaceBinds(replace)
|
|
_, err := cd.DeployCompositor(deps.WindowManagerMango, "kitty", false)
|
|
require.NoError(t, err)
|
|
|
|
backups, _ := filepath.Glob(filepath.Join(dms, "binds.conf.backup.*"))
|
|
assert.Len(t, backups, 1, "replace=%v", replace)
|
|
binds := readMango(t, home, "dms/binds.conf")
|
|
assert.Equal(t, !replace, binds == mangoconf.BindsKeptHeader+"\nbind=SUPER,x,killclient\n", "replace=%v", replace)
|
|
assert.Equal(t, "windowrule=appid:keep,isglobal:1\n", readMango(t, home, "dms/windowrules.conf"))
|
|
}
|
|
}
|
|
|
|
func TestMangoDeploySystemdAutostart(t *testing.T) {
|
|
cases := []struct {
|
|
name string
|
|
target bool
|
|
addWants error
|
|
wantExec bool
|
|
wantCalls int
|
|
}{
|
|
{"session target", true, nil, false, 1},
|
|
{"no session target", false, nil, true, 0},
|
|
{"add-wants fails", true, errors.New("no user bus"), true, 1},
|
|
}
|
|
for _, tc := range cases {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
home := t.TempDir()
|
|
t.Setenv("HOME", home)
|
|
calls := stubMango(t, mangoconf.Snake, tc.target, tc.addWants)
|
|
_, err := NewConfigDeployer(nil).DeployCompositor(deps.WindowManagerMango, "kitty", true)
|
|
require.NoError(t, err)
|
|
main := readMango(t, home, "config.conf")
|
|
assert.Equal(t, tc.wantExec, strings.Contains(main, "exec_once=dms run"))
|
|
assert.NotContains(t, main, "exec-once")
|
|
assert.Equal(t, tc.wantExec, strings.Contains(main, "Starts the shell"))
|
|
assert.Equal(t, tc.wantCalls, *calls)
|
|
})
|
|
}
|
|
}
|