mirror of
https://github.com/cheat/cheat.git
synced 2026-03-07 11:13:33 +01:00
Previously, env vars were only consulted during config generation and baked into conf.yml. At runtime, the config file value was always used, making it impossible to override the editor via environment variables. Now the precedence is: $VISUAL > $EDITOR > conf.yml > auto-detect. Closes #589 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
136 lines
3.2 KiB
Go
136 lines
3.2 KiB
Go
package config
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
func TestNewTrimsWhitespace(t *testing.T) {
|
|
// clear env vars so they don't override the config file value
|
|
oldVisual := os.Getenv("VISUAL")
|
|
oldEditor := os.Getenv("EDITOR")
|
|
os.Unsetenv("VISUAL")
|
|
os.Unsetenv("EDITOR")
|
|
defer func() {
|
|
os.Setenv("VISUAL", oldVisual)
|
|
os.Setenv("EDITOR", oldEditor)
|
|
}()
|
|
|
|
// Create a temporary config file with whitespace in editor and pager
|
|
tmpDir := t.TempDir()
|
|
configPath := filepath.Join(tmpDir, "config.yml")
|
|
|
|
configContent := `---
|
|
editor: " vim -c 'set number' "
|
|
pager: " less -R "
|
|
style: monokai
|
|
formatter: terminal
|
|
cheatpaths:
|
|
- name: personal
|
|
path: ~/cheat
|
|
tags: []
|
|
readonly: false
|
|
`
|
|
|
|
if err := os.WriteFile(configPath, []byte(configContent), 0644); err != nil {
|
|
t.Fatalf("failed to write test config: %v", err)
|
|
}
|
|
|
|
// Load the config
|
|
conf, err := New(map[string]interface{}{}, configPath, false)
|
|
if err != nil {
|
|
t.Fatalf("failed to load config: %v", err)
|
|
}
|
|
|
|
// Verify editor is trimmed
|
|
expectedEditor := "vim -c 'set number'"
|
|
if conf.Editor != expectedEditor {
|
|
t.Errorf("editor not properly trimmed: got %q, want %q", conf.Editor, expectedEditor)
|
|
}
|
|
|
|
// Verify pager is trimmed
|
|
expectedPager := "less -R"
|
|
if conf.Pager != expectedPager {
|
|
t.Errorf("pager not properly trimmed: got %q, want %q", conf.Pager, expectedPager)
|
|
}
|
|
}
|
|
|
|
func TestNewEmptyEditorFallback(t *testing.T) {
|
|
// Skip if required environment variables would interfere
|
|
oldVisual := os.Getenv("VISUAL")
|
|
oldEditor := os.Getenv("EDITOR")
|
|
os.Unsetenv("VISUAL")
|
|
os.Unsetenv("EDITOR")
|
|
defer func() {
|
|
os.Setenv("VISUAL", oldVisual)
|
|
os.Setenv("EDITOR", oldEditor)
|
|
}()
|
|
|
|
// Create a config with whitespace-only editor
|
|
tmpDir := t.TempDir()
|
|
configPath := filepath.Join(tmpDir, "config.yml")
|
|
|
|
configContent := `---
|
|
editor: " "
|
|
pager: less
|
|
style: monokai
|
|
formatter: terminal
|
|
cheatpaths:
|
|
- name: personal
|
|
path: ~/cheat
|
|
tags: []
|
|
readonly: false
|
|
`
|
|
|
|
if err := os.WriteFile(configPath, []byte(configContent), 0644); err != nil {
|
|
t.Fatalf("failed to write test config: %v", err)
|
|
}
|
|
|
|
// Load the config
|
|
conf, err := New(map[string]interface{}{}, configPath, false)
|
|
if err != nil {
|
|
// It's OK if this fails due to no editor being found
|
|
// The important thing is it doesn't panic
|
|
return
|
|
}
|
|
|
|
// If it succeeded, editor should not be empty (fallback was used)
|
|
if conf.Editor == "" {
|
|
t.Error("editor should not be empty after fallback")
|
|
}
|
|
}
|
|
|
|
func TestNewWhitespaceOnlyPager(t *testing.T) {
|
|
// Create a config with whitespace-only pager
|
|
tmpDir := t.TempDir()
|
|
configPath := filepath.Join(tmpDir, "config.yml")
|
|
|
|
configContent := `---
|
|
editor: vim
|
|
pager: " "
|
|
style: monokai
|
|
formatter: terminal
|
|
cheatpaths:
|
|
- name: personal
|
|
path: ~/cheat
|
|
tags: []
|
|
readonly: false
|
|
`
|
|
|
|
if err := os.WriteFile(configPath, []byte(configContent), 0644); err != nil {
|
|
t.Fatalf("failed to write test config: %v", err)
|
|
}
|
|
|
|
// Load the config
|
|
conf, err := New(map[string]interface{}{}, configPath, false)
|
|
if err != nil {
|
|
t.Fatalf("failed to load config: %v", err)
|
|
}
|
|
|
|
// Pager should be empty after trimming
|
|
if conf.Pager != "" {
|
|
t.Errorf("pager should be empty after trimming whitespace: got %q", conf.Pager)
|
|
}
|
|
}
|