package calls import ( "testing" "time" ) // The refresh margin scales with the TTL (a quarter, floored at 5m) so a short // R3 TTL still leaves every served credential a comfortable validity window // without refetching on every call. func TestNewProvider_RefreshMargin(t *testing.T) { cases := []struct { name string ttl time.Duration want time.Duration }{ {"default when zero", 0, DefaultTTL / 4}, // ttl<=0 → DefaultTTL (1h) → 15m {"one hour", time.Hour, 15 * time.Minute}, // quarter {"quarter floored at 5m", 10 * time.Minute, 5 * time.Minute}, // 2.5m → floor 5m, 5m<10m {"pathologically short", 4 * time.Minute, 2 * time.Minute}, // floor 5m >= 4m ttl → ttl/2 } for _, c := range cases { t.Run(c.name, func(t *testing.T) { p := NewProvider("k", "tok", c.ttl) if p.refreshMargin != c.want { t.Errorf("refreshMargin: got %v, want %v", p.refreshMargin, c.want) } if p.refreshMargin >= p.ttl { t.Errorf("margin %v must stay under ttl %v so the cache can serve", p.refreshMargin, p.ttl) } }) } }