1
21
22 package oauth2
23
24 import (
25 "fmt"
26 "net/http"
27 "testing"
28
29 "github.com/ory/x/errorsx"
30
31 "github.com/golang/mock/gomock"
32 "github.com/pkg/errors"
33 "github.com/stretchr/testify/assert"
34 "github.com/stretchr/testify/require"
35
36 "github.com/ory/fosite"
37 "github.com/ory/fosite/internal"
38 )
39
40 func TestIntrospectToken(t *testing.T) {
41 ctrl := gomock.NewController(t)
42 store := internal.NewMockCoreStorage(ctrl)
43 chgen := internal.NewMockCoreStrategy(ctrl)
44 areq := fosite.NewAccessRequest(nil)
45 defer ctrl.Finish()
46
47 v := &CoreValidator{
48 CoreStrategy: chgen,
49 CoreStorage: store,
50 }
51 httpreq := &http.Request{Header: http.Header{}}
52
53 for k, c := range []struct {
54 description string
55 setup func()
56 expectErr error
57 expectTU fosite.TokenUse
58 }{
59 {
60 description: "should fail because no bearer token set",
61 setup: func() {
62 httpreq.Header.Set("Authorization", "bearer")
63 chgen.EXPECT().AccessTokenSignature("").Return("")
64 store.EXPECT().GetAccessTokenSession(nil, "", nil).Return(nil, errors.New(""))
65 chgen.EXPECT().RefreshTokenSignature("").Return("")
66 store.EXPECT().GetRefreshTokenSession(nil, "", nil).Return(nil, errors.New(""))
67 },
68 expectErr: fosite.ErrRequestUnauthorized,
69 },
70 {
71 description: "should fail because retrieval fails",
72 setup: func() {
73 httpreq.Header.Set("Authorization", "bearer 1234")
74 chgen.EXPECT().AccessTokenSignature("1234").AnyTimes().Return("asdf")
75 store.EXPECT().GetAccessTokenSession(nil, "asdf", nil).Return(nil, errors.New(""))
76 chgen.EXPECT().RefreshTokenSignature("1234").Return("asdf")
77 store.EXPECT().GetRefreshTokenSession(nil, "asdf", nil).Return(nil, errors.New(""))
78 },
79 expectErr: fosite.ErrRequestUnauthorized,
80 },
81 {
82 description: "should fail because validation fails",
83 setup: func() {
84 store.EXPECT().GetAccessTokenSession(nil, "asdf", nil).AnyTimes().Return(areq, nil)
85 chgen.EXPECT().ValidateAccessToken(nil, areq, "1234").Return(errorsx.WithStack(fosite.ErrTokenExpired))
86 chgen.EXPECT().RefreshTokenSignature("1234").Return("asdf")
87 store.EXPECT().GetRefreshTokenSession(nil, "asdf", nil).Return(nil, errors.New(""))
88 },
89 expectErr: fosite.ErrTokenExpired,
90 },
91 {
92 description: "should fail because access token invalid",
93 setup: func() {
94 v.DisableRefreshTokenValidation = true
95 chgen.EXPECT().ValidateAccessToken(nil, areq, "1234").Return(errorsx.WithStack(fosite.ErrInvalidTokenFormat))
96 },
97 expectErr: fosite.ErrInvalidTokenFormat,
98 },
99 {
100 description: "should pass",
101 setup: func() {
102 chgen.EXPECT().ValidateAccessToken(nil, areq, "1234").Return(nil)
103 },
104 expectTU: fosite.AccessToken,
105 },
106 } {
107 t.Run(fmt.Sprintf("case=%d", k), func(t *testing.T) {
108 c.setup()
109 tu, err := v.IntrospectToken(nil, fosite.AccessTokenFromRequest(httpreq), fosite.AccessToken, areq, []string{})
110
111 if c.expectErr != nil {
112 require.EqualError(t, err, c.expectErr.Error())
113 } else {
114 require.NoError(t, err)
115 assert.Equal(t, c.expectTU, tu)
116 }
117 })
118 }
119 }
120
View as plain text