Skip to content

Commit

Permalink
Added new unit tests, cleaned up older ones. (#70)
Browse files Browse the repository at this point in the history
Added unit tests for AzureADB2COpenIDConnectEventHandlersTests, CookiePolicyOptionsExtensionsTests, Cleaned up some tests by using InlineData and changing some local variables to instance. (#70)
  • Loading branch information
pmaytak authored Mar 31, 2020
1 parent 41798ce commit 824682e
Show file tree
Hide file tree
Showing 12 changed files with 403 additions and 337 deletions.
19 changes: 5 additions & 14 deletions tests/Microsoft.Identity.Web.Test.Common/TestConstants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,29 +32,20 @@ public static class TestConstants
public const string AuthorityWithTenantSpecifiedWithV2 = AadInstance + "/" + TenantId + "/v2.0";
public const string AadIssuer = AadInstance + "/" + TenantIdAsGuid + "/v2.0";

public const string Uid = "uid-value";
public const string Utid = "utid-value";
public const string Tfp = "tfp-value";
public const string Userflow = "userflow-value";
public const string Oid = "oid-value";
public const string ObjectId = "objectId-value";
public const string Tid = "tid-value";
public const string PreferredUsername = "preferred_username-value";
public const string NameV1 = "name_V1-value";
public const string Name = "name-value";

// B2C
public const string B2CSuSiUserFlow = "b2c_1_susi";
public const string B2CSignUpSignInUserFlow = "b2c_1_susi";
public const string B2CEditProfileUserFlow = "b2c_1_edit_profile";
public const string B2CResetPasswordUserFlow = "b2c_1_reset";
public const string B2CTenant = "fabrikamb2c.onmicrosoft.com";
public const string B2CTenantAsGuid = "775527ff-9a37-4307-8b3d-cc311f58d925";
public const string B2CHost = "fabrikamb2c.b2clogin.com";
public const string B2CInstance = "https://fabrikamb2c.b2clogin.com";
public const string B2CInstance2 = "https://catb2c.b2clogin.com";
public const string B2CCustomDomainInstance = "https://catsAreAmazing.com";

public const string B2CAuthority = B2CInstance + "/" + B2CTenant + "/" + B2CSuSiUserFlow;
public const string B2CAuthority = B2CInstance + "/" + B2CTenant + "/" + B2CSignUpSignInUserFlow;
public const string B2CAuthorityWithV2 = B2CAuthority + "/v2.0";
public const string B2CCustomDomainAuthority = B2CCustomDomainInstance + "/" + B2CTenant + "/" + B2CSuSiUserFlow;
public const string B2CCustomDomainAuthority = B2CCustomDomainInstance + "/" + B2CTenant + "/" + B2CSignUpSignInUserFlow;
public const string B2CCustomDomainAuthorityWithV2 = B2CCustomDomainAuthority + "/v2.0";

public const string B2CIssuer = B2CInstance + "/" + B2CTenantAsGuid + "/v2.0";
Expand Down
43 changes: 10 additions & 33 deletions tests/Microsoft.Identity.Web.Test/AuthorityHelpersTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,36 +8,16 @@ namespace Microsoft.Identity.Web.Test
{
public class AuthorityHelpersTests
{
[Fact]
public void IsV2Authority_EmptyAuthority_ReturnsFalse()
[Theory]
[InlineData("", false)]
[InlineData(null, false)]
[InlineData(TestConstants.AuthorityWithTenantSpecified, false)]
[InlineData(TestConstants.AuthorityWithTenantSpecifiedWithV2, true)]
public void IsV2Authority(string authority, bool expectedResult)
{
bool result = AuthorityHelpers.IsV2Authority(string.Empty);

Assert.False(result);
}
bool result = AuthorityHelpers.IsV2Authority(authority);

[Fact]
public void IsV2Authority_NullAuthority_ReturnsFalse()
{
bool result = AuthorityHelpers.IsV2Authority(null);

Assert.False(result);
}

[Fact]
public void IsV2Authority_AuthorityEndsWithV2_ReturnsTrue()
{
bool result = AuthorityHelpers.IsV2Authority(TestConstants.AuthorityWithTenantSpecifiedWithV2);

Assert.True(result);
}

[Fact]
public void IsV2Authority_AuthorityDoesntEndWithV2_ReturnsFalse()
{
bool result = AuthorityHelpers.IsV2Authority(TestConstants.AuthorityWithTenantSpecified);

Assert.False(result);
Assert.Equal(expectedResult, result);
}

[Fact]
Expand Down Expand Up @@ -69,7 +49,7 @@ public void BuildAuthority_B2CEmptyDomain_ReturnsNull()
{
Domain = string.Empty,
Instance = TestConstants.B2CInstance,
SignUpSignInPolicyId = TestConstants.B2CSuSiUserFlow
SignUpSignInPolicyId = TestConstants.B2CSignUpSignInUserFlow
};

string result = AuthorityHelpers.BuildAuthority(options);
Expand All @@ -84,7 +64,7 @@ public void BuildAuthority_B2CValidOptions_ReturnsValidB2CAuthority()
{
Domain = TestConstants.B2CTenant,
Instance = TestConstants.B2CInstance,
SignUpSignInPolicyId = TestConstants.B2CSuSiUserFlow
SignUpSignInPolicyId = TestConstants.B2CSignUpSignInUserFlow
};
string expectedResult = $"{options.Instance}/{options.Domain}/{options.DefaultUserFlow}/v2.0";

Expand Down Expand Up @@ -127,18 +107,15 @@ public void BuildAuthority_AadValidOptions_ReturnsValidAadAuthority()
[Fact]
public void BuildAuthority_AadInstanceWithTrailingSlash_ReturnsValidAadAuthority()
{
//Arrange
MicrosoftIdentityOptions options = new MicrosoftIdentityOptions
{
TenantId = TestConstants.TenantIdAsGuid,
Instance = TestConstants.AadInstance + "/"
};
string expectedResult = $"{TestConstants.AadInstance}/{options.TenantId}/v2.0";

//Act
string result = AuthorityHelpers.BuildAuthority(options);

//Assert
Assert.NotNull(result);
Assert.Equal(expectedResult, result);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;
using Microsoft.AspNetCore.Http;
using Microsoft.Identity.Web.Test.Common;
using Microsoft.Identity.Web.Test.Common.TestHelpers;
using Microsoft.IdentityModel.Protocols.OpenIdConnect;
using NSubstitute;
using Xunit;

namespace Microsoft.Identity.Web.Test
{
public class AzureADB2COpenIDConnectEventHandlersTests
{
private const string PathBase = "/PathBase";
private const string DefaultUserFlow = TestConstants.B2CSignUpSignInUserFlow;
private const string CustomUserFlow = TestConstants.B2CResetPasswordUserFlow;
private string _defaultIssuer = $"IssuerAddress/{DefaultUserFlow}/";
private string _customIssuer = $"IssuerAddress/{CustomUserFlow}/";
private AuthenticationScheme _authScheme;

public AzureADB2COpenIDConnectEventHandlersTests()
{
_authScheme = new AuthenticationScheme(OpenIdConnectDefaults.AuthenticationScheme, OpenIdConnectDefaults.AuthenticationScheme, typeof(OpenIdConnectHandler));
}

[Fact]
public async void OnRedirectToIdentityProvider_CustomUserFlow_UpdatesContext()
{
var options = new MicrosoftIdentityOptions() { SignUpSignInPolicyId = DefaultUserFlow };
var handler = new AzureADB2COpenIDConnectEventHandlers(OpenIdConnectDefaults.AuthenticationScheme, options);
var httpContext = HttpContextUtilities.CreateHttpContext();
var authProperties = new AuthenticationProperties();
authProperties.Items.Add(OidcConstants.PolicyKey, CustomUserFlow);
var context = new RedirectContext(httpContext, _authScheme, new OpenIdConnectOptions(), authProperties) { ProtocolMessage = new OpenIdConnectMessage() { IssuerAddress = _defaultIssuer } };

await handler.OnRedirectToIdentityProvider(context);

Assert.Equal(OpenIdConnectScope.OpenIdProfile, context.ProtocolMessage.Scope);
Assert.Equal(OpenIdConnectResponseType.IdToken, context.ProtocolMessage.ResponseType);
Assert.Equal(_customIssuer, context.ProtocolMessage.IssuerAddress, true);
Assert.False(context.Properties.Items.ContainsKey(OidcConstants.PolicyKey));
}

[Fact]
public async void OnRedirectToIdentityProvider_DefaultUserFlow_DoesntUpdateContext()
{
var options = new MicrosoftIdentityOptions() { SignUpSignInPolicyId = DefaultUserFlow };
var handler = new AzureADB2COpenIDConnectEventHandlers(OpenIdConnectDefaults.AuthenticationScheme, options);
var httpContext = HttpContextUtilities.CreateHttpContext();
var authProperties = new AuthenticationProperties();
authProperties.Items.Add(OidcConstants.PolicyKey, DefaultUserFlow);
var context = new RedirectContext(httpContext, _authScheme, new OpenIdConnectOptions(), authProperties) { ProtocolMessage = new OpenIdConnectMessage() { IssuerAddress = _defaultIssuer } };

await handler.OnRedirectToIdentityProvider(context);

Assert.Null(context.ProtocolMessage.Scope);
Assert.Null(context.ProtocolMessage.ResponseType);
Assert.Equal(_defaultIssuer, context.ProtocolMessage.IssuerAddress);
Assert.True(context.Properties.Items.ContainsKey(OidcConstants.PolicyKey));
}

[Fact]
public async void OnRemoteFailure_PasswordReset_RedirectsSuccessfully()
{
var httpContext = Substitute.For<HttpContext>();
httpContext.Request.PathBase = PathBase;
var handler = new AzureADB2COpenIDConnectEventHandlers(OpenIdConnectDefaults.AuthenticationScheme, new MicrosoftIdentityOptions());

var passwordResetException = "'access_denied', error_description: 'AADB2C90118: The user has forgotten their password. Correlation ID: f99deff4-f43b-43cc-b4e7-36141dbaf0a0 Timestamp: 2018-03-05 02:49:35Z', error_uri: 'error_uri is null'";

await handler.OnRemoteFailure(new RemoteFailureContext(httpContext, _authScheme, new OpenIdConnectOptions(), new OpenIdConnectProtocolException(passwordResetException)));

httpContext.Response.Received().Redirect($"{httpContext.Request.PathBase}/MicrosoftIdentity/Account/ResetPassword/{OpenIdConnectDefaults.AuthenticationScheme}");
}

[Fact]
public async void OnRemoteFailure_Cancel_RedirectsSuccessfully()
{
var httpContext = Substitute.For<HttpContext>();
httpContext.Request.PathBase = PathBase;
var handler = new AzureADB2COpenIDConnectEventHandlers(OpenIdConnectDefaults.AuthenticationScheme, new MicrosoftIdentityOptions());

var cancelException = "'access_denied', error_description: 'AADB2C90091: The user has canceled entering self-asserted information. Correlation ID: d01c8878-0732-4eb2-beb8-da82a57432e0 Timestamp: 2018-03-05 02:56:49Z ', error_uri: 'error_uri is null'";

await handler.OnRemoteFailure(new RemoteFailureContext(httpContext, _authScheme, new OpenIdConnectOptions(), new OpenIdConnectProtocolException(cancelException)));

httpContext.Response.Received().Redirect($"{httpContext.Request.PathBase}/");

}

[Fact]
public async void OnRemoteFailure_OtherException_RedirectsSuccessfully()
{
var httpContext = Substitute.For<HttpContext>();
httpContext.Request.PathBase = PathBase;
var handler = new AzureADB2COpenIDConnectEventHandlers(OpenIdConnectDefaults.AuthenticationScheme, new MicrosoftIdentityOptions());

var otherException = "Generic exception.";

await handler.OnRemoteFailure(new RemoteFailureContext(httpContext, _authScheme, new OpenIdConnectOptions(), new OpenIdConnectProtocolException(otherException)));

httpContext.Response.Received().Redirect($"{httpContext.Request.PathBase}/MicrosoftIdentity/Account/Error");
}
}
}
Loading

0 comments on commit 824682e

Please sign in to comment.