| 
									
										
										
										
											2023-01-23 08:11:40 +01:00
										 |  |  | package azuread | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"context" | 
					
						
							|  |  |  | 	"testing" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/stretchr/testify/assert" | 
					
						
							|  |  |  | 	"github.com/stretchr/testify/require" | 
					
						
							|  |  |  | 	"github.com/zitadel/oidc/v2/pkg/client/rp" | 
					
						
							| 
									
										
										
										
											2023-03-15 07:48:37 +01:00
										 |  |  | 	openid "github.com/zitadel/oidc/v2/pkg/oidc" | 
					
						
							| 
									
										
										
										
											2023-01-23 08:11:40 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/zitadel/zitadel/internal/idp" | 
					
						
							|  |  |  | 	"github.com/zitadel/zitadel/internal/idp/providers/oauth" | 
					
						
							|  |  |  | 	"github.com/zitadel/zitadel/internal/idp/providers/oidc" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestProvider_BeginAuth(t *testing.T) { | 
					
						
							|  |  |  | 	type fields struct { | 
					
						
							|  |  |  | 		name         string | 
					
						
							|  |  |  | 		clientID     string | 
					
						
							|  |  |  | 		clientSecret string | 
					
						
							|  |  |  | 		redirectURI  string | 
					
						
							| 
									
										
										
										
											2023-03-15 07:48:37 +01:00
										 |  |  | 		scopes       []string | 
					
						
							| 
									
										
										
										
											2023-01-23 08:11:40 +01:00
										 |  |  | 		options      []ProviderOptions | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	tests := []struct { | 
					
						
							|  |  |  | 		name   string | 
					
						
							|  |  |  | 		fields fields | 
					
						
							|  |  |  | 		want   idp.Session | 
					
						
							|  |  |  | 	}{ | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			name: "default common tenant", | 
					
						
							|  |  |  | 			fields: fields{ | 
					
						
							|  |  |  | 				clientID:     "clientID", | 
					
						
							|  |  |  | 				clientSecret: "clientSecret", | 
					
						
							|  |  |  | 				redirectURI:  "redirectURI", | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			want: &oidc.Session{ | 
					
						
							| 
									
										
										
										
											2023-04-17 09:02:16 +02:00
										 |  |  | 				AuthURL: "https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=clientID&prompt=select_account&redirect_uri=redirectURI&response_type=code&scope=openid+profile+email+phone+User.Read&state=testState", | 
					
						
							| 
									
										
										
										
											2023-01-23 08:11:40 +01:00
										 |  |  | 			}, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			name: "tenant", | 
					
						
							|  |  |  | 			fields: fields{ | 
					
						
							|  |  |  | 				clientID:     "clientID", | 
					
						
							|  |  |  | 				clientSecret: "clientSecret", | 
					
						
							|  |  |  | 				redirectURI:  "redirectURI", | 
					
						
							|  |  |  | 				options: []ProviderOptions{ | 
					
						
							|  |  |  | 					WithTenant(ConsumersTenant), | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			want: &oidc.Session{ | 
					
						
							| 
									
										
										
										
											2023-04-17 09:02:16 +02:00
										 |  |  | 				AuthURL: "https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize?client_id=clientID&prompt=select_account&redirect_uri=redirectURI&response_type=code&scope=openid+profile+email+phone+User.Read&state=testState", | 
					
						
							| 
									
										
										
										
											2023-03-15 07:48:37 +01:00
										 |  |  | 			}, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			name: "custom scopes", | 
					
						
							|  |  |  | 			fields: fields{ | 
					
						
							|  |  |  | 				clientID:     "clientID", | 
					
						
							|  |  |  | 				clientSecret: "clientSecret", | 
					
						
							|  |  |  | 				redirectURI:  "redirectURI", | 
					
						
							| 
									
										
										
										
											2023-04-17 09:02:16 +02:00
										 |  |  | 				scopes:       []string{openid.ScopeOpenID, openid.ScopeProfile, "custom"}, | 
					
						
							| 
									
										
										
										
											2023-03-15 07:48:37 +01:00
										 |  |  | 				options: []ProviderOptions{ | 
					
						
							|  |  |  | 					WithTenant(ConsumersTenant), | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			want: &oidc.Session{ | 
					
						
							| 
									
										
										
										
											2023-04-17 09:02:16 +02:00
										 |  |  | 				AuthURL: "https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize?client_id=clientID&prompt=select_account&redirect_uri=redirectURI&response_type=code&scope=openid+profile+custom+User.Read&state=testState", | 
					
						
							| 
									
										
										
										
											2023-01-23 08:11:40 +01:00
										 |  |  | 			}, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	for _, tt := range tests { | 
					
						
							|  |  |  | 		t.Run(tt.name, func(t *testing.T) { | 
					
						
							|  |  |  | 			a := assert.New(t) | 
					
						
							|  |  |  | 			r := require.New(t) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-15 07:48:37 +01:00
										 |  |  | 			provider, err := New(tt.fields.name, tt.fields.clientID, tt.fields.clientSecret, tt.fields.redirectURI, tt.fields.scopes, tt.fields.options...) | 
					
						
							| 
									
										
										
										
											2023-01-23 08:11:40 +01:00
										 |  |  | 			r.NoError(err) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-29 11:26:14 +02:00
										 |  |  | 			ctx := context.Background() | 
					
						
							|  |  |  | 			session, err := provider.BeginAuth(ctx, "testState") | 
					
						
							| 
									
										
										
										
											2023-01-23 08:11:40 +01:00
										 |  |  | 			r.NoError(err) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-29 11:26:14 +02:00
										 |  |  | 			wantHeaders, wantContent := tt.want.GetAuth(ctx) | 
					
						
							|  |  |  | 			gotHeaders, gotContent := session.GetAuth(ctx) | 
					
						
							|  |  |  | 			a.Equal(wantHeaders, gotHeaders) | 
					
						
							|  |  |  | 			a.Equal(wantContent, gotContent) | 
					
						
							| 
									
										
										
										
											2023-01-23 08:11:40 +01:00
										 |  |  | 		}) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestProvider_Options(t *testing.T) { | 
					
						
							|  |  |  | 	type fields struct { | 
					
						
							|  |  |  | 		name         string | 
					
						
							|  |  |  | 		clientID     string | 
					
						
							|  |  |  | 		clientSecret string | 
					
						
							|  |  |  | 		redirectURI  string | 
					
						
							| 
									
										
										
										
											2023-03-15 07:48:37 +01:00
										 |  |  | 		scopes       []string | 
					
						
							| 
									
										
										
										
											2023-01-23 08:11:40 +01:00
										 |  |  | 		options      []ProviderOptions | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	type want struct { | 
					
						
							|  |  |  | 		name            string | 
					
						
							|  |  |  | 		tenant          TenantType | 
					
						
							|  |  |  | 		emailVerified   bool | 
					
						
							|  |  |  | 		linkingAllowed  bool | 
					
						
							|  |  |  | 		creationAllowed bool | 
					
						
							|  |  |  | 		autoCreation    bool | 
					
						
							|  |  |  | 		autoUpdate      bool | 
					
						
							|  |  |  | 		pkce            bool | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	tests := []struct { | 
					
						
							|  |  |  | 		name   string | 
					
						
							|  |  |  | 		fields fields | 
					
						
							|  |  |  | 		want   want | 
					
						
							|  |  |  | 	}{ | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			name: "default common tenant", | 
					
						
							|  |  |  | 			fields: fields{ | 
					
						
							|  |  |  | 				name:         "default common tenant", | 
					
						
							|  |  |  | 				clientID:     "clientID", | 
					
						
							|  |  |  | 				clientSecret: "clientSecret", | 
					
						
							|  |  |  | 				redirectURI:  "redirectURI", | 
					
						
							| 
									
										
										
										
											2023-03-15 07:48:37 +01:00
										 |  |  | 				scopes:       nil, | 
					
						
							| 
									
										
										
										
											2023-01-23 08:11:40 +01:00
										 |  |  | 				options:      nil, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			want: want{ | 
					
						
							|  |  |  | 				name:            "default common tenant", | 
					
						
							|  |  |  | 				tenant:          CommonTenant, | 
					
						
							|  |  |  | 				emailVerified:   false, | 
					
						
							|  |  |  | 				linkingAllowed:  false, | 
					
						
							|  |  |  | 				creationAllowed: false, | 
					
						
							|  |  |  | 				autoCreation:    false, | 
					
						
							|  |  |  | 				autoUpdate:      false, | 
					
						
							|  |  |  | 				pkce:            false, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			name: "all set", | 
					
						
							|  |  |  | 			fields: fields{ | 
					
						
							|  |  |  | 				name:         "custom tenant", | 
					
						
							|  |  |  | 				clientID:     "clientID", | 
					
						
							|  |  |  | 				clientSecret: "clientSecret", | 
					
						
							|  |  |  | 				redirectURI:  "redirectURI", | 
					
						
							|  |  |  | 				options: []ProviderOptions{ | 
					
						
							|  |  |  | 					WithTenant("tenant"), | 
					
						
							|  |  |  | 					WithEmailVerified(), | 
					
						
							|  |  |  | 					WithOAuthOptions( | 
					
						
							|  |  |  | 						oauth.WithLinkingAllowed(), | 
					
						
							|  |  |  | 						oauth.WithCreationAllowed(), | 
					
						
							|  |  |  | 						oauth.WithAutoCreation(), | 
					
						
							|  |  |  | 						oauth.WithAutoUpdate(), | 
					
						
							|  |  |  | 						oauth.WithRelyingPartyOption(rp.WithPKCE(nil)), | 
					
						
							|  |  |  | 					), | 
					
						
							|  |  |  | 				}, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			want: want{ | 
					
						
							|  |  |  | 				name:            "custom tenant", | 
					
						
							|  |  |  | 				tenant:          "tenant", | 
					
						
							|  |  |  | 				emailVerified:   true, | 
					
						
							|  |  |  | 				linkingAllowed:  true, | 
					
						
							|  |  |  | 				creationAllowed: true, | 
					
						
							|  |  |  | 				autoCreation:    true, | 
					
						
							|  |  |  | 				autoUpdate:      true, | 
					
						
							|  |  |  | 				pkce:            true, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	for _, tt := range tests { | 
					
						
							|  |  |  | 		t.Run(tt.name, func(t *testing.T) { | 
					
						
							|  |  |  | 			a := assert.New(t) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-15 07:48:37 +01:00
										 |  |  | 			provider, err := New(tt.fields.name, tt.fields.clientID, tt.fields.clientSecret, tt.fields.redirectURI, tt.fields.scopes, tt.fields.options...) | 
					
						
							| 
									
										
										
										
											2023-01-23 08:11:40 +01:00
										 |  |  | 			require.NoError(t, err) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			a.Equal(tt.want.name, provider.Name()) | 
					
						
							|  |  |  | 			a.Equal(tt.want.tenant, provider.tenant) | 
					
						
							|  |  |  | 			a.Equal(tt.want.emailVerified, provider.emailVerified) | 
					
						
							|  |  |  | 			a.Equal(tt.want.linkingAllowed, provider.IsLinkingAllowed()) | 
					
						
							|  |  |  | 			a.Equal(tt.want.creationAllowed, provider.IsCreationAllowed()) | 
					
						
							|  |  |  | 			a.Equal(tt.want.autoCreation, provider.IsAutoCreation()) | 
					
						
							|  |  |  | 			a.Equal(tt.want.autoUpdate, provider.IsAutoUpdate()) | 
					
						
							|  |  |  | 			a.Equal(tt.want.pkce, provider.RelyingParty.IsPKCE()) | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |