account_handler_grok_refresh_test.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. //go:build unit
  2. package admin
  3. import (
  4. "context"
  5. "testing"
  6. "github.com/Wei-Shaw/sub2api/internal/service"
  7. "github.com/stretchr/testify/require"
  8. )
  9. type grokRefreshOAuthStub struct {
  10. account *service.Account
  11. info *service.GrokTokenInfo
  12. calls int
  13. }
  14. func (s *grokRefreshOAuthStub) RefreshAccountToken(_ context.Context, account *service.Account) (*service.GrokTokenInfo, error) {
  15. s.calls++
  16. s.account = account
  17. return s.info, nil
  18. }
  19. func (s *grokRefreshOAuthStub) BuildAccountCredentials(info *service.GrokTokenInfo) map[string]any {
  20. return map[string]any{
  21. "access_token": info.AccessToken,
  22. "refresh_token": info.RefreshToken,
  23. "expires_at": info.ExpiresAt,
  24. "base_url": "https://api.x.ai/v1",
  25. }
  26. }
  27. type grokRefreshAdminService struct {
  28. *stubAdminService
  29. updatedCredentials map[string]any
  30. }
  31. func (s *grokRefreshAdminService) UpdateAccount(_ context.Context, id int64, input *service.UpdateAccountInput) (*service.Account, error) {
  32. s.updatedCredentials = input.Credentials
  33. return &service.Account{
  34. ID: id,
  35. Platform: service.PlatformGrok,
  36. Type: service.AccountTypeOAuth,
  37. Status: service.StatusActive,
  38. Credentials: input.Credentials,
  39. }, nil
  40. }
  41. func TestRefreshSingleAccountRoutesGrokThroughGrokOAuthService(t *testing.T) {
  42. t.Parallel()
  43. adminSvc := &grokRefreshAdminService{stubAdminService: newStubAdminService()}
  44. grokOAuth := &grokRefreshOAuthStub{info: &service.GrokTokenInfo{
  45. AccessToken: "new-access",
  46. RefreshToken: "new-refresh",
  47. ExpiresAt: 1_800_000_000,
  48. }}
  49. handler := NewAccountHandler(
  50. adminSvc,
  51. nil,
  52. nil,
  53. nil,
  54. nil,
  55. grokOAuth,
  56. nil,
  57. nil,
  58. nil,
  59. nil,
  60. nil,
  61. nil,
  62. nil,
  63. nil,
  64. )
  65. account := &service.Account{
  66. ID: 4227,
  67. Platform: service.PlatformGrok,
  68. Type: service.AccountTypeOAuth,
  69. Credentials: map[string]any{
  70. "access_token": "old-access",
  71. "refresh_token": "old-refresh",
  72. "base_url": "https://example.invalid/v1",
  73. "subscription_tier": "SUPER_GROK",
  74. "entitlement_status": "ACTIVE",
  75. },
  76. }
  77. updated, warning, err := handler.refreshSingleAccount(context.Background(), account)
  78. require.NoError(t, err)
  79. require.Empty(t, warning)
  80. require.Equal(t, 1, grokOAuth.calls)
  81. require.Same(t, account, grokOAuth.account)
  82. require.Equal(t, "new-access", adminSvc.updatedCredentials["access_token"])
  83. require.Equal(t, "new-refresh", adminSvc.updatedCredentials["refresh_token"])
  84. require.Equal(t, "https://example.invalid/v1", adminSvc.updatedCredentials["base_url"])
  85. require.Equal(t, "SUPER_GROK", adminSvc.updatedCredentials["subscription_tier"])
  86. require.Equal(t, "ACTIVE", adminSvc.updatedCredentials["entitlement_status"])
  87. require.Equal(t, adminSvc.updatedCredentials, updated.Credentials)
  88. }