8 "github.com/stretchr/testify/require"
11 func TestLoadConfigGivesDefaultsWithoutAFile(t *testing.T) {
13 config, err := loadConfig(dir)
14 require.NoError(t, err)
15 require.Equal(t, defaultConfig(), config)
16 require.NoFileExists(t, filepath.Join(dir, "config.json"))
19 func TestLoadConfigKeepsDefaultsForMissingFields(t *testing.T) {
21 writeConfig(t, dir, `{"endpoint": "api", "compactor": {"effort": "xhigh"}}`)
23 config, err := loadConfig(dir)
24 require.NoError(t, err)
25 require.Equal(t, Config{
26 Endpoint: endpointAPI,
27 Compactor: ModelConfig{
34 func TestLoadConfigRejectsInvalidFiles(t *testing.T) {
35 testCases := []struct {
39 {"unknown field", `{"endpont": "api"}`},
40 {"unknown nested field", `{"compactor": {"modle": "x"}}`},
41 {"endpoint URL", `{"endpoint": "https://example.com/v1/responses"}`},
42 {"empty model", `{"compactor": {"model": ""}}`},
43 {"second object", `{} {}`},
44 {"broken JSON", `{"endpoint": `},
47 for _, tc := range testCases {
48 t.Run(tc.name, func(t *testing.T) {
50 writeConfig(t, dir, tc.text)
52 _, err := loadConfig(dir)
58 func TestDataDirFollowsTheOrder(t *testing.T) {
60 testCases := []struct {
67 {"ONECHAT_DIR first", filepath.Join(root, "a"), filepath.Join(root, "xdg"), root, filepath.Join(root, "a")},
68 {"absolute XDG_DATA_HOME", "", filepath.Join(root, "xdg"), root, filepath.Join(root, "xdg", "onechat")},
69 {"relative XDG_DATA_HOME ignored", "", "xdg", root, filepath.Join(root, ".local", "share", "onechat")},
70 {"home directory last", "", "", root, filepath.Join(root, ".local", "share", "onechat")},
73 for _, tc := range testCases {
74 t.Run(tc.name, func(t *testing.T) {
75 t.Setenv("ONECHAT_DIR", tc.dir)
76 t.Setenv("XDG_DATA_HOME", tc.xdg)
77 t.Setenv("HOME", tc.home)
80 require.NoError(t, err)
81 require.Equal(t, tc.want, dir)
83 info, err := os.Stat(dir)
84 require.NoError(t, err)
85 require.Equal(t, os.FileMode(0o700), info.Mode().Perm())
90 func TestDataDirFailsWithoutAHome(t *testing.T) {
91 t.Setenv("ONECHAT_DIR", "")
92 t.Setenv("XDG_DATA_HOME", "")
96 require.ErrorContains(t, err, "ONECHAT_DIR")
99 func writeConfig(t *testing.T, dir, text string) {
102 err := os.WriteFile(filepath.Join(dir, "config.json"), []byte(text), 0o600)
103 require.NoError(t, err)