mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-11-11 14:32:36 +00:00
69 lines
2.0 KiB
Go
69 lines
2.0 KiB
Go
//go:build unit
|
|
|
|
package service
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/Wei-Shaw/sub2api/internal/pkg/xai"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
type grokOAuthClientStub struct {
|
|
refreshResponse *xai.TokenResponse
|
|
exchangeCalls int
|
|
}
|
|
|
|
func (s *grokOAuthClientStub) ExchangeCode(context.Context, string, string, string, string, string) (*xai.TokenResponse, error) {
|
|
s.exchangeCalls++
|
|
return &xai.TokenResponse{}, nil
|
|
}
|
|
|
|
func (s *grokOAuthClientStub) RefreshToken(context.Context, string, string, string) (*xai.TokenResponse, error) {
|
|
return s.refreshResponse, nil
|
|
}
|
|
|
|
func TestGrokOAuthServiceRefreshTokenPreservesOriginalRefreshTokenWhenNotRotated(t *testing.T) {
|
|
svc := NewGrokOAuthService(nil, &grokOAuthClientStub{
|
|
refreshResponse: &xai.TokenResponse{
|
|
AccessToken: "new-access-token",
|
|
TokenType: "Bearer",
|
|
ExpiresIn: 3600,
|
|
},
|
|
})
|
|
defer svc.Stop()
|
|
|
|
info, err := svc.RefreshToken(context.Background(), "original-refresh-token", "", "client-id")
|
|
require.NoError(t, err)
|
|
require.Equal(t, "new-access-token", info.AccessToken)
|
|
require.Equal(t, "original-refresh-token", info.RefreshToken)
|
|
require.Equal(t, "client-id", info.ClientID)
|
|
}
|
|
|
|
func TestGrokOAuthServiceExchangeCodeRequiresStateForCallbackURLAndConsumesSession(t *testing.T) {
|
|
client := &grokOAuthClientStub{}
|
|
svc := NewGrokOAuthService(nil, client)
|
|
defer svc.Stop()
|
|
|
|
auth, err := svc.GenerateAuthURL(context.Background(), nil, "")
|
|
require.NoError(t, err)
|
|
|
|
_, err = svc.ExchangeCode(context.Background(), &GrokExchangeCodeInput{
|
|
SessionID: auth.SessionID,
|
|
Code: "http://127.0.0.1:56121/callback?code=code-without-state",
|
|
})
|
|
require.Error(t, err)
|
|
require.Contains(t, err.Error(), "GROK_OAUTH_STATE_REQUIRED")
|
|
require.Zero(t, client.exchangeCalls)
|
|
|
|
_, err = svc.ExchangeCode(context.Background(), &GrokExchangeCodeInput{
|
|
SessionID: auth.SessionID,
|
|
Code: "code-with-state",
|
|
State: auth.State,
|
|
})
|
|
require.Error(t, err)
|
|
require.Contains(t, err.Error(), "GROK_OAUTH_SESSION_NOT_FOUND")
|
|
require.Zero(t, client.exchangeCalls)
|
|
}
|