Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/components/public-api-server/pkg/apiv1/team_test.go
2499 views
1
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
2
// Licensed under the GNU Affero General Public License (AGPL).
3
// See License.AGPL.txt in the project root for license information.
4
5
package apiv1
6
7
import (
8
"context"
9
"net/http"
10
"net/http/httptest"
11
"testing"
12
13
"github.com/bufbuild/connect-go"
14
"github.com/gitpod-io/gitpod/components/public-api/go/config"
15
v1 "github.com/gitpod-io/gitpod/components/public-api/go/experimental/v1"
16
"github.com/gitpod-io/gitpod/components/public-api/go/experimental/v1/v1connect"
17
protocol "github.com/gitpod-io/gitpod/gitpod-protocol"
18
"github.com/gitpod-io/gitpod/public-api-server/pkg/auth"
19
"github.com/gitpod-io/gitpod/public-api-server/pkg/jws"
20
"github.com/gitpod-io/gitpod/public-api-server/pkg/jws/jwstest"
21
"github.com/golang/mock/gomock"
22
"github.com/google/go-cmp/cmp"
23
"github.com/google/uuid"
24
"github.com/sourcegraph/jsonrpc2"
25
"github.com/stretchr/testify/require"
26
"google.golang.org/protobuf/testing/protocmp"
27
)
28
29
func TestTeamsService_CreateTeam(t *testing.T) {
30
31
var (
32
name = "Shiny New Team"
33
id = uuid.New().String()
34
)
35
36
t.Run("returns invalid argument when name is empty", func(t *testing.T) {
37
ctx := context.Background()
38
_, client := setupTeamService(t)
39
40
_, err := client.CreateTeam(ctx, connect.NewRequest(&v1.CreateTeamRequest{Name: ""}))
41
require.Error(t, err)
42
require.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err))
43
})
44
45
t.Run("returns invalid request when server returns invalid request", func(t *testing.T) {
46
ctx := context.Background()
47
serverMock, client := setupTeamService(t)
48
49
serverMock.EXPECT().CreateTeam(gomock.Any(), name).Return(nil, &jsonrpc2.Error{
50
Code: 400,
51
Message: "invalid request",
52
})
53
54
_, err := client.CreateTeam(ctx, connect.NewRequest(&v1.CreateTeamRequest{Name: name}))
55
require.Error(t, err)
56
require.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err))
57
})
58
59
t.Run("returns team with members and invite", func(t *testing.T) {
60
teamMembers := []*protocol.TeamMemberInfo{
61
newTeamMember(&protocol.TeamMemberInfo{
62
FullName: "Alice Alice",
63
Role: protocol.TeamMember_Owner,
64
}),
65
newTeamMember(&protocol.TeamMemberInfo{
66
FullName: "Bob Bob",
67
Role: protocol.TeamMember_Member,
68
}),
69
}
70
inviteID := uuid.New().String()
71
invite := &protocol.TeamMembershipInvite{
72
ID: inviteID,
73
TeamID: id,
74
}
75
team := newTeam(&protocol.Team{
76
ID: id,
77
})
78
79
serverMock, client := setupTeamService(t)
80
81
serverMock.EXPECT().CreateTeam(gomock.Any(), name).Return(team, nil)
82
serverMock.EXPECT().GetTeamMembers(gomock.Any(), id).Return(teamMembers, nil)
83
serverMock.EXPECT().GetGenericInvite(gomock.Any(), id).Return(&protocol.TeamMembershipInvite{
84
ID: inviteID,
85
TeamID: id,
86
}, nil)
87
88
response, err := client.CreateTeam(context.Background(), connect.NewRequest(&v1.CreateTeamRequest{Name: name}))
89
require.NoError(t, err)
90
91
requireEqualProto(t, &v1.CreateTeamResponse{
92
Team: teamToAPIResponse(team, teamMembers, invite),
93
}, response.Msg)
94
})
95
96
t.Run("returns team with members and no invite", func(t *testing.T) {
97
teamMembers := []*protocol.TeamMemberInfo{
98
newTeamMember(&protocol.TeamMemberInfo{
99
FullName: "Alice Alice",
100
Role: protocol.TeamMember_Owner,
101
}),
102
newTeamMember(&protocol.TeamMemberInfo{
103
FullName: "Bob Bob",
104
Role: protocol.TeamMember_Member,
105
}),
106
}
107
team := newTeam(&protocol.Team{
108
ID: id,
109
})
110
111
serverMock, client := setupTeamService(t)
112
113
serverMock.EXPECT().CreateTeam(gomock.Any(), name).Return(team, nil)
114
serverMock.EXPECT().GetTeamMembers(gomock.Any(), id).Return(teamMembers, nil)
115
serverMock.EXPECT().GetGenericInvite(gomock.Any(), id).Return(nil, &jsonrpc2.Error{Code: 404, Message: "not found"})
116
117
response, err := client.CreateTeam(context.Background(), connect.NewRequest(&v1.CreateTeamRequest{Name: name}))
118
require.NoError(t, err)
119
120
requireEqualProto(t, &v1.CreateTeamResponse{
121
Team: teamToAPIResponse(team, teamMembers, nil),
122
}, response.Msg)
123
})
124
}
125
126
func TestTeamsService_ListTeams(t *testing.T) {
127
t.Run("returns teams with members and invite", func(t *testing.T) {
128
ctx := context.Background()
129
serverMock, client := setupTeamService(t)
130
131
teamMembers := []*protocol.TeamMemberInfo{
132
newTeamMember(&protocol.TeamMemberInfo{
133
FullName: "Alice Alice",
134
Role: protocol.TeamMember_Owner,
135
}),
136
newTeamMember(&protocol.TeamMemberInfo{
137
FullName: "Bob Bob",
138
Role: protocol.TeamMember_Member,
139
}),
140
}
141
teams := []*protocol.Team{
142
newTeam(&protocol.Team{
143
Name: "Team A",
144
}),
145
newTeam(&protocol.Team{
146
Name: "Team B",
147
}),
148
}
149
inviteID := uuid.New().String()
150
invite := &protocol.TeamMembershipInvite{
151
ID: inviteID,
152
TeamID: teams[1].ID,
153
}
154
155
serverMock.EXPECT().GetTeams(gomock.Any()).Return(teams, nil)
156
157
// Mocks for populating team A details
158
serverMock.EXPECT().GetTeamMembers(gomock.Any(), teams[0].ID).Return(teamMembers, nil)
159
serverMock.EXPECT().GetGenericInvite(gomock.Any(), teams[0].ID).Return(&protocol.TeamMembershipInvite{
160
ID: inviteID,
161
TeamID: teams[0].ID,
162
}, nil)
163
// Mock for populating team B details
164
serverMock.EXPECT().GetTeamMembers(gomock.Any(), teams[1].ID).Return(teamMembers, nil)
165
serverMock.EXPECT().GetGenericInvite(gomock.Any(), teams[1].ID).Return(invite, nil)
166
167
response, err := client.ListTeams(ctx, connect.NewRequest(&v1.ListTeamsRequest{}))
168
require.NoError(t, err)
169
requireEqualProto(t, &v1.ListTeamsResponse{
170
Teams: []*v1.Team{
171
teamToAPIResponse(teams[0], teamMembers, invite),
172
teamToAPIResponse(teams[1], teamMembers, invite),
173
},
174
}, response.Msg)
175
})
176
177
t.Run("returns team with members and no invite for non-owner", func(t *testing.T) {
178
ctx := context.Background()
179
serverMock, client := setupTeamService(t)
180
181
teamMembers := []*protocol.TeamMemberInfo{
182
newTeamMember(&protocol.TeamMemberInfo{
183
FullName: "Alice Alice",
184
Role: protocol.TeamMember_Owner,
185
}),
186
newTeamMember(&protocol.TeamMemberInfo{
187
FullName: "Bob Bob",
188
Role: protocol.TeamMember_Member,
189
}),
190
}
191
team := newTeam(&protocol.Team{
192
Name: "Team A",
193
})
194
serverMock.EXPECT().GetTeams(gomock.Any()).Return([]*protocol.Team{team}, nil)
195
196
// Mock for populating team details
197
serverMock.EXPECT().GetTeamMembers(gomock.Any(), team.ID).Return(teamMembers, nil)
198
serverMock.EXPECT().GetGenericInvite(gomock.Any(), team.ID).Return(nil, &jsonrpc2.Error{Code: 403, Message: "not access"})
199
200
response, err := client.ListTeams(ctx, connect.NewRequest(&v1.ListTeamsRequest{}))
201
require.NoError(t, err)
202
requireEqualProto(t, &v1.ListTeamsResponse{
203
Teams: []*v1.Team{
204
teamToAPIResponse(team, teamMembers, nil),
205
},
206
}, response.Msg)
207
})
208
}
209
210
func TestTeamService_GetTeam(t *testing.T) {
211
var (
212
teamID = uuid.New().String()
213
)
214
215
t.Run("returns invalid argument when empty ID provided", func(t *testing.T) {
216
_, client := setupTeamService(t)
217
218
_, err := client.GetTeam(context.Background(), connect.NewRequest(&v1.GetTeamRequest{
219
TeamId: "",
220
}))
221
require.Error(t, err)
222
require.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err))
223
})
224
225
t.Run("proxies request to server", func(t *testing.T) {
226
serverMock, client := setupTeamService(t)
227
228
team := newTeam(&protocol.Team{
229
ID: teamID,
230
})
231
members := []*protocol.TeamMemberInfo{newTeamMember(&protocol.TeamMemberInfo{}), newTeamMember(&protocol.TeamMemberInfo{})}
232
invite := &protocol.TeamMembershipInvite{ID: uuid.New().String()}
233
234
serverMock.EXPECT().GetTeam(gomock.Any(), teamID).Return(team, nil)
235
serverMock.EXPECT().GetTeamMembers(gomock.Any(), teamID).Return(members, nil)
236
serverMock.EXPECT().GetGenericInvite(gomock.Any(), teamID).Return(invite, nil)
237
238
retrieved, err := client.GetTeam(context.Background(), connect.NewRequest(&v1.GetTeamRequest{
239
TeamId: teamID,
240
}))
241
require.NoError(t, err)
242
requireEqualProto(t, &v1.GetTeamResponse{
243
Team: teamToAPIResponse(team, members, invite),
244
}, retrieved.Msg)
245
})
246
}
247
248
func TestTeamsService_JoinTeam(t *testing.T) {
249
250
var (
251
teamID = uuid.New().String()
252
inviteID = uuid.New().String()
253
)
254
255
t.Run("fails with invalid argument when no join ID is specified", func(t *testing.T) {
256
_, client := setupTeamService(t)
257
258
_, err := client.JoinTeam(context.Background(), connect.NewRequest(&v1.JoinTeamRequest{
259
InvitationId: "",
260
}))
261
require.Error(t, err)
262
require.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err))
263
})
264
265
t.Run("delegates joining to server, and populates team response", func(t *testing.T) {
266
serverMock, client := setupTeamService(t)
267
268
team := newTeam(&protocol.Team{ID: teamID})
269
teamMembers := []*protocol.TeamMemberInfo{newTeamMember(&protocol.TeamMemberInfo{})}
270
invite := &protocol.TeamMembershipInvite{
271
ID: uuid.New().String(),
272
}
273
274
serverMock.EXPECT().JoinTeam(gomock.Any(), inviteID).Return(team, nil)
275
serverMock.EXPECT().GetTeamMembers(gomock.Any(), teamID).Return(teamMembers, nil)
276
serverMock.EXPECT().GetGenericInvite(gomock.Any(), teamID).Return(invite, nil)
277
278
response, err := client.JoinTeam(context.Background(), connect.NewRequest(&v1.JoinTeamRequest{
279
InvitationId: inviteID,
280
}))
281
require.NoError(t, err)
282
requireEqualProto(t, &v1.JoinTeamResponse{
283
Team: teamToAPIResponse(team, teamMembers, invite),
284
}, response.Msg)
285
})
286
}
287
288
func TestTeamToAPIResponse(t *testing.T) {
289
// Here, we're deliberately not using our helpers newTeam, newTeamMembers because
290
// we want to assert from first principles
291
team := &protocol.Team{
292
ID: uuid.New().String(),
293
Name: "New Team",
294
CreationTime: "2022-09-09T09:09:09.000Z",
295
}
296
members := []*protocol.TeamMemberInfo{
297
{
298
UserId: uuid.New().String(),
299
FullName: "First Last",
300
PrimaryEmail: "[email protected]",
301
AvatarUrl: "https://avatars.com/foo",
302
Role: protocol.TeamMember_Member,
303
MemberSince: "2022-09-09T09:09:09.000Z",
304
},
305
{
306
UserId: uuid.New().String(),
307
FullName: "Second Last",
308
PrimaryEmail: "[email protected]",
309
AvatarUrl: "https://avatars.com/bar",
310
Role: protocol.TeamMember_Owner,
311
MemberSince: "2022-09-09T09:09:09.000Z",
312
},
313
}
314
invite := &protocol.TeamMembershipInvite{
315
ID: uuid.New().String(),
316
TeamID: uuid.New().String(),
317
Role: protocol.TeamMember_Member,
318
CreationTime: "2022-08-08T08:08:08.000Z",
319
InvalidationTime: "2022-11-11T11:11:11.000Z",
320
InvitedEmail: "[email protected]",
321
}
322
323
response := teamToAPIResponse(team, members, invite)
324
requireEqualProto(t, &v1.Team{
325
Id: team.ID,
326
Name: team.Name,
327
Members: []*v1.TeamMember{
328
{
329
UserId: members[0].UserId,
330
Role: teamRoleToAPIResponse(members[0].Role),
331
MemberSince: parseGitpodTimeStampOrDefault(members[0].MemberSince),
332
AvatarUrl: members[0].AvatarUrl,
333
FullName: members[0].FullName,
334
PrimaryEmail: members[0].PrimaryEmail,
335
},
336
{
337
UserId: members[1].UserId,
338
Role: teamRoleToAPIResponse(members[1].Role),
339
MemberSince: parseGitpodTimeStampOrDefault(members[1].MemberSince),
340
AvatarUrl: members[1].AvatarUrl,
341
FullName: members[1].FullName,
342
PrimaryEmail: members[1].PrimaryEmail,
343
},
344
},
345
TeamInvitation: &v1.TeamInvitation{
346
Id: invite.ID,
347
},
348
}, response)
349
}
350
351
func TestTeamsService_ListTeamMembers(t *testing.T) {
352
t.Run("missing team ID returns invalid argument", func(t *testing.T) {
353
_, client := setupTeamService(t)
354
355
_, err := client.ListTeamMembers(context.Background(), connect.NewRequest(&v1.ListTeamMembersRequest{}))
356
require.Error(t, err)
357
require.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err))
358
})
359
360
t.Run("returns permission denied for non-owner", func(t *testing.T) {
361
ctx := context.Background()
362
serverMock, client := setupTeamService(t)
363
364
team := newTeam(&protocol.Team{
365
Name: "Team A",
366
})
367
serverMock.EXPECT().GetTeamMembers(gomock.Any(), team.ID).Return(nil, &jsonrpc2.Error{Code: 403, Message: "not access"})
368
369
_, err := client.ListTeamMembers(ctx, connect.NewRequest(&v1.ListTeamMembersRequest{
370
TeamId: team.ID,
371
}))
372
require.Error(t, err)
373
require.Equal(t, connect.CodePermissionDenied, connect.CodeOf(err))
374
})
375
376
t.Run("returns members", func(t *testing.T) {
377
teamMembers := []*protocol.TeamMemberInfo{
378
newTeamMember(&protocol.TeamMemberInfo{
379
FullName: "Alice Alice",
380
Role: protocol.TeamMember_Owner,
381
}),
382
newTeamMember(&protocol.TeamMemberInfo{
383
FullName: "Bob Bob",
384
Role: protocol.TeamMember_Member,
385
}),
386
}
387
team := newTeam(&protocol.Team{
388
ID: uuid.New().String(),
389
})
390
391
serverMock, client := setupTeamService(t)
392
393
serverMock.EXPECT().GetTeamMembers(gomock.Any(), team.ID).Return(teamMembers, nil)
394
395
response, err := client.ListTeamMembers(context.Background(), connect.NewRequest(&v1.ListTeamMembersRequest{TeamId: team.ID}))
396
require.NoError(t, err)
397
398
requireEqualProto(t, &v1.ListTeamMembersResponse{
399
Members: teamMembersToAPIResponse(teamMembers),
400
}, response.Msg)
401
})
402
}
403
404
func TestTeamsService_UpdateTeamMember(t *testing.T) {
405
var (
406
teamID = uuid.New().String()
407
teamMemberID = uuid.New().String()
408
)
409
410
t.Run("invalid argument when team ID is missing", func(t *testing.T) {
411
_, client := setupTeamService(t)
412
413
_, err := client.UpdateTeamMember(context.Background(), connect.NewRequest(&v1.UpdateTeamMemberRequest{}))
414
require.Error(t, err)
415
require.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err))
416
})
417
418
t.Run("invalid argument when team member ID is missing", func(t *testing.T) {
419
_, client := setupTeamService(t)
420
421
_, err := client.UpdateTeamMember(context.Background(), connect.NewRequest(&v1.UpdateTeamMemberRequest{
422
TeamId: teamID,
423
TeamMember: &v1.TeamMember{},
424
}))
425
require.Error(t, err)
426
require.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err))
427
})
428
429
t.Run("invalid argument when team member role is missing", func(t *testing.T) {
430
_, client := setupTeamService(t)
431
432
_, err := client.UpdateTeamMember(context.Background(), connect.NewRequest(&v1.UpdateTeamMemberRequest{
433
TeamId: teamID,
434
TeamMember: &v1.TeamMember{
435
UserId: teamMemberID,
436
},
437
}))
438
require.Error(t, err)
439
require.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err))
440
})
441
442
t.Run("proxies request to server", func(t *testing.T) {
443
serverMock, client := setupTeamService(t)
444
445
serverMock.EXPECT().SetTeamMemberRole(gomock.Any(), teamID, teamMemberID, protocol.TeamMember_Owner).Return(nil)
446
447
response, err := client.UpdateTeamMember(context.Background(), connect.NewRequest(&v1.UpdateTeamMemberRequest{
448
TeamId: teamID,
449
TeamMember: &v1.TeamMember{
450
UserId: teamMemberID,
451
Role: v1.TeamRole_TEAM_ROLE_OWNER,
452
},
453
}))
454
require.NoError(t, err)
455
requireEqualProto(t, &v1.UpdateTeamMemberResponse{
456
TeamMember: &v1.TeamMember{
457
UserId: teamMemberID,
458
Role: v1.TeamRole_TEAM_ROLE_OWNER,
459
},
460
}, response.Msg)
461
})
462
}
463
464
func TestTeamsService_DeleteTeamMember(t *testing.T) {
465
var (
466
teamID = uuid.New().String()
467
teamMemberID = uuid.New().String()
468
)
469
470
t.Run("invalid argument when team ID is missing", func(t *testing.T) {
471
_, client := setupTeamService(t)
472
473
_, err := client.DeleteTeamMember(context.Background(), connect.NewRequest(&v1.DeleteTeamMemberRequest{}))
474
require.Error(t, err)
475
require.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err))
476
})
477
478
t.Run("invalid argument when team member ID is missing", func(t *testing.T) {
479
_, client := setupTeamService(t)
480
481
_, err := client.DeleteTeamMember(context.Background(), connect.NewRequest(&v1.DeleteTeamMemberRequest{
482
TeamId: teamID,
483
}))
484
require.Error(t, err)
485
require.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err))
486
})
487
488
t.Run("proxies to server", func(t *testing.T) {
489
serverMock, client := setupTeamService(t)
490
491
serverMock.EXPECT().RemoveTeamMember(gomock.Any(), teamID, teamMemberID).Return(nil)
492
493
response, err := client.DeleteTeamMember(context.Background(), connect.NewRequest(&v1.DeleteTeamMemberRequest{
494
TeamId: teamID,
495
TeamMemberId: teamMemberID,
496
}))
497
require.NoError(t, err)
498
requireEqualProto(t, &v1.DeleteTeamMemberResponse{}, response.Msg)
499
})
500
}
501
502
func TestTeamService_ResetTeamInvitation(t *testing.T) {
503
t.Run("missing team ID returns invalid argument", func(t *testing.T) {
504
_, client := setupTeamService(t)
505
506
_, err := client.ResetTeamInvitation(context.Background(), connect.NewRequest(&v1.ResetTeamInvitationRequest{}))
507
require.Error(t, err)
508
require.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err))
509
})
510
511
t.Run("proxies request to server", func(t *testing.T) {
512
teamID := uuid.New().String()
513
514
serverMock, client := setupTeamService(t)
515
516
invite := &protocol.TeamMembershipInvite{
517
ID: uuid.New().String(),
518
}
519
520
serverMock.EXPECT().ResetGenericInvite(gomock.Any(), teamID).Return(invite, nil)
521
522
response, err := client.ResetTeamInvitation(context.Background(), connect.NewRequest(&v1.ResetTeamInvitationRequest{
523
TeamId: teamID,
524
}))
525
require.NoError(t, err)
526
requireEqualProto(t, &v1.ResetTeamInvitationResponse{
527
TeamInvitation: teamInviteToAPIResponse(invite),
528
}, response.Msg)
529
})
530
}
531
532
func TestTeamService_GetTeamInvitation(t *testing.T) {
533
t.Run("missing team ID returns invalid argument", func(t *testing.T) {
534
_, client := setupTeamService(t)
535
536
_, err := client.GetTeamInvitation(context.Background(), connect.NewRequest(&v1.GetTeamInvitationRequest{}))
537
require.Error(t, err)
538
require.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err))
539
})
540
541
t.Run("proxies request to server", func(t *testing.T) {
542
teamID := uuid.New().String()
543
544
serverMock, client := setupTeamService(t)
545
546
invite := &protocol.TeamMembershipInvite{
547
ID: uuid.New().String(),
548
}
549
550
serverMock.EXPECT().GetGenericInvite(gomock.Any(), teamID).Return(invite, nil)
551
552
response, err := client.GetTeamInvitation(context.Background(), connect.NewRequest(&v1.GetTeamInvitationRequest{
553
TeamId: teamID,
554
}))
555
require.NoError(t, err)
556
requireEqualProto(t, &v1.GetTeamInvitationResponse{
557
TeamInvitation: teamInviteToAPIResponse(invite),
558
}, response.Msg)
559
})
560
561
t.Run("returns permission denied for non-owner", func(t *testing.T) {
562
ctx := context.Background()
563
serverMock, client := setupTeamService(t)
564
565
team := newTeam(&protocol.Team{
566
Name: "Team A",
567
})
568
serverMock.EXPECT().GetGenericInvite(gomock.Any(), team.ID).Return(nil, &jsonrpc2.Error{Code: 403, Message: "not access"})
569
570
_, err := client.GetTeamInvitation(ctx, connect.NewRequest(&v1.GetTeamInvitationRequest{
571
TeamId: team.ID,
572
}))
573
require.Error(t, err)
574
require.Equal(t, connect.CodePermissionDenied, connect.CodeOf(err))
575
})
576
}
577
578
func TestTeamService_DeleteTeam(t *testing.T) {
579
t.Run("missing team ID returns invalid argument", func(t *testing.T) {
580
_, client := setupTeamService(t)
581
582
_, err := client.DeleteTeam(context.Background(), connect.NewRequest(&v1.DeleteTeamRequest{}))
583
require.Error(t, err)
584
require.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err))
585
})
586
587
t.Run("proxies request to server", func(t *testing.T) {
588
teamID := uuid.New().String()
589
590
serverMock, client := setupTeamService(t)
591
592
serverMock.EXPECT().DeleteTeam(gomock.Any(), teamID).Return(nil)
593
594
response, err := client.DeleteTeam(context.Background(), connect.NewRequest(&v1.DeleteTeamRequest{
595
TeamId: teamID,
596
}))
597
require.NoError(t, err)
598
requireEqualProto(t, &v1.DeleteTeamResponse{}, response.Msg)
599
})
600
}
601
602
func newTeam(t *protocol.Team) *protocol.Team {
603
result := &protocol.Team{
604
ID: uuid.New().String(),
605
Name: "Team Name",
606
CreationTime: "2022-10-10T10:10:10.000Z",
607
}
608
609
if t.ID != "" {
610
result.ID = t.ID
611
}
612
613
if t.Name != "" {
614
result.Name = t.Name
615
}
616
617
if t.CreationTime != "" {
618
result.CreationTime = t.CreationTime
619
}
620
621
return result
622
}
623
624
func newTeamMember(m *protocol.TeamMemberInfo) *protocol.TeamMemberInfo {
625
result := &protocol.TeamMemberInfo{
626
UserId: uuid.New().String(),
627
FullName: "First Last",
628
PrimaryEmail: "[email protected]",
629
AvatarUrl: "https://avatars.yolo/first.png",
630
Role: protocol.TeamMember_Member,
631
MemberSince: "2022-09-09T09:09:09.000Z",
632
}
633
634
if m.UserId != "" {
635
result.UserId = m.UserId
636
}
637
if m.FullName != "" {
638
result.FullName = m.FullName
639
}
640
if m.PrimaryEmail != "" {
641
result.PrimaryEmail = m.PrimaryEmail
642
}
643
if m.AvatarUrl != "" {
644
result.AvatarUrl = m.AvatarUrl
645
}
646
if m.Role != "" {
647
result.Role = m.Role
648
}
649
if m.MemberSince != "" {
650
result.MemberSince = m.MemberSince
651
}
652
653
return result
654
}
655
656
func setupTeamService(t *testing.T) (*protocol.MockAPIInterface, v1connect.TeamsServiceClient) {
657
t.Helper()
658
659
ctrl := gomock.NewController(t)
660
t.Cleanup(ctrl.Finish)
661
662
serverMock := protocol.NewMockAPIInterface(ctrl)
663
664
svc := NewTeamsService(&FakeServerConnPool{
665
api: serverMock,
666
})
667
668
keyset := jwstest.GenerateKeySet(t)
669
rsa256, err := jws.NewRSA256(keyset)
670
require.NoError(t, err)
671
672
_, handler := v1connect.NewTeamsServiceHandler(svc, connect.WithInterceptors(auth.NewServerInterceptor(config.SessionConfig{
673
Issuer: "unitetest.com",
674
Cookie: config.CookieConfig{
675
Name: "cookie_jwt",
676
},
677
}, rsa256)))
678
679
srv := httptest.NewServer(handler)
680
t.Cleanup(srv.Close)
681
682
client := v1connect.NewTeamsServiceClient(http.DefaultClient, srv.URL, connect.WithInterceptors(
683
auth.NewClientInterceptor("auth-token"),
684
))
685
686
return serverMock, client
687
}
688
689
func requireEqualProto(t *testing.T, expected interface{}, actual interface{}) {
690
t.Helper()
691
692
diff := cmp.Diff(expected, actual, protocmp.Transform())
693
if diff != "" {
694
require.Fail(t, diff)
695
}
696
}
697
698