config_test.go

  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}