From fff16640ad7cd8c4b73187fbce10f2aa558701be Mon Sep 17 00:00:00 2001 From: Robin Jarry Date: Wed, 23 Aug 2023 19:51:54 +0200 Subject: xdg: add functions to deal with user home paths These are intended to replace the following deprecated libraries: github.com/kyoh86/xdg github.com/mitchellh/go-homedir The feature set should be roughly equivalent with some tweaks to make our life easier in aerc. Signed-off-by: Robin Jarry Reviewed-by: Moritz Poldrack --- lib/xdg/xdg_test.go | 179 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 lib/xdg/xdg_test.go (limited to 'lib/xdg/xdg_test.go') diff --git a/lib/xdg/xdg_test.go b/lib/xdg/xdg_test.go new file mode 100644 index 00000000..6b8eac35 --- /dev/null +++ b/lib/xdg/xdg_test.go @@ -0,0 +1,179 @@ +package xdg + +import ( + "runtime" + "testing" +) + +func TestCachePath(t *testing.T) { + t.Setenv("HOME", "/home/user") + vectors := []struct { + args []string + env map[string]string + expected map[string]string + }{ + { + args: []string{"aerc", "foo", "history"}, + expected: map[string]string{ + "": "/home/user/.cache/aerc/foo/history", + "darwin": "/home/user/Library/Caches/aerc/foo/history", + }, + }, + { + args: []string{"aerc", "foo/zuul"}, + env: map[string]string{"XDG_CACHE_HOME": "/home/x/.cache"}, + expected: map[string]string{"": "/home/x/.cache/aerc/foo/zuul"}, + }, + { + args: []string{}, + env: map[string]string{"XDG_CACHE_HOME": "/blah"}, + expected: map[string]string{"": "/blah"}, + }, + } + for _, vec := range vectors { + expected, found := vec.expected[runtime.GOOS] + if !found { + expected = vec.expected[""] + } + t.Run(expected, func(t *testing.T) { + for key, value := range vec.env { + t.Setenv(key, value) + } + res := CachePath(vec.args...) + if res != expected { + t.Errorf("got %q expected %q", res, expected) + } + }) + } +} + +func TestConfigPath(t *testing.T) { + t.Setenv("HOME", "/home/user") + vectors := []struct { + args []string + env map[string]string + expected map[string]string + }{ + { + args: []string{"aerc", "accounts.conf"}, + expected: map[string]string{ + "": "/home/user/.config/aerc/accounts.conf", + "darwin": "/home/user/Library/Preferences/aerc/accounts.conf", + }, + }, + { + args: []string{"aerc", "accounts.conf"}, + env: map[string]string{"XDG_CONFIG_HOME": "/users/x/.config"}, + expected: map[string]string{"": "/users/x/.config/aerc/accounts.conf"}, + }, + { + args: []string{}, + env: map[string]string{"XDG_CONFIG_HOME": "/blah"}, + expected: map[string]string{"": "/blah"}, + }, + } + for _, vec := range vectors { + expected, found := vec.expected[runtime.GOOS] + if !found { + expected = vec.expected[""] + } + t.Run(expected, func(t *testing.T) { + for key, value := range vec.env { + t.Setenv(key, value) + } + res := ConfigPath(vec.args...) + if res != expected { + t.Errorf("got %q expected %q", res, expected) + } + }) + } +} + +func TestDataPath(t *testing.T) { + t.Setenv("HOME", "/home/user") + vectors := []struct { + args []string + env map[string]string + expected map[string]string + }{ + { + args: []string{"aerc", "templates"}, + expected: map[string]string{ + "": "/home/user/.local/share/aerc/templates", + "darwin": "/home/user/Library/Application Support/aerc/templates", + }, + }, + { + args: []string{"aerc", "templates"}, + env: map[string]string{"XDG_DATA_HOME": "/users/x/.local/share"}, + expected: map[string]string{"": "/users/x/.local/share/aerc/templates"}, + }, + { + args: []string{}, + env: map[string]string{"XDG_DATA_HOME": "/blah"}, + expected: map[string]string{"": "/blah"}, + }, + } + for _, vec := range vectors { + expected, found := vec.expected[runtime.GOOS] + if !found { + expected = vec.expected[""] + } + t.Run(expected, func(t *testing.T) { + for key, value := range vec.env { + t.Setenv(key, value) + } + res := DataPath(vec.args...) + if res != expected { + t.Errorf("got %q expected %q", res, expected) + } + }) + } +} + +func TestRuntimePath(t *testing.T) { + // poor man's function mocking + orig := userRuntimePath + userRuntimePath = func() string { return "/run/user/1000" } + defer func() { userRuntimePath = orig }() + t.Setenv("HOME", "/home/user") + + vectors := []struct { + args []string + env map[string]string + expected map[string]string + }{ + { + args: []string{"aerc.sock"}, + expected: map[string]string{ + "": "/run/user/1000/aerc.sock", + "darwin": "/home/user/Library/Application Support/aerc.sock", + }, + }, + { + args: []string{"aerc.sock"}, + env: map[string]string{"XDG_RUNTIME_DIR": "/run/user/1234"}, + expected: map[string]string{"": "/run/user/1234/aerc.sock"}, + }, + { + args: []string{}, + env: map[string]string{"XDG_RUNTIME_DIR": "/blah"}, + expected: map[string]string{"": "/blah"}, + }, + } + for _, vec := range vectors { + expected, found := vec.expected[runtime.GOOS] + if !found { + expected = vec.expected[""] + } + t.Run(expected, func(t *testing.T) { + for key, value := range vec.env { + t.Setenv(key, value) + } + res := RuntimePath(vec.args...) + if res != expected { + t.Errorf("got %q expected %q", res, expected) + } + }) + } +} -- cgit