Files
wehub-resource-sync ead81af521
Deploy to GitHub Pages / deploy (push) Failing after 0s
CI / go (push) Has been cancelled
CI / build (darwin, macos-14) (push) Has been cancelled
CI / build (windows, windows-2025) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:31:13 +08:00

201 lines
5.6 KiB
Go

package config
import (
"os"
"path/filepath"
"strings"
"testing"
)
func withHome(t *testing.T) string {
t.Helper()
home := t.TempDir()
t.Setenv("HOME", home)
return home
}
func readConfig(t *testing.T, home string) string {
t.Helper()
data, err := os.ReadFile(filepath.Join(home, ".config", "cliamp", "config.toml"))
if err != nil {
t.Fatalf("ReadFile: %v", err)
}
return string(data)
}
func TestSaveCreatesConfigFile(t *testing.T) {
home := withHome(t)
if err := Save("volume", "-6"); err != nil {
t.Fatalf("Save: %v", err)
}
got := readConfig(t, home)
if !strings.Contains(got, "volume = -6") {
t.Errorf("config = %q, want 'volume = -6' line", got)
}
}
func TestSaveReplacesExistingKey(t *testing.T) {
home := withHome(t)
dir := filepath.Join(home, ".config", "cliamp")
if err := os.MkdirAll(dir, 0o755); err != nil {
t.Fatalf("MkdirAll: %v", err)
}
initial := "# a comment\nvolume = -12\nspeed = 1.0\n"
if err := os.WriteFile(filepath.Join(dir, "config.toml"), []byte(initial), 0o644); err != nil {
t.Fatalf("WriteFile: %v", err)
}
if err := Save("volume", "-3"); err != nil {
t.Fatalf("Save: %v", err)
}
got := readConfig(t, home)
if !strings.Contains(got, "volume = -3") {
t.Errorf("config = %q, want volume = -3", got)
}
if strings.Contains(got, "volume = -12") {
t.Errorf("config = %q, should have replaced old volume line", got)
}
if !strings.Contains(got, "speed = 1.0") {
t.Errorf("config = %q, unrelated keys must be preserved", got)
}
}
func TestSaveInsertsBeforeFirstSection(t *testing.T) {
home := withHome(t)
dir := filepath.Join(home, ".config", "cliamp")
if err := os.MkdirAll(dir, 0o755); err != nil {
t.Fatalf("MkdirAll: %v", err)
}
initial := "[navidrome]\nurl = \"https://ex.com\"\n"
if err := os.WriteFile(filepath.Join(dir, "config.toml"), []byte(initial), 0o644); err != nil {
t.Fatalf("WriteFile: %v", err)
}
if err := Save("volume", "-6"); err != nil {
t.Fatalf("Save: %v", err)
}
got := readConfig(t, home)
// volume should appear before [navidrome]
volIdx := strings.Index(got, "volume = -6")
navIdx := strings.Index(got, "[navidrome]")
if volIdx < 0 {
t.Fatalf("volume line missing: %q", got)
}
if navIdx < 0 || volIdx > navIdx {
t.Errorf("volume should appear before [navidrome], got:\n%s", got)
}
}
func TestSaveDoesNotMatchKeyInSection(t *testing.T) {
home := withHome(t)
dir := filepath.Join(home, ".config", "cliamp")
if err := os.MkdirAll(dir, 0o755); err != nil {
t.Fatalf("MkdirAll: %v", err)
}
// A [navidrome] section with a 'volume' key (shouldn't be touched by
// the top-level Save).
initial := "[navidrome]\nvolume = \"old\"\n"
if err := os.WriteFile(filepath.Join(dir, "config.toml"), []byte(initial), 0o644); err != nil {
t.Fatalf("WriteFile: %v", err)
}
if err := Save("volume", "-6"); err != nil {
t.Fatalf("Save: %v", err)
}
got := readConfig(t, home)
// The navidrome.volume line stays, and a new top-level volume is added.
if !strings.Contains(got, `volume = "old"`) {
t.Errorf("section-local volume should be untouched:\n%s", got)
}
if !strings.Contains(got, "volume = -6") {
t.Errorf("top-level volume should be added:\n%s", got)
}
}
func TestSaveNavidromeSortCreatesSection(t *testing.T) {
home := withHome(t)
if err := SaveNavidromeSort("alphabeticalByName"); err != nil {
t.Fatalf("SaveNavidromeSort: %v", err)
}
got := readConfig(t, home)
if !strings.Contains(got, "[navidrome]") {
t.Errorf("config should contain [navidrome] section:\n%s", got)
}
if !strings.Contains(got, `browse_sort = "alphabeticalByName"`) {
t.Errorf("config should contain browse_sort key:\n%s", got)
}
}
func TestSaveNavidromeSortReplacesExisting(t *testing.T) {
home := withHome(t)
dir := filepath.Join(home, ".config", "cliamp")
if err := os.MkdirAll(dir, 0o755); err != nil {
t.Fatalf("MkdirAll: %v", err)
}
initial := "[navidrome]\nurl = \"https://e.com\"\nbrowse_sort = \"old\"\n"
if err := os.WriteFile(filepath.Join(dir, "config.toml"), []byte(initial), 0o644); err != nil {
t.Fatalf("WriteFile: %v", err)
}
if err := SaveNavidromeSort("byYear"); err != nil {
t.Fatalf("SaveNavidromeSort: %v", err)
}
got := readConfig(t, home)
if strings.Contains(got, "\"old\"") {
t.Errorf("old browse_sort should be replaced:\n%s", got)
}
if !strings.Contains(got, `browse_sort = "byYear"`) {
t.Errorf("new browse_sort missing:\n%s", got)
}
}
func TestSaveNavidromeSortAppendsKeyInExistingSection(t *testing.T) {
home := withHome(t)
dir := filepath.Join(home, ".config", "cliamp")
if err := os.MkdirAll(dir, 0o755); err != nil {
t.Fatalf("MkdirAll: %v", err)
}
initial := "[navidrome]\nurl = \"https://e.com\"\n[other]\nkey = \"val\"\n"
if err := os.WriteFile(filepath.Join(dir, "config.toml"), []byte(initial), 0o644); err != nil {
t.Fatalf("WriteFile: %v", err)
}
if err := SaveNavidromeSort("random"); err != nil {
t.Fatalf("SaveNavidromeSort: %v", err)
}
got := readConfig(t, home)
if !strings.Contains(got, `browse_sort = "random"`) {
t.Errorf("browse_sort line missing:\n%s", got)
}
// browse_sort should be within [navidrome] block, before [other].
navIdx := strings.Index(got, "[navidrome]")
sortIdx := strings.Index(got, "browse_sort")
otherIdx := strings.Index(got, "[other]")
if navIdx < 0 || sortIdx < navIdx || sortIdx > otherIdx {
t.Errorf("browse_sort should be inside [navidrome] block:\n%s", got)
}
}
func TestSaveFuncDelegates(t *testing.T) {
home := withHome(t)
var f SaveFunc
if err := f.Save("test_key", "123"); err != nil {
t.Fatalf("SaveFunc.Save: %v", err)
}
got := readConfig(t, home)
if !strings.Contains(got, "test_key = 123") {
t.Errorf("config should contain 'test_key = 123':\n%s", got)
}
}