All checks were successful
gobuild / build (push) Successful in 21s
Added comprehensive unit and live integration tests in new files: - commander_test.go: Covers isInstalled and subExecute functions - filer_test.go: Covers createIniFile with various scenarios - radiomenu_test.go: Covers Short, Quit, and RadioMenu - stations_test.go: Covers showVersion and precheck These tests ensure reliability across happy paths, edge cases, and live environments.
140 lines
3.0 KiB
Go
140 lines
3.0 KiB
Go
package main
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
func TestCreateIniFile_Unit(t *testing.T) {
|
|
t.Parallel()
|
|
t.Log("✓ Fast createIniFile unit test")
|
|
|
|
tests := []struct {
|
|
name string
|
|
fpath string
|
|
setup func(string)
|
|
wantLen int
|
|
wantFile bool
|
|
}{
|
|
{
|
|
name: "happy path",
|
|
fpath: "testdata/config.ini",
|
|
wantLen: 0,
|
|
wantFile: true,
|
|
},
|
|
{
|
|
name: "dir already exists",
|
|
fpath: "testdata/config.ini",
|
|
setup: func(dir string) {
|
|
os.MkdirAll(dir, 0770)
|
|
},
|
|
wantLen: 0,
|
|
wantFile: true,
|
|
},
|
|
{
|
|
name: "deep nested dir",
|
|
fpath: "testdata/nested/sub/dir/config.ini",
|
|
wantLen: 0,
|
|
wantFile: true,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
dir := t.TempDir()
|
|
fpath := filepath.Join(dir, tt.fpath)
|
|
|
|
origWd, err := os.Getwd()
|
|
if err != nil {
|
|
t.Fatalf("failed to get working dir: %v", err)
|
|
}
|
|
if err := os.Chdir(dir); err != nil {
|
|
t.Fatalf("failed to chdir: %v", err)
|
|
}
|
|
defer func() {
|
|
if err := os.Chdir(origWd); err != nil {
|
|
t.Errorf("failed to restore working dir: %v", err)
|
|
}
|
|
}()
|
|
|
|
if tt.setup != nil {
|
|
tt.setup(filepath.Dir(fpath))
|
|
}
|
|
|
|
errs := createIniFile(fpath)
|
|
if len(errs) != tt.wantLen {
|
|
t.Errorf("createIniFile() got %d errors = %v, want len %d", len(errs), errs, tt.wantLen)
|
|
}
|
|
|
|
exists := false
|
|
if tt.wantFile {
|
|
exists = true
|
|
if _, err := os.Stat(fpath); err != nil {
|
|
if os.IsNotExist(err) {
|
|
exists = false
|
|
} else {
|
|
t.Errorf("stat(%q) unexpected error: %v", fpath, err)
|
|
}
|
|
}
|
|
}
|
|
|
|
if exists != tt.wantFile {
|
|
t.Errorf("file exists = %v, want %v", exists, tt.wantFile)
|
|
}
|
|
|
|
if tt.wantFile {
|
|
data, err := os.ReadFile(fpath)
|
|
if err != nil {
|
|
t.Errorf("failed to read created file: %v", err)
|
|
return
|
|
}
|
|
const wantContent = `[DEFAULT]
|
|
radio_browser.api=all.api.radio-browser.info
|
|
player.command=mpv
|
|
player.options=--no-video
|
|
menu_items.max=9999
|
|
`
|
|
if string(data) != wantContent {
|
|
t.Errorf("file content mismatch:\ngot: %q\nwant: %q", string(data), wantContent)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestCreateIniFile_Live(t *testing.T) {
|
|
if !testing.Short() {
|
|
t.Skip("skipping live integration test. Run with:\n go test -run TestCreateIniFile_Live -short -v")
|
|
}
|
|
t.Log("🧪 Running live integration test...")
|
|
|
|
dir := t.TempDir()
|
|
fpath := filepath.Join(dir, "live_config.ini")
|
|
t.Logf("🧪 Testing with real file path: %s", fpath)
|
|
|
|
errs := createIniFile(fpath)
|
|
t.Logf("🧪 createIniFile returned %d errors", len(errs))
|
|
|
|
if len(errs) > 0 {
|
|
t.Errorf("unexpected errors: %v", errs)
|
|
return
|
|
}
|
|
|
|
data, err := os.ReadFile(fpath)
|
|
if err != nil {
|
|
t.Fatalf("failed to read created file: %v", err)
|
|
}
|
|
|
|
const wantContent = `[DEFAULT]
|
|
radio_browser.api=all.api.radio-browser.info
|
|
player.command=mpv
|
|
player.options=--no-video
|
|
menu_items.max=9999
|
|
`
|
|
if string(data) != wantContent {
|
|
t.Errorf("file content mismatch:\ngot: %q\nwant: %q", string(data), wantContent)
|
|
}
|
|
|
|
t.Logf("🧪 Live test PASSED: file created successfully with correct content")
|
|
} |