1// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
2//
3// SPDX-License-Identifier: AGPL-3.0-or-later
4
5package config
6
7import (
8 "os"
9 "path/filepath"
10 "testing"
11
12 "git.secluded.site/np/internal/i18n"
13)
14
15func TestLoadDefaults(t *testing.T) {
16 // Create a temporary directory that won't have a config file
17 tmpDir := t.TempDir()
18 originalDBPath := os.Getenv("XDG_CONFIG_HOME")
19 t.Cleanup(func() {
20 if originalDBPath != "" {
21 _ = os.Setenv("XDG_CONFIG_HOME", originalDBPath)
22 } else {
23 _ = os.Unsetenv("XDG_CONFIG_HOME")
24 }
25 })
26 if err := os.Setenv("XDG_CONFIG_HOME", tmpDir); err != nil {
27 t.Fatalf("failed to set XDG_CONFIG_HOME: %v", err)
28 }
29
30 cfg, err := Load()
31 if err != nil {
32 t.Fatalf("Load() failed: %v", err)
33 }
34
35 if cfg.UI.Language != i18n.DefaultLanguage {
36 t.Errorf("expected default language %q, got %q", i18n.DefaultLanguage, cfg.UI.Language)
37 }
38}
39
40func TestLoadValidTOML(t *testing.T) {
41 tmpDir := t.TempDir()
42 originalDBPath := os.Getenv("XDG_CONFIG_HOME")
43 t.Cleanup(func() {
44 if originalDBPath != "" {
45 _ = os.Setenv("XDG_CONFIG_HOME", originalDBPath)
46 } else {
47 _ = os.Unsetenv("XDG_CONFIG_HOME")
48 }
49 })
50 if err := os.Setenv("XDG_CONFIG_HOME", tmpDir); err != nil {
51 t.Fatalf("failed to set XDG_CONFIG_HOME: %v", err)
52 }
53
54 cfgPath, err := Path()
55 if err != nil {
56 t.Fatalf("Path() failed: %v", err)
57 }
58
59 if err := os.MkdirAll(filepath.Dir(cfgPath), 0o755); err != nil {
60 t.Fatalf("mkdir failed: %v", err)
61 }
62
63 content := `[ui]
64language = "tok"
65`
66 if err := os.WriteFile(cfgPath, []byte(content), 0o644); err != nil {
67 t.Fatalf("WriteFile failed: %v", err)
68 }
69
70 cfg, err := Load()
71 if err != nil {
72 t.Fatalf("Load() failed: %v", err)
73 }
74
75 if cfg.UI.Language != "tok" {
76 t.Errorf("expected language %q, got %q", "tok", cfg.UI.Language)
77 }
78}
79
80func TestLoadNormalisation(t *testing.T) {
81 tmpDir := t.TempDir()
82 originalDBPath := os.Getenv("XDG_CONFIG_HOME")
83 t.Cleanup(func() {
84 if originalDBPath != "" {
85 _ = os.Setenv("XDG_CONFIG_HOME", originalDBPath)
86 } else {
87 _ = os.Unsetenv("XDG_CONFIG_HOME")
88 }
89 })
90 if err := os.Setenv("XDG_CONFIG_HOME", tmpDir); err != nil {
91 t.Fatalf("failed to set XDG_CONFIG_HOME: %v", err)
92 }
93
94 cfgPath, err := Path()
95 if err != nil {
96 t.Fatalf("Path() failed: %v", err)
97 }
98
99 if err := os.MkdirAll(filepath.Dir(cfgPath), 0o755); err != nil {
100 t.Fatalf("mkdir failed: %v", err)
101 }
102
103 tests := []struct {
104 name string
105 input string
106 expected string
107 }{
108 {"uppercase", "EN", "en"},
109 {"mixed case", "En-US", "en-us"},
110 {"whitespace", " tok ", "tok"},
111 {"empty", "", i18n.DefaultLanguage},
112 }
113
114 for _, tt := range tests {
115 t.Run(tt.name, func(t *testing.T) {
116 content := "[ui]\nlanguage = \"" + tt.input + "\"\n"
117 if err := os.WriteFile(cfgPath, []byte(content), 0o644); err != nil {
118 t.Fatalf("WriteFile failed: %v", err)
119 }
120
121 cfg, err := Load()
122 if err != nil {
123 t.Fatalf("Load() failed: %v", err)
124 }
125
126 if cfg.UI.Language != tt.expected {
127 t.Errorf("expected language %q, got %q", tt.expected, cfg.UI.Language)
128 }
129 })
130 }
131}
132
133func TestLoadInvalidTOML(t *testing.T) {
134 tmpDir := t.TempDir()
135 originalDBPath := os.Getenv("XDG_CONFIG_HOME")
136 t.Cleanup(func() {
137 if originalDBPath != "" {
138 _ = os.Setenv("XDG_CONFIG_HOME", originalDBPath)
139 } else {
140 _ = os.Unsetenv("XDG_CONFIG_HOME")
141 }
142 })
143 if err := os.Setenv("XDG_CONFIG_HOME", tmpDir); err != nil {
144 t.Fatalf("failed to set XDG_CONFIG_HOME: %v", err)
145 }
146
147 cfgPath, err := Path()
148 if err != nil {
149 t.Fatalf("Path() failed: %v", err)
150 }
151
152 if err := os.MkdirAll(filepath.Dir(cfgPath), 0o755); err != nil {
153 t.Fatalf("mkdir failed: %v", err)
154 }
155
156 content := `[ui
157language = "tok"
158`
159 if err := os.WriteFile(cfgPath, []byte(content), 0o644); err != nil {
160 t.Fatalf("WriteFile failed: %v", err)
161 }
162
163 _, err = Load()
164 if err == nil {
165 t.Fatal("expected error for invalid TOML, got nil")
166 }
167}