request_metadata_test.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package service
  2. import (
  3. "context"
  4. "testing"
  5. "github.com/Wei-Shaw/sub2api/internal/pkg/ctxkey"
  6. "github.com/stretchr/testify/require"
  7. )
  8. func TestRequestMetadataWriteAndRead_NoBridge(t *testing.T) {
  9. ctx := context.Background()
  10. ctx = WithIsMaxTokensOneHaikuRequest(ctx, true, false)
  11. ctx = WithThinkingEnabled(ctx, true, false)
  12. ctx = WithPrefetchedStickySession(ctx, 123, 456, false)
  13. ctx = WithSingleAccountRetry(ctx, true, false)
  14. ctx = WithAccountSwitchCount(ctx, 2, false)
  15. isHaiku, ok := IsMaxTokensOneHaikuRequestFromContext(ctx)
  16. require.True(t, ok)
  17. require.True(t, isHaiku)
  18. thinking, ok := ThinkingEnabledFromContext(ctx)
  19. require.True(t, ok)
  20. require.True(t, thinking)
  21. accountID, ok := PrefetchedStickyAccountIDFromContext(ctx)
  22. require.True(t, ok)
  23. require.Equal(t, int64(123), accountID)
  24. groupID, ok := PrefetchedStickyGroupIDFromContext(ctx)
  25. require.True(t, ok)
  26. require.Equal(t, int64(456), groupID)
  27. singleRetry, ok := SingleAccountRetryFromContext(ctx)
  28. require.True(t, ok)
  29. require.True(t, singleRetry)
  30. switchCount, ok := AccountSwitchCountFromContext(ctx)
  31. require.True(t, ok)
  32. require.Equal(t, 2, switchCount)
  33. require.Nil(t, ctx.Value(ctxkey.IsMaxTokensOneHaikuRequest))
  34. require.Nil(t, ctx.Value(ctxkey.ThinkingEnabled))
  35. require.Nil(t, ctx.Value(ctxkey.PrefetchedStickyAccountID))
  36. require.Nil(t, ctx.Value(ctxkey.PrefetchedStickyGroupID))
  37. require.Nil(t, ctx.Value(ctxkey.SingleAccountRetry))
  38. require.Nil(t, ctx.Value(ctxkey.AccountSwitchCount))
  39. }
  40. func TestRequestMetadataWrite_BridgeLegacyKeys(t *testing.T) {
  41. ctx := context.Background()
  42. ctx = WithIsMaxTokensOneHaikuRequest(ctx, true, true)
  43. ctx = WithThinkingEnabled(ctx, true, true)
  44. ctx = WithPrefetchedStickySession(ctx, 123, 456, true)
  45. ctx = WithSingleAccountRetry(ctx, true, true)
  46. ctx = WithAccountSwitchCount(ctx, 2, true)
  47. require.Equal(t, true, ctx.Value(ctxkey.IsMaxTokensOneHaikuRequest))
  48. require.Equal(t, true, ctx.Value(ctxkey.ThinkingEnabled))
  49. require.Equal(t, int64(123), ctx.Value(ctxkey.PrefetchedStickyAccountID))
  50. require.Equal(t, int64(456), ctx.Value(ctxkey.PrefetchedStickyGroupID))
  51. require.Equal(t, true, ctx.Value(ctxkey.SingleAccountRetry))
  52. require.Equal(t, 2, ctx.Value(ctxkey.AccountSwitchCount))
  53. }
  54. func TestRequestMetadataRead_LegacyFallbackAndStats(t *testing.T) {
  55. beforeHaiku, beforeThinking, beforeAccount, beforeGroup, beforeSingleRetry, beforeSwitchCount := RequestMetadataFallbackStats()
  56. ctx := context.Background()
  57. ctx = context.WithValue(ctx, ctxkey.IsMaxTokensOneHaikuRequest, true)
  58. ctx = context.WithValue(ctx, ctxkey.ThinkingEnabled, true)
  59. ctx = context.WithValue(ctx, ctxkey.PrefetchedStickyAccountID, int64(321))
  60. ctx = context.WithValue(ctx, ctxkey.PrefetchedStickyGroupID, int64(654))
  61. ctx = context.WithValue(ctx, ctxkey.SingleAccountRetry, true)
  62. ctx = context.WithValue(ctx, ctxkey.AccountSwitchCount, int64(3))
  63. isHaiku, ok := IsMaxTokensOneHaikuRequestFromContext(ctx)
  64. require.True(t, ok)
  65. require.True(t, isHaiku)
  66. thinking, ok := ThinkingEnabledFromContext(ctx)
  67. require.True(t, ok)
  68. require.True(t, thinking)
  69. accountID, ok := PrefetchedStickyAccountIDFromContext(ctx)
  70. require.True(t, ok)
  71. require.Equal(t, int64(321), accountID)
  72. groupID, ok := PrefetchedStickyGroupIDFromContext(ctx)
  73. require.True(t, ok)
  74. require.Equal(t, int64(654), groupID)
  75. singleRetry, ok := SingleAccountRetryFromContext(ctx)
  76. require.True(t, ok)
  77. require.True(t, singleRetry)
  78. switchCount, ok := AccountSwitchCountFromContext(ctx)
  79. require.True(t, ok)
  80. require.Equal(t, 3, switchCount)
  81. afterHaiku, afterThinking, afterAccount, afterGroup, afterSingleRetry, afterSwitchCount := RequestMetadataFallbackStats()
  82. require.Equal(t, beforeHaiku+1, afterHaiku)
  83. require.Equal(t, beforeThinking+1, afterThinking)
  84. require.Equal(t, beforeAccount+1, afterAccount)
  85. require.Equal(t, beforeGroup+1, afterGroup)
  86. require.Equal(t, beforeSingleRetry+1, afterSingleRetry)
  87. require.Equal(t, beforeSwitchCount+1, afterSwitchCount)
  88. }
  89. func TestRequestMetadataRead_PreferMetadataOverLegacy(t *testing.T) {
  90. ctx := context.WithValue(context.Background(), ctxkey.ThinkingEnabled, false)
  91. ctx = WithThinkingEnabled(ctx, true, false)
  92. thinking, ok := ThinkingEnabledFromContext(ctx)
  93. require.True(t, ok)
  94. require.True(t, thinking)
  95. require.Equal(t, false, ctx.Value(ctxkey.ThinkingEnabled))
  96. }