Add four new infrastructure packages with CLI commands: - pkg/config: layered configuration (defaults → file → env → flags) - pkg/crypt: crypto primitives (Argon2id, AES-GCM, ChaCha20, HMAC, checksums) - pkg/plugin: plugin system with GitHub-based install/update/remove - pkg/collect: collection subsystem (GitHub, BitcoinTalk, market, papers, excavate) Fix all golangci-lint issues across the entire codebase (~100 errcheck, staticcheck SA1012/SA1019/ST1005, unused, ineffassign fixes) so that `core go qa` passes with 0 issues. Closes #167, #168, #170, #250, #251, #252, #253, #254, #255, #256 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
185 lines
4.8 KiB
Go
185 lines
4.8 KiB
Go
package agentic
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestLoadConfig_Good_FromEnvFile(t *testing.T) {
|
|
// Create temp directory with .env file
|
|
tmpDir, err := os.MkdirTemp("", "agentic-test")
|
|
require.NoError(t, err)
|
|
defer func() { _ = os.RemoveAll(tmpDir) }()
|
|
|
|
envContent := `
|
|
AGENTIC_BASE_URL=https://test.api.com
|
|
AGENTIC_TOKEN=test-token-123
|
|
AGENTIC_PROJECT=my-project
|
|
AGENTIC_AGENT_ID=agent-001
|
|
`
|
|
err = os.WriteFile(filepath.Join(tmpDir, ".env"), []byte(envContent), 0644)
|
|
require.NoError(t, err)
|
|
|
|
cfg, err := LoadConfig(tmpDir)
|
|
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "https://test.api.com", cfg.BaseURL)
|
|
assert.Equal(t, "test-token-123", cfg.Token)
|
|
assert.Equal(t, "my-project", cfg.DefaultProject)
|
|
assert.Equal(t, "agent-001", cfg.AgentID)
|
|
}
|
|
|
|
func TestLoadConfig_Good_FromEnvVars(t *testing.T) {
|
|
// Create temp directory with .env file (partial config)
|
|
tmpDir, err := os.MkdirTemp("", "agentic-test")
|
|
require.NoError(t, err)
|
|
defer func() { _ = os.RemoveAll(tmpDir) }()
|
|
|
|
envContent := `
|
|
AGENTIC_TOKEN=env-file-token
|
|
`
|
|
err = os.WriteFile(filepath.Join(tmpDir, ".env"), []byte(envContent), 0644)
|
|
require.NoError(t, err)
|
|
|
|
// Set environment variables that should override
|
|
_ = os.Setenv("AGENTIC_BASE_URL", "https://env-override.com")
|
|
_ = os.Setenv("AGENTIC_TOKEN", "env-override-token")
|
|
defer func() {
|
|
_ = os.Unsetenv("AGENTIC_BASE_URL")
|
|
_ = os.Unsetenv("AGENTIC_TOKEN")
|
|
}()
|
|
|
|
cfg, err := LoadConfig(tmpDir)
|
|
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "https://env-override.com", cfg.BaseURL)
|
|
assert.Equal(t, "env-override-token", cfg.Token)
|
|
}
|
|
|
|
func TestLoadConfig_Bad_NoToken(t *testing.T) {
|
|
// Create temp directory without config
|
|
tmpDir, err := os.MkdirTemp("", "agentic-test")
|
|
require.NoError(t, err)
|
|
defer func() { _ = os.RemoveAll(tmpDir) }()
|
|
|
|
// Create empty .env
|
|
err = os.WriteFile(filepath.Join(tmpDir, ".env"), []byte(""), 0644)
|
|
require.NoError(t, err)
|
|
|
|
// Ensure no env vars are set
|
|
_ = os.Unsetenv("AGENTIC_TOKEN")
|
|
_ = os.Unsetenv("AGENTIC_BASE_URL")
|
|
|
|
_, err = LoadConfig(tmpDir)
|
|
|
|
assert.Error(t, err)
|
|
assert.Contains(t, err.Error(), "no authentication token")
|
|
}
|
|
|
|
func TestLoadConfig_Good_EnvFileWithQuotes(t *testing.T) {
|
|
tmpDir, err := os.MkdirTemp("", "agentic-test")
|
|
require.NoError(t, err)
|
|
defer func() { _ = os.RemoveAll(tmpDir) }()
|
|
|
|
// Test with quoted values
|
|
envContent := `
|
|
AGENTIC_TOKEN="quoted-token"
|
|
AGENTIC_BASE_URL='single-quoted-url'
|
|
`
|
|
err = os.WriteFile(filepath.Join(tmpDir, ".env"), []byte(envContent), 0644)
|
|
require.NoError(t, err)
|
|
|
|
cfg, err := LoadConfig(tmpDir)
|
|
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "quoted-token", cfg.Token)
|
|
assert.Equal(t, "single-quoted-url", cfg.BaseURL)
|
|
}
|
|
|
|
func TestLoadConfig_Good_EnvFileWithComments(t *testing.T) {
|
|
tmpDir, err := os.MkdirTemp("", "agentic-test")
|
|
require.NoError(t, err)
|
|
defer func() { _ = os.RemoveAll(tmpDir) }()
|
|
|
|
envContent := `
|
|
# This is a comment
|
|
AGENTIC_TOKEN=token-with-comments
|
|
|
|
# Another comment
|
|
AGENTIC_PROJECT=commented-project
|
|
`
|
|
err = os.WriteFile(filepath.Join(tmpDir, ".env"), []byte(envContent), 0644)
|
|
require.NoError(t, err)
|
|
|
|
cfg, err := LoadConfig(tmpDir)
|
|
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "token-with-comments", cfg.Token)
|
|
assert.Equal(t, "commented-project", cfg.DefaultProject)
|
|
}
|
|
|
|
func TestSaveConfig_Good(t *testing.T) {
|
|
// Create temp home directory
|
|
tmpHome, err := os.MkdirTemp("", "agentic-home")
|
|
require.NoError(t, err)
|
|
defer func() { _ = os.RemoveAll(tmpHome) }()
|
|
|
|
// Override HOME for the test
|
|
originalHome := os.Getenv("HOME")
|
|
_ = os.Setenv("HOME", tmpHome)
|
|
defer func() { _ = os.Setenv("HOME", originalHome) }()
|
|
|
|
cfg := &Config{
|
|
BaseURL: "https://saved.api.com",
|
|
Token: "saved-token",
|
|
DefaultProject: "saved-project",
|
|
AgentID: "saved-agent",
|
|
}
|
|
|
|
err = SaveConfig(cfg)
|
|
require.NoError(t, err)
|
|
|
|
// Verify file was created
|
|
configPath := filepath.Join(tmpHome, ".core", "agentic.yaml")
|
|
_, err = os.Stat(configPath)
|
|
assert.NoError(t, err)
|
|
|
|
// Read back the config
|
|
data, err := os.ReadFile(configPath)
|
|
require.NoError(t, err)
|
|
assert.Contains(t, string(data), "saved.api.com")
|
|
assert.Contains(t, string(data), "saved-token")
|
|
}
|
|
|
|
func TestConfigPath_Good(t *testing.T) {
|
|
path, err := ConfigPath()
|
|
|
|
require.NoError(t, err)
|
|
assert.Contains(t, path, ".core")
|
|
assert.Contains(t, path, "agentic.yaml")
|
|
}
|
|
|
|
func TestLoadConfig_Good_DefaultBaseURL(t *testing.T) {
|
|
tmpDir, err := os.MkdirTemp("", "agentic-test")
|
|
require.NoError(t, err)
|
|
defer func() { _ = os.RemoveAll(tmpDir) }()
|
|
|
|
// Only provide token, should use default base URL
|
|
envContent := `
|
|
AGENTIC_TOKEN=test-token
|
|
`
|
|
err = os.WriteFile(filepath.Join(tmpDir, ".env"), []byte(envContent), 0644)
|
|
require.NoError(t, err)
|
|
|
|
// Clear any env overrides
|
|
_ = os.Unsetenv("AGENTIC_BASE_URL")
|
|
|
|
cfg, err := LoadConfig(tmpDir)
|
|
|
|
require.NoError(t, err)
|
|
assert.Equal(t, DefaultBaseURL, cfg.BaseURL)
|
|
}
|