From 12008e0d4817d705d754501960f27d292267c45f Mon Sep 17 00:00:00 2001 From: Cezary Bartoszuk Date: Tue, 7 Feb 2023 17:47:38 +0100 Subject: [PATCH] Add team members(search:...) graphQL resolvers test --- cmd/frontend/graphqlbackend/teams_test.go | 86 +++++++++++++++++++++-- 1 file changed, 82 insertions(+), 4 deletions(-) diff --git a/cmd/frontend/graphqlbackend/teams_test.go b/cmd/frontend/graphqlbackend/teams_test.go index 8e5d21389097..bfc823ad5dc7 100644 --- a/cmd/frontend/graphqlbackend/teams_test.go +++ b/cmd/frontend/graphqlbackend/teams_test.go @@ -27,6 +27,7 @@ type fakeTeamsDb struct { database.TeamStore list []*types.Team members orderedTeamMembers + users *fakeUsersDB lastUsedID int32 } @@ -146,11 +147,8 @@ func (teams *fakeTeamsDb) CountTeamMembers(ctx context.Context, opts database.Li return int32(len(ms)), err } -func (teams *fakeTeamsDb) ListTeamMembers(_ context.Context, opts database.ListTeamMembersOpts) (selected []*types.TeamMember, next *database.TeamMemberListCursor, err error) { +func (teams *fakeTeamsDb) ListTeamMembers(ctx context.Context, opts database.ListTeamMembersOpts) (selected []*types.TeamMember, next *database.TeamMemberListCursor, err error) { sort.Sort(teams.members) - if opts.Search != "" { - return nil, nil, errors.New("fakeTeamsDb does not suppor Search parameter in ListTeamMembers yet") - } for _, m := range teams.members { if opts.Cursor.TeamID > m.TeamID { continue @@ -161,6 +159,24 @@ func (teams *fakeTeamsDb) ListTeamMembers(_ context.Context, opts database.ListT if opts.TeamID != 0 && opts.TeamID != m.TeamID { continue } + if opts.Search != "" { + if teams.users == nil { + return nil, nil, errors.New("fakeTeamsDB needs reference to fakeUsersDB for ListTeamMembersOpts.Search") + } + u, err := teams.users.GetByID(ctx, m.UserID) + if err != nil { + return nil, nil, err + } + if u == nil { + continue + } + search := strings.ToLower(opts.Search) + username := strings.ToLower(u.Username) + displayName := strings.ToLower(u.DisplayName) + if !strings.Contains(username, search) && !strings.Contains(displayName, search) { + continue + } + } selected = append(selected, m) } if opts.LimitOffset != nil { @@ -220,6 +236,7 @@ var ( func setupDB() { fakeTeams = &fakeTeamsDb{} fakeUsers = &fakeUsersDB{} + fakeTeams.users = fakeUsers db = database.NewMockDB() db.TeamsFunc.SetDefaultReturn(fakeTeams) db.UsersFunc.SetDefaultReturn(fakeUsers) @@ -1241,3 +1258,64 @@ func TestMembersPaginated(t *testing.T) { t.Errorf("unexpected member usernames (-want,+got):\n%s", diff) } } + +func TestMembersSearch(t *testing.T) { + setupDB() + ctx := userCtx(fakeUsers.newUser(types.User{SiteAdmin: true})) + if err := fakeTeams.CreateTeam(ctx, &types.Team{Name: "team"}); err != nil { + t.Fatalf("failed to create parent team: %s", err) + } + team, err := fakeTeams.GetTeamByName(ctx, "team") + if err != nil { + t.Fatalf("failed to fetch fake team by ID: %s", err) + } + for _, u := range []types.User{ + { + Username: "username-hit", + }, + { + Username: "username-miss", + }, + { + Username: "look-at-displayname", + DisplayName: "Display Name Hit", + }, + } { + userID := fakeUsers.newUser(u) + fakeTeams.members = append(fakeTeams.members, &types.TeamMember{ + TeamID: team.ID, + UserID: userID, + }) + } + idOfMissingUser := -7 + fakeTeams.members = append(fakeTeams.members, &types.TeamMember{ + TeamID: team.ID, + UserID: int32(idOfMissingUser), + }) + fakeUsers.newUser(types.User{Username: "search-hit-but-not-team-member"}) + RunTest(t, &Test{ + Schema: mustParseGraphQLSchema(t, db), + Context: ctx, + Query: `{ + team(name: "team") { + members(search: "hit") { + nodes { + ... on User { + username + } + } + } + } + }`, + ExpectedResult: `{ + "team": { + "members": { + "nodes": [ + {"username": "username-hit"}, + {"username": "look-at-displayname"} + ] + } + } + }`, + }) +}