Skip to content

Commit 5bd20a6

Browse files
committed
add few more tests
1 parent af66794 commit 5bd20a6

File tree

5 files changed

+337
-11
lines changed

5 files changed

+337
-11
lines changed

entraid_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@ package entraid
22

33
import (
44
"net"
5+
"time"
56

67
"github.com/stretchr/testify/mock"
78
)
89

10+
const testJWTtoken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ0ZXN0IGp3dCIsImlhdCI6MTc0MzUxNTAxMSwiZXhwIjoxNzc1MDUxMDExLCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJ0ZXN0QHRlc3QuY29tIiwib2lkIjoidGVzdCJ9.6RG721V2eFlSLsCRmo53kSRRrTZIe1UPdLZCUEvIarU"
11+
912
type mockIdentityProvider struct {
1013
// Mock implementation of the IdentityProvider interface
1114
// Add any necessary fields or methods for the mock identity provider here
@@ -42,3 +45,32 @@ func (m *mockError) Is(err error) bool {
4245
}
4346

4447
var _ net.Error = (*mockError)(nil)
48+
49+
type mockTokenListener struct {
50+
// Mock implementation of the TokenManagerListener interface
51+
mock.Mock
52+
}
53+
54+
var _ TokenListener = (*mockTokenListener)(nil)
55+
56+
func (m *mockTokenListener) OnTokenNext(token *Token) {
57+
_ = m.Called(token)
58+
}
59+
60+
func (m *mockTokenListener) OnTokenError(err error) {
61+
_ = m.Called(err)
62+
}
63+
64+
func mockTokenParserFunc(idpResponse IdentityProviderResponse) (*Token, error) {
65+
if idpResponse != nil && idpResponse.Type() == ResponseTypeRawToken {
66+
return NewToken(
67+
"test",
68+
"password",
69+
"test",
70+
time.Now().Add(time.Hour),
71+
time.Now(),
72+
int64(time.Hour),
73+
), nil
74+
}
75+
return nil, nil
76+
}

errors.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,11 @@ package entraid
22

33
import "fmt"
44

5-
var ErrNotImplemented = fmt.Errorf("credentials provider not implemented")
5+
// ErrTokenManagerNotStarted is returned when the token manager is not started.
6+
var ErrTokenManagerNotStarted = fmt.Errorf("token manager not started")
7+
8+
// ErrTokenManagerAlreadyCanceled is returned when the token manager is already canceled.
9+
var ErrTokenManagerAlreadyCanceled = fmt.Errorf("token manager already canceled")
10+
11+
// ErrTokenManagerAlreadyStarted is returned when the token manager is already started.
12+
var ErrTokenManagerAlreadyStarted = fmt.Errorf("token manager already started")

identity_provider.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,12 @@ func (a *authResult) RawToken() string {
6363

6464
// NewIDPResponse creates a new auth result based on the type provided.
6565
// It returns an IdentityProviderResponse interface.
66-
func NewIDPResponse(t string, result interface{}) (IdentityProviderResponse, error) {
67-
r := &authResult{resultType: t}
66+
// Type can be either AuthResult, AccessToken, or RawToken.
67+
// Second argument is the result of the type provided in the first argument.
68+
func NewIDPResponse(responseType string, result interface{}) (IdentityProviderResponse, error) {
69+
r := &authResult{resultType: responseType}
6870

69-
switch t {
71+
switch responseType {
7072
case ResponseTypeAuthResult:
7173
if typed, ok := result.(*public.AuthResult); !ok {
7274
return nil, fmt.Errorf("expected AuthResult, got %T", result)
@@ -86,7 +88,7 @@ func NewIDPResponse(t string, result interface{}) (IdentityProviderResponse, err
8688
r.rawToken = typed
8789
}
8890
default:
89-
return nil, fmt.Errorf("unknown idp response type: %s", t)
91+
return nil, fmt.Errorf("unknown idp response type: %s", responseType)
9092
}
9193

9294
return r, nil

token_manager.go

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -111,10 +111,11 @@ var defaultIdentityProviderResponseParser IdentityProviderResponseParserFunc = f
111111

112112
claims := struct {
113113
jwt.RegisteredClaims
114-
Oid string `json:"oid"`
114+
Oid string `json:"oid,omitempty"`
115115
}{}
116116

117-
_, err := jwt.ParseWithClaims(token, claims, nil)
117+
// jwt token should be verified from the identity provider
118+
_, _, err := jwt.NewParser().ParseUnverified(token, &claims)
118119
if err != nil {
119120
return nil, fmt.Errorf("failed to parse jwt token: %w", err)
120121
}
@@ -282,13 +283,14 @@ func (e *entraidTokenManager) Start(listener TokenListener) (cancelFunc, error)
282283
e.lock.Lock()
283284
defer e.lock.Unlock()
284285
if e.listener != nil {
285-
return nil, fmt.Errorf("token manager already started")
286+
return nil, ErrTokenManagerAlreadyStarted
286287
}
287288
e.listener = listener
288289
e.closed = make(chan struct{})
289290

290291
token, err := e.GetToken()
291292
if err != nil {
293+
go listener.OnTokenError(err)
292294
return nil, fmt.Errorf("failed to start token manager: %w", err)
293295
}
294296

@@ -350,20 +352,25 @@ func (e *entraidTokenManager) Start(listener TokenListener) (cancelFunc, error)
350352
return e.Close, nil
351353
}
352354

353-
func (e *entraidTokenManager) Close() error {
355+
func (e *entraidTokenManager) Close() (err error) {
354356
defer func() {
355357
if r := recover(); r != nil {
356-
// handle panic
357358
log.Printf("Recovered from panic: %v", r)
359+
err = ErrTokenManagerAlreadyCanceled
358360
}
359361
}()
360362
e.lock.Lock()
361363
defer e.lock.Unlock()
364+
365+
if e.closed == nil || e.listener == nil {
366+
err = ErrTokenManagerNotStarted
367+
return
368+
}
362369
if e.listener != nil {
363370
e.listener = nil
364371
}
365372
close(e.closed)
366-
return nil
373+
return
367374
}
368375

369376
// defaultRetryableFunc is a function that checks if the error is retryable.

0 commit comments

Comments
 (0)