Skip to content

Commit 3a9e9bf

Browse files
easyCZroboquat
authored andcommitted
[public-api] Add Tokens RPC stubs
1 parent ca3f94d commit 3a9e9bf

File tree

2 files changed

+246
-0
lines changed

2 files changed

+246
-0
lines changed

components/public-api-server/pkg/apiv1/tokens.go

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,80 @@ func (s *TokensService) GetPersonalAccessToken(ctx context.Context, req *connect
7070
return nil, connect.NewError(connect.CodeUnimplemented, errors.New("gitpod.experimental.v1.TokensService.GetPersonalAccessToken is not implemented"))
7171
}
7272

73+
func (s *TokensService) ListPersonalAccessTokens(ctx context.Context, req *connect.Request[v1.ListPersonalAccessTokensRequest]) (*connect.Response[v1.ListPersonalAccessTokensResponse], error) {
74+
conn, err := getConnection(ctx, s.connectionPool)
75+
if err != nil {
76+
return nil, err
77+
}
78+
79+
_, err = s.getUser(ctx, conn)
80+
if err != nil {
81+
return nil, err
82+
}
83+
84+
return nil, connect.NewError(connect.CodeUnimplemented, errors.New("gitpod.experimental.v1.TokensService.ListPersonalAccessTokens is not implemented"))
85+
}
86+
87+
func (s *TokensService) RegeneratePersonalAccessToken(ctx context.Context, req *connect.Request[v1.RegeneratePersonalAccessTokenRequest]) (*connect.Response[v1.RegeneratePersonalAccessTokenResponse], error) {
88+
tokenID, err := validateTokenID(req.Msg.GetId())
89+
if err != nil {
90+
return nil, err
91+
}
92+
93+
conn, err := getConnection(ctx, s.connectionPool)
94+
if err != nil {
95+
return nil, err
96+
}
97+
98+
_, err = s.getUser(ctx, conn)
99+
if err != nil {
100+
return nil, err
101+
}
102+
103+
log.Infof("Handling RegeneratePersonalAccessToken request for Token ID '%s'", tokenID.String())
104+
return nil, connect.NewError(connect.CodeUnimplemented, errors.New("gitpod.experimental.v1.TokensService.RegeneratePersonalAccessToken is not implemented"))
105+
}
106+
107+
func (s *TokensService) UpdatePersonalAccessToken(ctx context.Context, req *connect.Request[v1.UpdatePersonalAccessTokenRequest]) (*connect.Response[v1.UpdatePersonalAccessTokenResponse], error) {
108+
tokenID, err := validateTokenID(req.Msg.GetToken().GetId())
109+
if err != nil {
110+
return nil, err
111+
}
112+
113+
conn, err := getConnection(ctx, s.connectionPool)
114+
if err != nil {
115+
return nil, err
116+
}
117+
118+
_, err = s.getUser(ctx, conn)
119+
if err != nil {
120+
return nil, err
121+
}
122+
123+
log.Infof("Handling UpdatePersonalAccessToken request for Token ID '%s'", tokenID.String())
124+
return nil, connect.NewError(connect.CodeUnimplemented, errors.New("gitpod.experimental.v1.TokensService.UpdatePersonalAccessToken is not implemented"))
125+
}
126+
127+
func (s *TokensService) DeletePersonalAccessToken(ctx context.Context, req *connect.Request[v1.DeletePersonalAccessTokenRequest]) (*connect.Response[v1.DeletePersonalAccessTokenResponse], error) {
128+
tokenID, err := validateTokenID(req.Msg.GetId())
129+
if err != nil {
130+
return nil, err
131+
}
132+
133+
conn, err := getConnection(ctx, s.connectionPool)
134+
if err != nil {
135+
return nil, err
136+
}
137+
138+
_, err = s.getUser(ctx, conn)
139+
if err != nil {
140+
return nil, err
141+
}
142+
143+
log.Infof("Handling DeletePersonalAccessToken request for Token ID '%s'", tokenID.String())
144+
return nil, connect.NewError(connect.CodeUnimplemented, errors.New("gitpod.experimental.v1.TokensService.DeletePersonalAccessToken is not implemented"))
145+
}
146+
73147
func (s *TokensService) getUser(ctx context.Context, conn protocol.APIInterface) (*protocol.User, error) {
74148
user, err := conn.GetLoggedInUser(ctx)
75149
if err != nil {

components/public-api-server/pkg/apiv1/tokens_test.go

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,178 @@ func TestTokensService_GetPersonalAccessToken(t *testing.T) {
106106
})
107107
}
108108

109+
func TestTokensService_ListPersonalAccessTokens(t *testing.T) {
110+
user := newUser(&protocol.User{})
111+
112+
t.Run("permission denied when feature flag is disabled", func(t *testing.T) {
113+
serverMock, client := setupTokensService(t, withTokenFeatureDisabled)
114+
115+
serverMock.EXPECT().GetLoggedInUser(gomock.Any()).Return(user, nil)
116+
117+
_, err := client.ListPersonalAccessTokens(context.Background(), connect.NewRequest(&v1.ListPersonalAccessTokensRequest{}))
118+
119+
require.Error(t, err, "This feature is currently in beta. If you would like to be part of the beta, please contact us.")
120+
require.Equal(t, connect.CodePermissionDenied, connect.CodeOf(err))
121+
})
122+
123+
t.Run("unimplemented when feature flag enabled", func(t *testing.T) {
124+
serverMock, client := setupTokensService(t, withTokenFeatureEnabled)
125+
126+
serverMock.EXPECT().GetLoggedInUser(gomock.Any()).Return(user, nil)
127+
128+
_, err := client.ListPersonalAccessTokens(context.Background(), connect.NewRequest(&v1.ListPersonalAccessTokensRequest{}))
129+
130+
require.Equal(t, connect.CodeUnimplemented, connect.CodeOf(err))
131+
})
132+
}
133+
134+
func TestTokensService_RegeneratePersonalAccessToken(t *testing.T) {
135+
user := newUser(&protocol.User{})
136+
137+
t.Run("permission denied when feature flag is disabled", func(t *testing.T) {
138+
serverMock, client := setupTokensService(t, withTokenFeatureDisabled)
139+
140+
serverMock.EXPECT().GetLoggedInUser(gomock.Any()).Return(user, nil)
141+
142+
_, err := client.RegeneratePersonalAccessToken(context.Background(), connect.NewRequest(&v1.RegeneratePersonalAccessTokenRequest{
143+
Id: uuid.New().String(),
144+
}))
145+
146+
require.Error(t, err, "This feature is currently in beta. If you would like to be part of the beta, please contact us.")
147+
require.Equal(t, connect.CodePermissionDenied, connect.CodeOf(err))
148+
})
149+
150+
t.Run("invalid argument when Token ID is empty", func(t *testing.T) {
151+
_, client := setupTokensService(t, withTokenFeatureEnabled)
152+
153+
_, err := client.RegeneratePersonalAccessToken(context.Background(), connect.NewRequest(&v1.RegeneratePersonalAccessTokenRequest{}))
154+
155+
require.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err))
156+
})
157+
158+
t.Run("invalid argument when Token ID is not a valid UUID", func(t *testing.T) {
159+
_, client := setupTokensService(t, withTokenFeatureEnabled)
160+
161+
_, err := client.RegeneratePersonalAccessToken(context.Background(), connect.NewRequest(&v1.RegeneratePersonalAccessTokenRequest{
162+
Id: "foo-bar",
163+
}))
164+
165+
require.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err))
166+
})
167+
168+
t.Run("unimplemented when feature flag enabled", func(t *testing.T) {
169+
serverMock, client := setupTokensService(t, withTokenFeatureEnabled)
170+
171+
serverMock.EXPECT().GetLoggedInUser(gomock.Any()).Return(user, nil)
172+
173+
_, err := client.RegeneratePersonalAccessToken(context.Background(), connect.NewRequest(&v1.RegeneratePersonalAccessTokenRequest{
174+
Id: uuid.New().String(),
175+
}))
176+
177+
require.Equal(t, connect.CodeUnimplemented, connect.CodeOf(err))
178+
})
179+
}
180+
181+
func TestTokensService_UpdatePersonalAccessToken(t *testing.T) {
182+
user := newUser(&protocol.User{})
183+
184+
t.Run("permission denied when feature flag is disabled", func(t *testing.T) {
185+
serverMock, client := setupTokensService(t, withTokenFeatureDisabled)
186+
187+
serverMock.EXPECT().GetLoggedInUser(gomock.Any()).Return(user, nil)
188+
189+
_, err := client.UpdatePersonalAccessToken(context.Background(), connect.NewRequest(&v1.UpdatePersonalAccessTokenRequest{
190+
Token: &v1.PersonalAccessToken{
191+
Id: uuid.New().String(),
192+
},
193+
}))
194+
195+
require.Error(t, err, "This feature is currently in beta. If you would like to be part of the beta, please contact us.")
196+
require.Equal(t, connect.CodePermissionDenied, connect.CodeOf(err))
197+
})
198+
199+
t.Run("invalid argument when Token ID is empty", func(t *testing.T) {
200+
_, client := setupTokensService(t, withTokenFeatureEnabled)
201+
202+
_, err := client.UpdatePersonalAccessToken(context.Background(), connect.NewRequest(&v1.UpdatePersonalAccessTokenRequest{}))
203+
204+
require.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err))
205+
})
206+
207+
t.Run("invalid argument when Token ID is not a valid UUID", func(t *testing.T) {
208+
_, client := setupTokensService(t, withTokenFeatureEnabled)
209+
210+
_, err := client.UpdatePersonalAccessToken(context.Background(), connect.NewRequest(&v1.UpdatePersonalAccessTokenRequest{
211+
Token: &v1.PersonalAccessToken{
212+
Id: "foo-bar",
213+
},
214+
}))
215+
216+
require.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err))
217+
})
218+
219+
t.Run("unimplemented when feature flag enabled", func(t *testing.T) {
220+
serverMock, client := setupTokensService(t, withTokenFeatureEnabled)
221+
222+
serverMock.EXPECT().GetLoggedInUser(gomock.Any()).Return(user, nil)
223+
224+
_, err := client.UpdatePersonalAccessToken(context.Background(), connect.NewRequest(&v1.UpdatePersonalAccessTokenRequest{
225+
Token: &v1.PersonalAccessToken{
226+
Id: uuid.New().String(),
227+
},
228+
}))
229+
230+
require.Equal(t, connect.CodeUnimplemented, connect.CodeOf(err))
231+
})
232+
}
233+
234+
func TestTokensService_DeletePersonalAccessToken(t *testing.T) {
235+
user := newUser(&protocol.User{})
236+
237+
t.Run("permission denied when feature flag is disabled", func(t *testing.T) {
238+
serverMock, client := setupTokensService(t, withTokenFeatureDisabled)
239+
240+
serverMock.EXPECT().GetLoggedInUser(gomock.Any()).Return(user, nil)
241+
242+
_, err := client.DeletePersonalAccessToken(context.Background(), connect.NewRequest(&v1.DeletePersonalAccessTokenRequest{
243+
Id: uuid.New().String(),
244+
}))
245+
246+
require.Error(t, err, "This feature is currently in beta. If you would like to be part of the beta, please contact us.")
247+
require.Equal(t, connect.CodePermissionDenied, connect.CodeOf(err))
248+
})
249+
250+
t.Run("invalid argument when Token ID is empty", func(t *testing.T) {
251+
_, client := setupTokensService(t, withTokenFeatureEnabled)
252+
253+
_, err := client.DeletePersonalAccessToken(context.Background(), connect.NewRequest(&v1.DeletePersonalAccessTokenRequest{}))
254+
255+
require.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err))
256+
})
257+
258+
t.Run("invalid argument when Token ID is not a valid UUID", func(t *testing.T) {
259+
_, client := setupTokensService(t, withTokenFeatureEnabled)
260+
261+
_, err := client.DeletePersonalAccessToken(context.Background(), connect.NewRequest(&v1.DeletePersonalAccessTokenRequest{
262+
Id: "foo-bar",
263+
}))
264+
265+
require.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err))
266+
})
267+
268+
t.Run("unimplemented when feature flag enabled", func(t *testing.T) {
269+
serverMock, client := setupTokensService(t, withTokenFeatureEnabled)
270+
271+
serverMock.EXPECT().GetLoggedInUser(gomock.Any()).Return(user, nil)
272+
273+
_, err := client.DeletePersonalAccessToken(context.Background(), connect.NewRequest(&v1.DeletePersonalAccessTokenRequest{
274+
Id: uuid.New().String(),
275+
}))
276+
277+
require.Equal(t, connect.CodeUnimplemented, connect.CodeOf(err))
278+
})
279+
}
280+
109281
func setupTokensService(t *testing.T, expClient experiments.Client) (*protocol.MockAPIInterface, v1connect.TokensServiceClient) {
110282
t.Helper()
111283

0 commit comments

Comments
 (0)