package config
import (
"os"
"path/filepath"
"testing"
)
func TestLoadMissingReturnsDefaults(t *testing.T) {
cfg, err := Load(filepath.Join(t.TempDir(), "nope.toml"))
if err != nil {
t.Fatalf("Load: %v", err)
}
if got := cfg.Region; got != "us-east-1" {
t.Errorf("default region = %q, want us-east-1", got)
}
}
func TestSaveThenLoadRoundTrip(t *testing.T) {
path := filepath.Join(t.TempDir(), "config.toml")
want := Config{
Endpoint: "https://s3.bigb.es",
Region: "garage",
Bucket: "docker-cache",
Prefix: "tarantool-protobuf",
ArchSuffix: true,
KeyFile: "~/.k",
SecretFile: "~/.s",
}
if err := Save(path, want); err != nil {
t.Fatalf("Save: %v", err)
}
got, err := Load(path)
if err != nil {
t.Fatalf("Load: %v", err)
}
if got != want {
t.Errorf("round trip mismatch\n got: %+v\nwant: %+v", got, want)
}
}
func TestApplyEnvOverlays(t *testing.T) {
t.Setenv("CACHER_BUCKET", "override-bucket")
t.Setenv("CACHER_ARCH_SUFFIX", "true")
cfg := Config{Bucket: "from-file", Region: "garage"}
if err := ApplyEnv(&cfg); err != nil {
t.Fatalf("ApplyEnv: %v", err)
}
if cfg.Bucket != "override-bucket" {
t.Errorf("Bucket = %q, want override-bucket", cfg.Bucket)
}
if !cfg.ArchSuffix {
t.Errorf("ArchSuffix = false, want true")
}
if cfg.Region != "garage" {
t.Errorf("Region clobbered to %q (unset env should not zero existing value)", cfg.Region)
}
}
func TestCredentialsEnvBeatsFile(t *testing.T) {
dir := t.TempDir()
keyPath := filepath.Join(dir, "key")
secPath := filepath.Join(dir, "sec")
if err := os.WriteFile(keyPath, []byte("file-key\n"), 0o600); err != nil {
t.Fatal(err)
}
if err := os.WriteFile(secPath, []byte("file-sec\n"), 0o600); err != nil {
t.Fatal(err)
}
t.Setenv("CACHER_S3_KEY_ID", "env-key")
cfg := Config{KeyFile: keyPath, SecretFile: secPath}
k, s, err := cfg.Credentials()
if err != nil {
t.Fatalf("Credentials: %v", err)
}
if k != "env-key" {
t.Errorf("key id = %q, want env-key", k)
}
if s != "file-sec" {
t.Errorf("secret = %q, want file-sec (whitespace trimmed)", s)
}
}
func TestCredentialsTrimsWhitespace(t *testing.T) {
dir := t.TempDir()
keyPath := filepath.Join(dir, "key")
secPath := filepath.Join(dir, "sec")
if err := os.WriteFile(keyPath, []byte(" raw-key \r\n"), 0o600); err != nil {
t.Fatal(err)
}
if err := os.WriteFile(secPath, []byte("\nraw-sec\n"), 0o600); err != nil {
t.Fatal(err)
}
t.Setenv("CACHER_S3_KEY_ID", "")
t.Setenv("CACHER_S3_SECRET", "")
cfg := Config{KeyFile: keyPath, SecretFile: secPath}
k, s, err := cfg.Credentials()
if err != nil {
t.Fatalf("Credentials: %v", err)
}
if k != "raw-key" || s != "raw-sec" {
t.Errorf("trimming failed: key=%q secret=%q", k, s)
}
}
func TestValidateMissingFields(t *testing.T) {
err := Config{Region: "garage"}.Validate()
if err == nil {
t.Fatal("expected error for missing endpoint/bucket")
}
}