Skip to content

Commit 1337b92

Browse files
Add tests for MSEntraID specific GetUserInfo
1 parent 2a0450c commit 1337b92

6 files changed

+143
-0
lines changed

Diff for: internal/providers/msentraid/helper_test.go

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package msentraid_test
2+
3+
import (
4+
"encoding/json"
5+
"time"
6+
7+
"golang.org/x/oauth2"
8+
)
9+
10+
var (
11+
validAccessToken = &oauth2.Token{
12+
AccessToken: "accesstoken",
13+
RefreshToken: "refreshtoken",
14+
Expiry: time.Now().Add(1000 * time.Hour),
15+
}
16+
17+
validIDToken = &testIDToken{
18+
claims: `
19+
{
20+
"preferred_username": "valid-user",
21+
"sub": "valid-sub",
22+
"home": "/home/valid-user",
23+
"shell": "/bin/bash",
24+
"gecos": "Valid User"
25+
}`,
26+
}
27+
invalidIDToken = &testIDToken{
28+
invalid: true,
29+
}
30+
)
31+
32+
type testIDToken struct {
33+
claims string
34+
invalid bool
35+
}
36+
37+
func (t *testIDToken) Claims(v interface{}) error {
38+
if t.invalid {
39+
t.claims = "invalid json"
40+
}
41+
return json.Unmarshal([]byte(t.claims), v)
42+
}

Diff for: internal/providers/msentraid/msentraid_test.go

+63
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package msentraid_test
22

33
import (
4+
"context"
5+
"net/http"
46
"testing"
57

68
"github.com/stretchr/testify/require"
79
"github.com/ubuntu/authd-oidc-brokers/internal/providers/msentraid"
10+
"github.com/ubuntu/authd-oidc-brokers/internal/testutils/golden"
811
"golang.org/x/oauth2"
912
)
1013

@@ -115,3 +118,63 @@ func TestVerifyUsername(t *testing.T) {
115118
})
116119
}
117120
}
121+
122+
func TestGetUserInfo(t *testing.T) {
123+
t.Parallel()
124+
125+
tests := map[string]struct {
126+
invalidIDToken bool
127+
tokenScopes map[string]any
128+
providerMetadata map[string]any
129+
130+
groupEndpointHandler http.HandlerFunc
131+
132+
wantErr bool
133+
}{
134+
"Successfully_get_user_info": {},
135+
"Successfully_get_user_info_with_local_groups": {groupEndpointHandler: localGroupHandler},
136+
"Successfully_get_user_info_with_mixed_groups": {groupEndpointHandler: mixedGroupHandler},
137+
"Successfully_get_user_info_filtering_non_security_groups": {groupEndpointHandler: nonSecurityGroupHandler},
138+
139+
"Error_when_connecting_to_server": {providerMetadata: map[string]any{"msgraph_host": "invalid"}, wantErr: true},
140+
"Error_when_getting_user_claims": {invalidIDToken: true, wantErr: true},
141+
"Error_when_getting_token_scopes": {tokenScopes: map[string]any{"scope": struct{ notAString int }{10}}, wantErr: true},
142+
"Error_when_token_does_not_have_required_scopes": {tokenScopes: map[string]any{"scope": "not the required scopes"}, wantErr: true},
143+
"Error_when_getting_user_groups": {groupEndpointHandler: errorGroupHandler, wantErr: true},
144+
"Error_when_group_is_missing_id": {groupEndpointHandler: missingIDGroupHandler, wantErr: true},
145+
"Error_when_group_is_missing_display_name": {groupEndpointHandler: missingDisplayNameGroupHandler, wantErr: true},
146+
}
147+
for name, tc := range tests {
148+
t.Run(name, func(t *testing.T) {
149+
t.Parallel()
150+
151+
accessToken := validAccessToken
152+
if tc.tokenScopes == nil {
153+
tc.tokenScopes = map[string]any{"scope": msentraid.AllExpectedScopes()}
154+
}
155+
accessToken = accessToken.WithExtra(tc.tokenScopes)
156+
157+
idToken := validIDToken
158+
if tc.invalidIDToken {
159+
idToken = invalidIDToken
160+
}
161+
162+
if tc.providerMetadata == nil {
163+
msGraphMockURL, stopFunc := startMSGraphServerMock(tc.groupEndpointHandler)
164+
t.Cleanup(stopFunc)
165+
tc.providerMetadata = map[string]any{"msgraph_host": msGraphMockURL}
166+
}
167+
168+
p := msentraid.New()
169+
got, err := p.GetUserInfo(context.Background(), accessToken, idToken, tc.providerMetadata)
170+
if tc.wantErr {
171+
require.Error(t, err, "GetUserInfo should return an error")
172+
return
173+
}
174+
require.NoError(t, err, "GetUserInfo should not return an error")
175+
176+
want := golden.LoadWithUpdateYAML(t, got)
177+
require.Equal(t, want, got, "GetUserInfo should return the expected user info")
178+
})
179+
}
180+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
name: valid-user
2+
uuid: valid-sub
3+
home: /home/valid-user
4+
shell: /bin/bash
5+
gecos: Valid User
6+
groups:
7+
- name: group1
8+
ugid: id1
9+
- name: group2
10+
ugid: id2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
name: valid-user
2+
uuid: valid-sub
3+
home: /home/valid-user
4+
shell: /bin/bash
5+
gecos: Valid User
6+
groups:
7+
- name: group1
8+
ugid: id1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
name: valid-user
2+
uuid: valid-sub
3+
home: /home/valid-user
4+
shell: /bin/bash
5+
gecos: Valid User
6+
groups:
7+
- name: local1
8+
ugid: ""
9+
- name: local2
10+
ugid: ""
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
name: valid-user
2+
uuid: valid-sub
3+
home: /home/valid-user
4+
shell: /bin/bash
5+
gecos: Valid User
6+
groups:
7+
- name: group1
8+
ugid: id1
9+
- name: local1
10+
ugid: ""

0 commit comments

Comments
 (0)