Skip to content

Commit

Permalink
fix: Minor bug in determining teams for gitlab (#5294)
Browse files Browse the repository at this point in the history
Signed-off-by: Luke Massa <[email protected]>
  • Loading branch information
lukemassa authored Feb 3, 2025
1 parent aa4a980 commit c2c25ae
Show file tree
Hide file tree
Showing 4 changed files with 97 additions and 34 deletions.
4 changes: 2 additions & 2 deletions server/events/vcs/gitlab_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -637,10 +637,10 @@ func (g *GitlabClient) GetTeamNamesForUser(logger logging.SimpleLogging, _ model
if err != nil {
return nil, errors.Wrapf(err, "GET /users returned: %d", resp.StatusCode)
} else if len(users) == 0 {
return nil, errors.Wrap(err, "GET /users returned no user")
return nil, errors.New("GET /users returned no user")
} else if len(users) > 1 {
// Theoretically impossible, just being extra safe
return nil, errors.Wrap(err, "GET /users returned more than 1 user")
return nil, errors.New("GET /users returned more than 1 user")
}
userID := users[0].ID
for _, groupName := range g.ConfiguredGroups {
Expand Down
106 changes: 74 additions & 32 deletions server/events/vcs/gitlab_client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1121,40 +1121,82 @@ func TestGitlabClient_GetTeamNamesForUser(t *testing.T) {
userSuccess, err := os.ReadFile("testdata/gitlab-user-success.json")
Ok(t, err)

configuredGroups := []string{"someorg/group1", "someorg/group2", "someorg/group3", "someorg/group4"}
testServer := httptest.NewServer(
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
switch r.RequestURI {
case "/api/v4/users?username=testuser":
w.WriteHeader(http.StatusOK)
w.Write(userSuccess) // nolint: errcheck
case "/api/v4/groups/someorg%2Fgroup1/members/123", "/api/v4/groups/someorg%2Fgroup2/members/123":
w.WriteHeader(http.StatusOK)
w.Write(groupMembershipSuccess) // nolint: errcheck
case "/api/v4/groups/someorg%2Fgroup3/members/123":
http.Error(w, "forbidden", http.StatusForbidden)
case "/api/v4/groups/someorg%2Fgroup4/members/123":
http.Error(w, "not found", http.StatusNotFound)
default:
t.Errorf("got unexpected request at %q", r.RequestURI)
http.Error(w, "not found", http.StatusNotFound)
}
}))
internalClient, err := gitlab.NewClient("token", gitlab.WithBaseURL(testServer.URL))
userEmpty, err := os.ReadFile("testdata/gitlab-user-none.json")
Ok(t, err)
client := &GitlabClient{
Client: internalClient,
Version: nil,
ConfiguredGroups: configuredGroups,

multipleUsers, err := os.ReadFile("testdata/gitlab-user-multiple.json")
Ok(t, err)

configuredGroups := []string{"someorg/group1", "someorg/group2", "someorg/group3", "someorg/group4"}

cases := []struct {
userName string
expErr string
expTeams []string
}{
{
userName: "testuser",
expTeams: []string{"someorg/group1", "someorg/group2"},
},
{
userName: "none",
expErr: "GET /users returned no user",
},
{
userName: "multiuser",
expErr: "GET /users returned more than 1 user",
},
}
for _, c := range cases {
t.Run(c.userName, func(t *testing.T) {

testServer := httptest.NewServer(
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
switch r.RequestURI {
case "/api/v4/users?username=testuser":
w.WriteHeader(http.StatusOK)
w.Write(userSuccess) // nolint: errcheck
case "/api/v4/users?username=none":
w.WriteHeader(http.StatusOK)
w.Write(userEmpty) // nolint: errcheck
case "/api/v4/users?username=multiuser":
w.WriteHeader(http.StatusOK)
w.Write(multipleUsers) // nolint: errcheck
case "/api/v4/groups/someorg%2Fgroup1/members/123", "/api/v4/groups/someorg%2Fgroup2/members/123":
w.WriteHeader(http.StatusOK)
w.Write(groupMembershipSuccess) // nolint: errcheck
case "/api/v4/groups/someorg%2Fgroup3/members/123":
http.Error(w, "forbidden", http.StatusForbidden)
case "/api/v4/groups/someorg%2Fgroup4/members/123":
http.Error(w, "not found", http.StatusNotFound)
default:
t.Errorf("got unexpected request at %q", r.RequestURI)
http.Error(w, "not found", http.StatusNotFound)
}
}))
internalClient, err := gitlab.NewClient("token", gitlab.WithBaseURL(testServer.URL))
Ok(t, err)
client := &GitlabClient{
Client: internalClient,
Version: nil,
ConfiguredGroups: configuredGroups,
}

teams, err := client.GetTeamNamesForUser(
logger,
models.Repo{
Owner: "someorg",
}, models.User{
Username: c.userName,
})
if c.expErr == "" {
Ok(t, err)
Equals(t, c.expTeams, teams)
} else {
ErrContains(t, c.expErr, err)

}

teams, err := client.GetTeamNamesForUser(
logger,
models.Repo{
Owner: "someorg",
}, models.User{
Username: "testuser",
})
Ok(t, err)
Equals(t, []string{"someorg/group1", "someorg/group2"}, teams)
}
}
20 changes: 20 additions & 0 deletions server/events/vcs/testdata/gitlab-user-multiple.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
[
{
"id": 123,
"username": "multiuser",
"name": "Multiple User 1",
"state": "active",
"locked": false,
"avatar_url": "https://gitlab.com/uploads/-/system/user/avatar/123/avatar.png",
"web_url": "https://gitlab.com/multiuser"
},
{
"id": 124,
"username": "multiuser",
"name": "Multiple User 2",
"state": "active",
"locked": false,
"avatar_url": "https://gitlab.com/uploads/-/system/user/avatar/124/avatar.png",
"web_url": "https://gitlab.com/multiuser"
}
]
1 change: 1 addition & 0 deletions server/events/vcs/testdata/gitlab-user-none.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[]

0 comments on commit c2c25ae

Please sign in to comment.