cd07e435d9
New internal/config package: Config struct (HCL tags), Load(paths...), MergeOverrides(flags, env) with flag>env>file>default precedence (D-039). No package-level state (AD-023). --config persistent flag on root command; daemon uses cfg.ListenAddr when flag at default. 11 config tests + 2 cli tests. ---ci--- project: orca phase: 2 milestone: v0.7 status: verify requirements: covered: [REQ-054] partial: [] ---/ci---
115 lines
2.7 KiB
Go
115 lines
2.7 KiB
Go
package cli
|
|
|
|
import (
|
|
"os"
|
|
"strings"
|
|
"testing"
|
|
|
|
"git.cloudinit.dev/coreci/orca/internal/config"
|
|
)
|
|
|
|
func TestVersionCommandExists(t *testing.T) {
|
|
found := false
|
|
for _, cmd := range rootCmd.Commands() {
|
|
if cmd.Name() == "version" {
|
|
found = true
|
|
break
|
|
}
|
|
}
|
|
if !found {
|
|
t.Fatal("version command not registered")
|
|
}
|
|
}
|
|
|
|
func TestRootHasAllSubcommands(t *testing.T) {
|
|
expected := []string{"version", "init", "status", "node", "job"}
|
|
registered := make(map[string]bool)
|
|
for _, cmd := range rootCmd.Commands() {
|
|
registered[cmd.Name()] = true
|
|
}
|
|
for _, name := range expected {
|
|
if !registered[name] {
|
|
t.Errorf("expected subcommand %q not registered", name)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestNodeSubcommands(t *testing.T) {
|
|
expected := []string{"join", "leave", "list"}
|
|
registered := make(map[string]bool)
|
|
for _, cmd := range nodeCmd.Commands() {
|
|
registered[cmd.Name()] = true
|
|
}
|
|
for _, name := range expected {
|
|
if !registered[name] {
|
|
t.Errorf("expected node subcommand %q not registered", name)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestJobSubcommands(t *testing.T) {
|
|
expected := []string{"run", "list", "stop", "logs"}
|
|
registered := make(map[string]bool)
|
|
for _, cmd := range jobCmd.Commands() {
|
|
registered[cmd.Name()] = true
|
|
}
|
|
for _, name := range expected {
|
|
if !registered[name] {
|
|
t.Errorf("expected job subcommand %q not registered", name)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestRootHelpMentionsKeyPillars(t *testing.T) {
|
|
help := rootCmd.Long
|
|
for _, pillar := range []string{"offline", "CLI", "Nomad", "simplicity"} {
|
|
if !strings.Contains(strings.ToLower(help), strings.ToLower(pillar)) {
|
|
t.Errorf("root help does not mention pillar %q", pillar)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestConfigFlagRegistered(t *testing.T) {
|
|
f := rootCmd.PersistentFlags().Lookup("config")
|
|
if f == nil {
|
|
t.Fatal("--config persistent flag not registered")
|
|
}
|
|
if f.DefValue != "" {
|
|
t.Errorf("--config default = %q, want empty", f.DefValue)
|
|
}
|
|
}
|
|
|
|
func TestConfigFlagLoadsFile(t *testing.T) {
|
|
dir := t.TempDir()
|
|
cfgPath := dir + "/config.hcl"
|
|
cfgContent := `db_path = "` + dir + `/test.db"
|
|
listen_addr = "127.0.0.1:9999"
|
|
ca_path = "` + dir + `/ca.crt"
|
|
server_cert_path = "` + dir + `/server.crt"
|
|
server_key_path = "` + dir + `/server.key"
|
|
|
|
node_capacity {
|
|
cpu = 4
|
|
memory_mb = 8192
|
|
}
|
|
`
|
|
if err := os.WriteFile(cfgPath, []byte(cfgContent), 0o644); err != nil {
|
|
t.Fatalf("write config: %v", err)
|
|
}
|
|
|
|
old := configPath
|
|
configPath = cfgPath
|
|
defer func() { configPath = old }()
|
|
|
|
cfg, err := config.Load(cfgPath)
|
|
if err != nil {
|
|
t.Fatalf("load config: %v", err)
|
|
}
|
|
if cfg.ListenAddr != "127.0.0.1:9999" {
|
|
t.Errorf("listen_addr = %q, want 127.0.0.1:9999", cfg.ListenAddr)
|
|
}
|
|
if cfg.NodeCapacity == nil || cfg.NodeCapacity.CPU != 4 {
|
|
t.Errorf("node_capacity.cpu not parsed, got %+v", cfg.NodeCapacity)
|
|
}
|
|
}
|