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