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 {
40 name: "unknown field",
41 text: `{"endpont": "api"}`,
44 name: "unknown nested field",
45 text: `{"compactor": {"modle": "x"}}`,
49 text: `{"endpoint": "https://example.com/v1/responses"}`,
53 text: `{"compactor": {"model": ""}}`,
56 name: "second object",
61 text: `{"endpoint": `,
65 for _, tc := range testCases {
66 t.Run(tc.name, func(t *testing.T) {
68 writeConfig(t, dir, tc.text)
70 _, err := loadConfig(dir)
76 func TestDataDirFollowsTheOrder(t *testing.T) {
78 testCases := []struct {
86 name: "ONECHAT_DIR first",
87 dir: filepath.Join(root, "a"),
88 xdg: filepath.Join(root, "xdg"),
90 want: filepath.Join(root, "a"),
93 name: "absolute XDG_DATA_HOME",
95 xdg: filepath.Join(root, "xdg"),
97 want: filepath.Join(root, "xdg", "onechat"),
100 name: "relative XDG_DATA_HOME ignored",
104 want: filepath.Join(root, ".local", "share", "onechat"),
107 name: "home directory last",
111 want: filepath.Join(root, ".local", "share", "onechat"),
115 for _, tc := range testCases {
116 t.Run(tc.name, func(t *testing.T) {
117 t.Setenv("ONECHAT_DIR", tc.dir)
118 t.Setenv("XDG_DATA_HOME", tc.xdg)
119 t.Setenv("HOME", tc.home)
121 dir, err := dataDir()
122 require.NoError(t, err)
123 require.Equal(t, tc.want, dir)
125 info, err := os.Stat(dir)
126 require.NoError(t, err)
127 require.Equal(t, os.FileMode(0o700), info.Mode().Perm())
132 func TestDataDirFailsWithoutAHome(t *testing.T) {
133 t.Setenv("ONECHAT_DIR", "")
134 t.Setenv("XDG_DATA_HOME", "")
138 require.ErrorContains(t, err, "ONECHAT_DIR")
141 func writeConfig(t *testing.T, dir, text string) {
144 err := os.WriteFile(filepath.Join(dir, "config.json"), []byte(text), 0o600)
145 require.NoError(t, err)