Skip to content

Commit c2439ca

Browse files
lukemassaPetr Bubenik
authored and
Petr Bubenik
committed
fix: Minor bug in determining teams for gitlab (runatlantis#5294)
Signed-off-by: Luke Massa <[email protected]> Signed-off-by: Petr Bubenik <[email protected]>
1 parent 68ea8c8 commit c2439ca

File tree

4 files changed

+97
-34
lines changed

4 files changed

+97
-34
lines changed

server/events/vcs/gitlab_client.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -637,10 +637,10 @@ func (g *GitlabClient) GetTeamNamesForUser(logger logging.SimpleLogging, _ model
637637
if err != nil {
638638
return nil, errors.Wrapf(err, "GET /users returned: %d", resp.StatusCode)
639639
} else if len(users) == 0 {
640-
return nil, errors.Wrap(err, "GET /users returned no user")
640+
return nil, errors.New("GET /users returned no user")
641641
} else if len(users) > 1 {
642642
// Theoretically impossible, just being extra safe
643-
return nil, errors.Wrap(err, "GET /users returned more than 1 user")
643+
return nil, errors.New("GET /users returned more than 1 user")
644644
}
645645
userID := users[0].ID
646646
for _, groupName := range g.ConfiguredGroups {

server/events/vcs/gitlab_client_test.go

+74-32
Original file line numberDiff line numberDiff line change
@@ -1121,40 +1121,82 @@ func TestGitlabClient_GetTeamNamesForUser(t *testing.T) {
11211121
userSuccess, err := os.ReadFile("testdata/gitlab-user-success.json")
11221122
Ok(t, err)
11231123

1124-
configuredGroups := []string{"someorg/group1", "someorg/group2", "someorg/group3", "someorg/group4"}
1125-
testServer := httptest.NewServer(
1126-
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
1127-
switch r.RequestURI {
1128-
case "/api/v4/users?username=testuser":
1129-
w.WriteHeader(http.StatusOK)
1130-
w.Write(userSuccess) // nolint: errcheck
1131-
case "/api/v4/groups/someorg%2Fgroup1/members/123", "/api/v4/groups/someorg%2Fgroup2/members/123":
1132-
w.WriteHeader(http.StatusOK)
1133-
w.Write(groupMembershipSuccess) // nolint: errcheck
1134-
case "/api/v4/groups/someorg%2Fgroup3/members/123":
1135-
http.Error(w, "forbidden", http.StatusForbidden)
1136-
case "/api/v4/groups/someorg%2Fgroup4/members/123":
1137-
http.Error(w, "not found", http.StatusNotFound)
1138-
default:
1139-
t.Errorf("got unexpected request at %q", r.RequestURI)
1140-
http.Error(w, "not found", http.StatusNotFound)
1141-
}
1142-
}))
1143-
internalClient, err := gitlab.NewClient("token", gitlab.WithBaseURL(testServer.URL))
1124+
userEmpty, err := os.ReadFile("testdata/gitlab-user-none.json")
11441125
Ok(t, err)
1145-
client := &GitlabClient{
1146-
Client: internalClient,
1147-
Version: nil,
1148-
ConfiguredGroups: configuredGroups,
1126+
1127+
multipleUsers, err := os.ReadFile("testdata/gitlab-user-multiple.json")
1128+
Ok(t, err)
1129+
1130+
configuredGroups := []string{"someorg/group1", "someorg/group2", "someorg/group3", "someorg/group4"}
1131+
1132+
cases := []struct {
1133+
userName string
1134+
expErr string
1135+
expTeams []string
1136+
}{
1137+
{
1138+
userName: "testuser",
1139+
expTeams: []string{"someorg/group1", "someorg/group2"},
1140+
},
1141+
{
1142+
userName: "none",
1143+
expErr: "GET /users returned no user",
1144+
},
1145+
{
1146+
userName: "multiuser",
1147+
expErr: "GET /users returned more than 1 user",
1148+
},
11491149
}
1150+
for _, c := range cases {
1151+
t.Run(c.userName, func(t *testing.T) {
1152+
1153+
testServer := httptest.NewServer(
1154+
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
1155+
switch r.RequestURI {
1156+
case "/api/v4/users?username=testuser":
1157+
w.WriteHeader(http.StatusOK)
1158+
w.Write(userSuccess) // nolint: errcheck
1159+
case "/api/v4/users?username=none":
1160+
w.WriteHeader(http.StatusOK)
1161+
w.Write(userEmpty) // nolint: errcheck
1162+
case "/api/v4/users?username=multiuser":
1163+
w.WriteHeader(http.StatusOK)
1164+
w.Write(multipleUsers) // nolint: errcheck
1165+
case "/api/v4/groups/someorg%2Fgroup1/members/123", "/api/v4/groups/someorg%2Fgroup2/members/123":
1166+
w.WriteHeader(http.StatusOK)
1167+
w.Write(groupMembershipSuccess) // nolint: errcheck
1168+
case "/api/v4/groups/someorg%2Fgroup3/members/123":
1169+
http.Error(w, "forbidden", http.StatusForbidden)
1170+
case "/api/v4/groups/someorg%2Fgroup4/members/123":
1171+
http.Error(w, "not found", http.StatusNotFound)
1172+
default:
1173+
t.Errorf("got unexpected request at %q", r.RequestURI)
1174+
http.Error(w, "not found", http.StatusNotFound)
1175+
}
1176+
}))
1177+
internalClient, err := gitlab.NewClient("token", gitlab.WithBaseURL(testServer.URL))
1178+
Ok(t, err)
1179+
client := &GitlabClient{
1180+
Client: internalClient,
1181+
Version: nil,
1182+
ConfiguredGroups: configuredGroups,
1183+
}
1184+
1185+
teams, err := client.GetTeamNamesForUser(
1186+
logger,
1187+
models.Repo{
1188+
Owner: "someorg",
1189+
}, models.User{
1190+
Username: c.userName,
1191+
})
1192+
if c.expErr == "" {
1193+
Ok(t, err)
1194+
Equals(t, c.expTeams, teams)
1195+
} else {
1196+
ErrContains(t, c.expErr, err)
1197+
1198+
}
11501199

1151-
teams, err := client.GetTeamNamesForUser(
1152-
logger,
1153-
models.Repo{
1154-
Owner: "someorg",
1155-
}, models.User{
1156-
Username: "testuser",
11571200
})
1158-
Ok(t, err)
1159-
Equals(t, []string{"someorg/group1", "someorg/group2"}, teams)
1201+
}
11601202
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
[
2+
{
3+
"id": 123,
4+
"username": "multiuser",
5+
"name": "Multiple User 1",
6+
"state": "active",
7+
"locked": false,
8+
"avatar_url": "https://gitlab.com/uploads/-/system/user/avatar/123/avatar.png",
9+
"web_url": "https://gitlab.com/multiuser"
10+
},
11+
{
12+
"id": 124,
13+
"username": "multiuser",
14+
"name": "Multiple User 2",
15+
"state": "active",
16+
"locked": false,
17+
"avatar_url": "https://gitlab.com/uploads/-/system/user/avatar/124/avatar.png",
18+
"web_url": "https://gitlab.com/multiuser"
19+
}
20+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[]

0 commit comments

Comments
 (0)