diff --git a/pkg/op/discovery_test.go b/pkg/op/discovery_test.go index 4d97a01..1f0663d 100644 --- a/pkg/op/discovery_test.go +++ b/pkg/op/discovery_test.go @@ -37,7 +37,10 @@ func TestDiscover(t *testing.T) { op.Discover(tt.args.w, tt.args.config) rec := tt.args.w.(*httptest.ResponseRecorder) require.Equal(t, http.StatusOK, rec.Code) - require.Equal(t, `{"issuer":"https://issuer.com","request_uri_parameter_supported":false}`, rec.Body.String()) + require.Equal(t, + `{"issuer":"https://issuer.com","request_uri_parameter_supported":false} +`, + rec.Body.String()) }) } } diff --git a/pkg/op/keys_test.go b/pkg/op/keys_test.go new file mode 100644 index 0000000..b02fbff --- /dev/null +++ b/pkg/op/keys_test.go @@ -0,0 +1,99 @@ +package op_test + +import ( + "crypto/rsa" + "math/big" + "net/http" + "net/http/httptest" + "testing" + + "github.com/caos/oidc/pkg/oidc" + "github.com/caos/oidc/pkg/op" + "github.com/caos/oidc/pkg/op/mock" + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/assert" + "gopkg.in/square/go-jose.v2" +) + +func TestKeys(t *testing.T) { + type args struct { + k op.KeyProvider + } + type res struct { + statusCode int + contentType string + body string + } + tests := []struct { + name string + args args + res res + }{ + { + name: "error", + args: args{ + k: func() op.KeyProvider { + m := mock.NewMockKeyProvider(gomock.NewController(t)) + m.EXPECT().GetKeySet(gomock.Any()).Return(nil, oidc.ErrServerError) + return m + }(), + }, + res: res{ + statusCode: http.StatusInternalServerError, + contentType: "application/json", + body: `{"error":"server_error"} +`, + }, + }, + //{ + // name: "empty list", + // args: args{ + // k: func() op.KeyProvider { + // m := mock.NewMockKeyProvider(gomock.NewController(t)) + // m.EXPECT().GetKeySet(gomock.Any()).Return(nil, nil) + // return m + // }(), + // }, + // res: res{ + // statusCode: http.StatusInternalServerError, + // contentType: "application/json", + // }, + //}, + { + name: "list", + args: args{ + k: func() op.KeyProvider { + m := mock.NewMockKeyProvider(gomock.NewController(t)) + m.EXPECT().GetKeySet(gomock.Any()).Return( + &jose.JSONWebKeySet{Keys: []jose.JSONWebKey{ + { + Key: &rsa.PublicKey{ + N: big.NewInt(1), + E: 1, + }, + KeyID: "id", + }, + }}, + nil, + ) + return m + }(), + }, + res: res{ + statusCode: http.StatusOK, + contentType: "application/json", + body: `{"keys":[{"kty":"RSA","kid":"id","n":"AQ","e":"AQ"}]} +`, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + w := httptest.NewRecorder() + op.Keys(w, httptest.NewRequest("GET", "/keys", nil), tt.args.k) + assert.Equal(t, tt.res.statusCode, w.Result().StatusCode) + assert.Equal(t, tt.res.contentType, w.Header().Get("content-type")) + assert.Equal(t, tt.res.body, w.Body.String()) + }) + } +} diff --git a/pkg/op/mock/generate.go b/pkg/op/mock/generate.go index beb3132..4dd020e 100644 --- a/pkg/op/mock/generate.go +++ b/pkg/op/mock/generate.go @@ -5,3 +5,4 @@ package mock //go:generate mockgen -package mock -destination ./client.mock.go github.com/caos/oidc/pkg/op Client //go:generate mockgen -package mock -destination ./configuration.mock.go github.com/caos/oidc/pkg/op Configuration //go:generate mockgen -package mock -destination ./signer.mock.go github.com/caos/oidc/pkg/op Signer +//go:generate mockgen -package mock -destination ./key.mock.go github.com/caos/oidc/pkg/op KeyProvider diff --git a/pkg/op/mock/key.mock.go b/pkg/op/mock/key.mock.go new file mode 100644 index 0000000..37e0677 --- /dev/null +++ b/pkg/op/mock/key.mock.go @@ -0,0 +1,51 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/caos/oidc/pkg/op (interfaces: KeyProvider) + +// Package mock is a generated GoMock package. +package mock + +import ( + context "context" + reflect "reflect" + + gomock "github.com/golang/mock/gomock" + jose "gopkg.in/square/go-jose.v2" +) + +// MockKeyProvider is a mock of KeyProvider interface. +type MockKeyProvider struct { + ctrl *gomock.Controller + recorder *MockKeyProviderMockRecorder +} + +// MockKeyProviderMockRecorder is the mock recorder for MockKeyProvider. +type MockKeyProviderMockRecorder struct { + mock *MockKeyProvider +} + +// NewMockKeyProvider creates a new mock instance. +func NewMockKeyProvider(ctrl *gomock.Controller) *MockKeyProvider { + mock := &MockKeyProvider{ctrl: ctrl} + mock.recorder = &MockKeyProviderMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockKeyProvider) EXPECT() *MockKeyProviderMockRecorder { + return m.recorder +} + +// GetKeySet mocks base method. +func (m *MockKeyProvider) GetKeySet(arg0 context.Context) (*jose.JSONWebKeySet, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetKeySet", arg0) + ret0, _ := ret[0].(*jose.JSONWebKeySet) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetKeySet indicates an expected call of GetKeySet. +func (mr *MockKeyProviderMockRecorder) GetKeySet(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetKeySet", reflect.TypeOf((*MockKeyProvider)(nil).GetKeySet), arg0) +} diff --git a/pkg/op/op.go b/pkg/op/op.go index 772b5f7..e10a088 100644 --- a/pkg/op/op.go +++ b/pkg/op/op.go @@ -148,7 +148,6 @@ type openidProvider struct { decoder *schema.Decoder encoder *schema.Encoder interceptors []HttpInterceptor - retry func(int) (bool, int) timer <-chan time.Time }