* feat(config): Add support for env var configuration This commit introduces support for two environment variables, allowing users to override the default paths for picoclaw's home directory and configuration file. - `PICOCLAW_CONFIG`: Directly specifies the path to the `config.json` file. This is initialised first, takes precedence over the hardcoded path, and is ideal for containerized deployments or custom config management. - `PICOCLAW_HOME`: Overrides the root directory for all picoclaw data, (except the config) (e.g., `~/.picoclaw`). This is useful for portable installations or placing data in non-standard locations. This change provides greater flexibility for running picoclaw in various environments without being tied to the default home directory structure. * `README.md` updated explain PICOCLAW_CONFIG and PICOCLAW_HOME * docs: translate environment variables section to multiple languages --------- Co-authored-by: picoclaw <picoclaw@sipeed.com>
107 lines
2.6 KiB
Go
107 lines
2.6 KiB
Go
package internal
|
|
|
|
import (
|
|
"path/filepath"
|
|
"runtime"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestGetConfigPath(t *testing.T) {
|
|
t.Setenv("HOME", "/tmp/home")
|
|
|
|
got := GetConfigPath()
|
|
want := filepath.Join("/tmp/home", ".picoclaw", "config.json")
|
|
|
|
assert.Equal(t, want, got)
|
|
}
|
|
|
|
func TestFormatVersion_NoGitCommit(t *testing.T) {
|
|
oldVersion, oldGit := version, gitCommit
|
|
t.Cleanup(func() { version, gitCommit = oldVersion, oldGit })
|
|
|
|
version = "1.2.3"
|
|
gitCommit = ""
|
|
|
|
assert.Equal(t, "1.2.3", FormatVersion())
|
|
}
|
|
|
|
func TestFormatVersion_WithGitCommit(t *testing.T) {
|
|
oldVersion, oldGit := version, gitCommit
|
|
t.Cleanup(func() { version, gitCommit = oldVersion, oldGit })
|
|
|
|
version = "1.2.3"
|
|
gitCommit = "abc123"
|
|
|
|
assert.Equal(t, "1.2.3 (git: abc123)", FormatVersion())
|
|
}
|
|
|
|
func TestFormatBuildInfo_UsesBuildTimeAndGoVersion_WhenSet(t *testing.T) {
|
|
oldBuildTime, oldGoVersion := buildTime, goVersion
|
|
t.Cleanup(func() { buildTime, goVersion = oldBuildTime, oldGoVersion })
|
|
|
|
buildTime = "2026-02-20T00:00:00Z"
|
|
goVersion = "go1.23.0"
|
|
|
|
build, goVer := FormatBuildInfo()
|
|
|
|
assert.Equal(t, buildTime, build)
|
|
assert.Equal(t, goVersion, goVer)
|
|
}
|
|
|
|
func TestFormatBuildInfo_EmptyBuildTime_ReturnsEmptyBuild(t *testing.T) {
|
|
oldBuildTime, oldGoVersion := buildTime, goVersion
|
|
t.Cleanup(func() { buildTime, goVersion = oldBuildTime, oldGoVersion })
|
|
|
|
buildTime = ""
|
|
goVersion = "go1.23.0"
|
|
|
|
build, goVer := FormatBuildInfo()
|
|
|
|
assert.Empty(t, build)
|
|
assert.Equal(t, goVersion, goVer)
|
|
}
|
|
|
|
func TestFormatBuildInfo_EmptyGoVersion_FallsBackToRuntimeVersion(t *testing.T) {
|
|
oldBuildTime, oldGoVersion := buildTime, goVersion
|
|
t.Cleanup(func() { buildTime, goVersion = oldBuildTime, oldGoVersion })
|
|
|
|
buildTime = "x"
|
|
goVersion = ""
|
|
|
|
build, goVer := FormatBuildInfo()
|
|
|
|
assert.Equal(t, "x", build)
|
|
assert.Equal(t, runtime.Version(), goVer)
|
|
}
|
|
|
|
func TestGetConfigPath_Windows(t *testing.T) {
|
|
if runtime.GOOS != "windows" {
|
|
t.Skip("windows-specific HOME behavior varies; run on windows")
|
|
}
|
|
|
|
testUserProfilePath := `C:\Users\Test`
|
|
t.Setenv("USERPROFILE", testUserProfilePath)
|
|
|
|
got := GetConfigPath()
|
|
want := filepath.Join(testUserProfilePath, ".picoclaw", "config.json")
|
|
|
|
require.True(t, strings.EqualFold(got, want), "GetConfigPath() = %q, want %q", got, want)
|
|
}
|
|
|
|
func TestGetVersion(t *testing.T) {
|
|
assert.Equal(t, "dev", GetVersion())
|
|
}
|
|
|
|
func TestGetConfigPath_WithEnv(t *testing.T) {
|
|
t.Setenv("PICOCLAW_CONFIG", "/tmp/custom/config.json")
|
|
t.Setenv("HOME", "/tmp/home") // Also set home to ensure env is preferred
|
|
|
|
got := GetConfigPath()
|
|
want := "/tmp/custom/config.json"
|
|
|
|
assert.Equal(t, want, got)
|
|
}
|