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") } }