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"}, env: map[string]string{"XDG_CACHE_HOME": ""}, 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"}, env: map[string]string{"XDG_CONFIG_HOME": ""}, 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"}, env: map[string]string{"XDG_DATA_HOME": ""}, 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"}, env: map[string]string{"XDG_RUNTIME_DIR": ""}, 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) } }) } }