2022-12-08 13:05:19 -03:00

175 lines
6.6 KiB
Go

// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
// Licensed under the GNU Affero General Public License (AGPL).
// See License.AGPL.txt in the project root for license information.
package apiv1
import (
"context"
"net/http"
"net/http/httptest"
"testing"
connect "github.com/bufbuild/connect-go"
"github.com/gitpod-io/gitpod/common-go/experiments"
"github.com/gitpod-io/gitpod/common-go/experiments/experimentstest"
v1 "github.com/gitpod-io/gitpod/components/public-api/go/experimental/v1"
"github.com/gitpod-io/gitpod/components/public-api/go/experimental/v1/v1connect"
protocol "github.com/gitpod-io/gitpod/gitpod-protocol"
"github.com/gitpod-io/gitpod/public-api-server/pkg/auth"
"github.com/golang/mock/gomock"
"github.com/stretchr/testify/require"
)
var (
withOIDCFeatureDisabled = &experimentstest.Client{
BoolMatcher: func(ctx context.Context, experiment string, defaultValue bool, attributes experiments.Attributes) bool {
return false
},
}
withOIDCFeatureEnabled = &experimentstest.Client{
BoolMatcher: func(ctx context.Context, experiment string, defaultValue bool, attributes experiments.Attributes) bool {
return experiment == experiments.OIDCServiceEnabledFlag
},
}
user = newUser(&protocol.User{})
)
func TestOIDCService_CreateClientConfig(t *testing.T) {
t.Run("feature flag disabled returns unathorized", func(t *testing.T) {
serverMock, client := setupOIDCService(t, withOIDCFeatureDisabled)
serverMock.EXPECT().GetLoggedInUser(gomock.Any()).Return(user, nil)
serverMock.EXPECT().GetTeams(gomock.Any()).Return(teams, nil)
_, err := client.CreateClientConfig(context.Background(), connect.NewRequest(&v1.CreateClientConfigRequest{}))
require.Error(t, err)
require.Equal(t, connect.CodePermissionDenied, connect.CodeOf(err))
})
t.Run("feature flag enabled returns unimplemented", func(t *testing.T) {
serverMock, client := setupOIDCService(t, withOIDCFeatureEnabled)
serverMock.EXPECT().GetLoggedInUser(gomock.Any()).Return(user, nil)
_, err := client.CreateClientConfig(context.Background(), connect.NewRequest(&v1.CreateClientConfigRequest{}))
require.Error(t, err)
require.Equal(t, connect.CodeUnimplemented, connect.CodeOf(err))
})
}
func TestOIDCService_GetClientConfig(t *testing.T) {
t.Run("feature flag disabled returns unathorized", func(t *testing.T) {
serverMock, client := setupOIDCService(t, withOIDCFeatureDisabled)
serverMock.EXPECT().GetLoggedInUser(gomock.Any()).Return(user, nil)
serverMock.EXPECT().GetTeams(gomock.Any()).Return(teams, nil)
_, err := client.GetClientConfig(context.Background(), connect.NewRequest(&v1.GetClientConfigRequest{}))
require.Error(t, err)
require.Equal(t, connect.CodePermissionDenied, connect.CodeOf(err))
})
t.Run("feature flag enabled returns unimplemented", func(t *testing.T) {
serverMock, client := setupOIDCService(t, withOIDCFeatureEnabled)
serverMock.EXPECT().GetLoggedInUser(gomock.Any()).Return(user, nil)
_, err := client.GetClientConfig(context.Background(), connect.NewRequest(&v1.GetClientConfigRequest{}))
require.Error(t, err)
require.Equal(t, connect.CodeUnimplemented, connect.CodeOf(err))
})
}
func TestOIDCService_ListClientConfigs(t *testing.T) {
t.Run("feature flag disabled returns unathorized", func(t *testing.T) {
serverMock, client := setupOIDCService(t, withOIDCFeatureDisabled)
serverMock.EXPECT().GetLoggedInUser(gomock.Any()).Return(user, nil)
serverMock.EXPECT().GetTeams(gomock.Any()).Return(teams, nil)
_, err := client.ListClientConfigs(context.Background(), connect.NewRequest(&v1.ListClientConfigsRequest{}))
require.Error(t, err)
require.Equal(t, connect.CodePermissionDenied, connect.CodeOf(err))
})
t.Run("feature flag enabled returns unimplemented", func(t *testing.T) {
serverMock, client := setupOIDCService(t, withOIDCFeatureEnabled)
serverMock.EXPECT().GetLoggedInUser(gomock.Any()).Return(user, nil)
_, err := client.ListClientConfigs(context.Background(), connect.NewRequest(&v1.ListClientConfigsRequest{}))
require.Error(t, err)
require.Equal(t, connect.CodeUnimplemented, connect.CodeOf(err))
})
}
func TestOIDCService_UpdateClientConfig(t *testing.T) {
t.Run("feature flag disabled returns unathorized", func(t *testing.T) {
serverMock, client := setupOIDCService(t, withOIDCFeatureDisabled)
serverMock.EXPECT().GetLoggedInUser(gomock.Any()).Return(user, nil)
serverMock.EXPECT().GetTeams(gomock.Any()).Return(teams, nil)
_, err := client.UpdateClientConfig(context.Background(), connect.NewRequest(&v1.UpdateClientConfigRequest{}))
require.Error(t, err)
require.Equal(t, connect.CodePermissionDenied, connect.CodeOf(err))
})
t.Run("feature flag enabled returns unimplemented", func(t *testing.T) {
serverMock, client := setupOIDCService(t, withOIDCFeatureEnabled)
serverMock.EXPECT().GetLoggedInUser(gomock.Any()).Return(user, nil)
_, err := client.UpdateClientConfig(context.Background(), connect.NewRequest(&v1.UpdateClientConfigRequest{}))
require.Error(t, err)
require.Equal(t, connect.CodeUnimplemented, connect.CodeOf(err))
})
}
func TestOIDCService_DeleteClientConfig(t *testing.T) {
t.Run("feature flag disabled returns unathorized", func(t *testing.T) {
serverMock, client := setupOIDCService(t, withOIDCFeatureDisabled)
serverMock.EXPECT().GetLoggedInUser(gomock.Any()).Return(user, nil)
serverMock.EXPECT().GetTeams(gomock.Any()).Return(teams, nil)
_, err := client.DeleteClientConfig(context.Background(), connect.NewRequest(&v1.DeleteClientConfigRequest{}))
require.Error(t, err)
require.Equal(t, connect.CodePermissionDenied, connect.CodeOf(err))
})
t.Run("feature flag enabled returns unimplemented", func(t *testing.T) {
serverMock, client := setupOIDCService(t, withOIDCFeatureEnabled)
serverMock.EXPECT().GetLoggedInUser(gomock.Any()).Return(user, nil)
_, err := client.DeleteClientConfig(context.Background(), connect.NewRequest(&v1.DeleteClientConfigRequest{}))
require.Error(t, err)
require.Equal(t, connect.CodeUnimplemented, connect.CodeOf(err))
})
}
func setupOIDCService(t *testing.T, expClient experiments.Client) (*protocol.MockAPIInterface, v1connect.OIDCServiceClient) {
t.Helper()
ctrl := gomock.NewController(t)
t.Cleanup(ctrl.Finish)
serverMock := protocol.NewMockAPIInterface(ctrl)
svc := NewOIDCService(&FakeServerConnPool{api: serverMock}, expClient)
_, handler := v1connect.NewOIDCServiceHandler(svc, connect.WithInterceptors(auth.NewServerInterceptor()))
srv := httptest.NewServer(handler)
t.Cleanup(srv.Close)
client := v1connect.NewOIDCServiceClient(http.DefaultClient, srv.URL, connect.WithInterceptors(
auth.NewClientInterceptor("auth-token"),
))
return serverMock, client
}