public async void Test_GivenAUserWithNo2FA_WhenPasswordSignIn_ThenReturnSigninResultSuccess()
        {
            var  cognitoUser              = GetCognitoUser();
            var  authFlowResponse         = new AuthFlowResponse("sessionId", null, null, null, null);
            bool isPasswordChangeRequired = false;
            var  signinResult             = SignInResult.Success;

            userManagerMock.Setup(mock => mock.FindByIdAsync(It.IsAny <string>())).Returns(Task.FromResult(cognitoUser)).Verifiable();
            userManagerMock.Setup(mock => mock.IsPasswordChangeRequiredAsync(It.IsAny <CognitoUser>())).Returns(Task.FromResult(isPasswordChangeRequired)).Verifiable();
            userManagerMock.Setup(mock => mock.CheckPasswordAsync(It.IsAny <CognitoUser>(), It.IsAny <string>()))
            .Returns(Task.FromResult(authFlowResponse))
            .Callback(() => cognitoUser.SessionTokens = new CognitoUserSession("idToken", "accessToken", "refreshToken", DateTime.Now, DateTime.Now.AddDays(1))).Verifiable();
            userManagerMock.Setup(mock => mock.GetClaimsAsync(It.IsAny <CognitoUser>())).Returns(Task.FromResult(new List <Claim>() as IList <Claim>)).Verifiable();
            userManagerMock.Setup(mock => mock.GetRolesAsync(It.IsAny <CognitoUser>())).Returns(Task.FromResult(new List <string>() as IList <string>)).Verifiable();

            var context = MockUtils.MockContext(cognitoUser, IdentityConstants.TwoFactorUserIdScheme);

            contextAccessorMock.Setup(a => a.HttpContext).Returns(context).Verifiable();

            var output = await signinManager.PasswordSignInAsync("userId", "password", true, false).ConfigureAwait(false);

            Assert.Equal(signinResult, output);
            userManagerMock.Verify();
            contextAccessorMock.Verify();
        }
        public async void Test_GivenAUserSignedInWith2FAContext_WhenGetTwoFactorAuthenticationUser_ThenTheUserIsRetrieved()
        {
            var cognitoUser = GetCognitoUser();

            var context = MockUtils.MockContext(cognitoUser, IdentityConstants.TwoFactorUserIdScheme);

            contextAccessorMock.Setup(a => a.HttpContext).Returns(context).Verifiable();
            userManagerMock.Setup(mock => mock.FindByIdAsync(It.IsAny <string>())).Returns(Task.FromResult(cognitoUser)).Verifiable();

            var output = await signinManager.GetTwoFactorAuthenticationUserAsync().ConfigureAwait(false);

            Assert.Equal(cognitoUser, output);
            contextAccessorMock.Verify();
            userManagerMock.Verify();
        }
        public async void Test_GivenAUserWith2FA_WhenRespondToTwoFactorChallengeWithWrongCode_ThenReturnSigninResultFailed()
        {
            var cognitoUser = GetCognitoUser();
            var context     = MockUtils.MockContext(cognitoUser, IdentityConstants.TwoFactorUserIdScheme);

            contextAccessorMock.Setup(a => a.HttpContext).Returns(context).Verifiable();

            AuthFlowResponse authFlowResponse = null;

            userManagerMock.Setup(mock => mock.FindByIdAsync(It.IsAny <string>())).Returns(Task.FromResult(cognitoUser)).Verifiable();
            userManagerMock.Setup(mock => mock.RespondToTwoFactorChallengeAsync(It.IsAny <CognitoUser>(), It.IsAny <string>(), It.IsAny <ChallengeNameType>(), It.IsAny <string>()))
            .Returns(Task.FromResult(authFlowResponse)).Verifiable();

            var output = await signinManager.RespondToTwoFactorChallengeAsync("2FACODE", true, false).ConfigureAwait(false);

            Assert.Equal(SignInResult.Failed, output);
            contextAccessorMock.Verify();
            userManagerMock.Verify();
        }
        public async void Test_GivenAUserWith2FA_WhenPasswordSignIn_ThenReturnSigninResultTwoFactorRequired()
        {
            var  cognitoUser = GetCognitoUser();
            bool isPasswordChangeRequired = false;
            var  signinResult             = SignInResult.TwoFactorRequired;
            var  authFlowResponse         = new AuthFlowResponse("2FASESSIONID", null, ChallengeNameType.SMS_MFA, null, null);

            userManagerMock.Setup(mock => mock.FindByIdAsync(It.IsAny <string>())).Returns(Task.FromResult(cognitoUser));
            userManagerMock.Setup(mock => mock.CheckPasswordAsync(It.IsAny <CognitoUser>(), It.IsAny <string>())).Returns(Task.FromResult(authFlowResponse));
            userManagerMock.Setup(mock => mock.IsPasswordChangeRequiredAsync(It.IsAny <CognitoUser>())).Returns(Task.FromResult(isPasswordChangeRequired));

            var context = MockUtils.MockContext(cognitoUser, IdentityConstants.TwoFactorUserIdScheme);

            contextAccessorMock.Setup(a => a.HttpContext).Returns(context).Verifiable();

            var output = await signinManager.PasswordSignInAsync("userId", "password", true, false).ConfigureAwait(false);

            Assert.Equal(signinResult, output);
            contextAccessorMock.Verify();
        }
        public async void Test_GivenAUserWith2FA_WhenRespondToTwoFactorChallengeWithCorrectCode_ThenReturnSigninResultSuccess()
        {
            var cognitoUser = GetCognitoUser();
            var context     = MockUtils.MockContext(cognitoUser, IdentityConstants.TwoFactorUserIdScheme);

            contextAccessorMock.Setup(a => a.HttpContext).Returns(context).Verifiable();

            var authFlowResponse = new AuthFlowResponse("sessionId", null, ChallengeNameType.SMS_MFA, null, null);

            userManagerMock.Setup(mock => mock.FindByIdAsync(It.IsAny <string>())).Returns(Task.FromResult(cognitoUser)).Verifiable();
            userManagerMock.Setup(mock => mock.RespondToTwoFactorChallengeAsync(It.IsAny <CognitoUser>(), It.IsAny <string>(), It.IsAny <ChallengeNameType>(), It.IsAny <string>()))
            .Returns(Task.FromResult(authFlowResponse))
            .Callback(() => cognitoUser.SessionTokens = new CognitoUserSession("idToken", "accessToken", "refreshToken", DateTime.Now, DateTime.Now.AddDays(1))).Verifiable();
            userManagerMock.Setup(mock => mock.GetClaimsAsync(It.IsAny <CognitoUser>())).Returns(Task.FromResult(new List <Claim>() as IList <Claim>)).Verifiable();
            userManagerMock.Setup(mock => mock.GetRolesAsync(It.IsAny <CognitoUser>())).Returns(Task.FromResult(new List <string>() as IList <string>)).Verifiable();

            var output = await signinManager.RespondToTwoFactorChallengeAsync("2FACODE", true, false).ConfigureAwait(false);

            Assert.Equal(SignInResult.Success, output);
            contextAccessorMock.Verify();
            userManagerMock.Verify();
        }