@@ -8,6 +8,7 @@ import (
88 "runtime"
99 "strings"
1010 "testing"
11+ "time"
1112
1213 "charm.land/fantasy"
1314 "charm.land/x/vcr"
@@ -793,3 +794,34 @@ func TestPreparePrompt_OrphanedToolUseMixed(t *testing.T) {
793794 }
794795 require.Equal(t, 1, syntheticCount, "expected exactly one synthetic result for the orphaned call")
795796}
797+
798+func TestProviderRetryLogFields(t *testing.T) {
799+ t.Run("nil provider error", func(t *testing.T) {
800+ fields := providerRetryLogFields(nil, 2*time.Second)
801+ require.Equal(t, []any{"retry_delay", "2s"}, fields)
802+ })
803+
804+ t.Run("provider error with title and message", func(t *testing.T) {
805+ fields := providerRetryLogFields(&fantasy.ProviderError{
806+ StatusCode: 429,
807+ Title: "rate limit",
808+ Message: "too many requests",
809+ }, 1500*time.Millisecond)
810+ require.Equal(t, []any{
811+ "retry_delay", "1.5s",
812+ "status_code", 429,
813+ "title", "rate limit",
814+ "message", "too many requests",
815+ }, fields)
816+ })
817+
818+ t.Run("provider error without optional strings", func(t *testing.T) {
819+ fields := providerRetryLogFields(&fantasy.ProviderError{
820+ StatusCode: 503,
821+ }, time.Second)
822+ require.Equal(t, []any{
823+ "retry_delay", "1s",
824+ "status_code", 503,
825+ }, fields)
826+ })
827+}