package theming import ( "os" "path/filepath" "strings" "testing" "github.com/MDietermann/ArduinoArchSetup/internal/config" ) func TestListDiscoversThemes(t *testing.T) { themes := List() if len(themes) == 0 { t.Fatal("no themes discovered") } for _, th := range themes { if th.ID == "" || th.DisplayName == "" || th.NvChadTheme == "" { t.Errorf("incomplete theme: %+v", th) } } } func TestGetKnownThemeReturnsMatch(t *testing.T) { got, ok := Get("gruvbox") if !ok { t.Fatal("gruvbox should exist") } if got.ID != "gruvbox" || got.DisplayName == "" || got.NvChadTheme != "gruvbox" { t.Fatalf("got %+v", got) } } func TestGetUnknownThemeReturnsFalse(t *testing.T) { if _, ok := Get("does-not-exist"); ok { t.Fatal("bogus id should return ok=false") } } func TestListIsSortedByID(t *testing.T) { themes := List() for i := 1; i < len(themes); i++ { if themes[i].ID < themes[i-1].ID { t.Fatalf("not sorted: %s before %s", themes[i-1].ID, themes[i].ID) } } } func TestApplyWritesFourToolConfigs(t *testing.T) { home := t.TempDir() t.Setenv("HOME", home) if err := Apply(config.Config{}, "gruvbox"); err != nil { t.Fatal(err) } checks := []struct{ rel, wantPrefix string }{ {".config/starship.toml", "palette"}, {".config/zellij/config.kdl", "theme"}, {".config/yazi/theme.toml", ""}, {".config/lazygit/config.yml", "gui"}, } for _, c := range checks { data, err := os.ReadFile(filepath.Join(home, c.rel)) if err != nil { t.Errorf("%s missing: %v", c.rel, err) continue } if len(data) == 0 { t.Errorf("%s empty", c.rel) } if c.wantPrefix != "" && !strings.HasPrefix(strings.TrimSpace(string(data)), c.wantPrefix) { t.Errorf("%s: want prefix %q, got %q", c.rel, c.wantPrefix, string(data[:min(len(data), 40)])) } } } func TestApplyUnknownThemeErrors(t *testing.T) { if err := Apply(config.Config{}, "does-not-exist"); err == nil { t.Fatal("want error on unknown theme") } }