public async Task OnPostAsync_GivenCommandSucceedsWithReturnUrl_ExpectUserToBeAuthenticatedAndRedirectedToUrl()
        {
            var mediator = new Mock <IMediator>();

            mediator
            .Setup(x => x.Send(
                       It.IsAny <ValidateAppMfaCodeAgainstCurrentUserCommand>(),
                       It.IsAny <CancellationToken>())).ReturnsAsync(() =>
                                                                     Result.Ok <ValidateAppMfaCodeAgainstCurrentUserCommandResult, ErrorData>(
                                                                         new ValidateAppMfaCodeAgainstCurrentUserCommandResult(TestVariables.UserId)));

            var authenticationService = new Mock <IAuthenticationService>();

            authenticationService.Setup(x => x.SignInUserFromPartialStateAsync(It.IsAny <Guid>()))
            .ReturnsAsync("/some-page");

            var currentAuthenticatedUserProvider = new Mock <ICurrentAuthenticatedUserProvider>();

            var page = new ValidateAppMfaCode(mediator.Object, authenticationService.Object,
                                              currentAuthenticatedUserProvider.Object)
            {
                PageModel = new ValidateAppMfaCode.Model()
            };

            Assert.IsType <LocalRedirectResult>(await page.OnPostAsync());
        }
        OnPostAsync_GivenCommandSucceedsWithNoReturnUrl_ExpectUserToBeAuthenticatedAndRedirectedToDashboard()
        {
            var mediator = new Mock <IMediator>();

            mediator
            .Setup(x => x.Send(
                       It.IsAny <ValidateAppMfaCodeAgainstCurrentUserCommand>(),
                       It.IsAny <CancellationToken>())).ReturnsAsync(() =>
                                                                     Result.Ok <ValidateAppMfaCodeAgainstCurrentUserCommandResult, ErrorData>(
                                                                         new ValidateAppMfaCodeAgainstCurrentUserCommandResult(TestVariables.UserId)));

            var authenticationService = new Mock <IAuthenticationService>();

            authenticationService.Setup(x => x.SignInUserFromPartialStateAsync(It.IsAny <Guid>()))
            .ReturnsAsync(string.Empty);

            var currentAuthenticatedUserProvider = new Mock <ICurrentAuthenticatedUserProvider>();

            var page = new ValidateAppMfaCode(mediator.Object, authenticationService.Object,
                                              currentAuthenticatedUserProvider.Object)
            {
                PageModel = new ValidateAppMfaCode.Model()
            };

            var result = Assert.IsType <RedirectToPageResult>(await page.OnPostAsync());

            Assert.Equal(PageLocations.AppDashboard, result.PageName);
        }
        public async Task OnPostAsync_GivenInvalidModelState_ExpectRedirectToPageResult()
        {
            var mediator = new Mock <IMediator>();
            var authenticationService            = new Mock <IAuthenticationService>();
            var currentAuthenticatedUserProvider = new Mock <ICurrentAuthenticatedUserProvider>();
            var page = new ValidateAppMfaCode(mediator.Object, authenticationService.Object,
                                              currentAuthenticatedUserProvider.Object);

            page.ModelState.AddModelError("Error", "Error");

            var result = await page.OnPostAsync();

            Assert.IsType <RedirectToPageResult>(result);
        }
        public void OnGet_GivenNoUserIsAuthenticated_ExpectNoMfaTypesSet()
        {
            var mediator = new Mock <IMediator>();
            var authenticationService            = new Mock <IAuthenticationService>();
            var currentAuthenticatedUserProvider = new Mock <ICurrentAuthenticatedUserProvider>();

            currentAuthenticatedUserProvider.Setup(x => x.CurrentAuthenticatedUser).Returns(Maybe <ISystemUser> .Nothing);

            var page = new ValidateAppMfaCode(mediator.Object, authenticationService.Object,
                                              currentAuthenticatedUserProvider.Object);

            page.OnGet();

            Assert.False(page.HasDevice);
        }
        public async Task OnPostEmailMfaAsync_GivenCommandFails_ExpectPrgErrorStateAndRedirectToSamePage()
        {
            var mediator = new Mock <IMediator>();

            mediator.Setup(x => x.Send(It.IsAny <EmailMfaRequestedCommand>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(ResultWithError.Fail(new ErrorData(ErrorCodes.AuthenticationFailed)));

            var authenticationService            = new Mock <IAuthenticationService>();
            var currentAuthenticatedUserProvider = new Mock <ICurrentAuthenticatedUserProvider>();
            var page = new ValidateAppMfaCode(mediator.Object, authenticationService.Object,
                                              currentAuthenticatedUserProvider.Object);

            Assert.IsType <RedirectToPageResult>(await page.OnPostEmailMfaAsync());
            Assert.Equal(PrgState.Failed, page.PrgState);
        }
        public async Task OnPostEmailMfaAsync_GivenCommandSucceeds_ExpectRedirectAppMfaPage()
        {
            var mediator = new Mock <IMediator>();

            mediator.Setup(x => x.Send(It.IsAny <EmailMfaRequestedCommand>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(ResultWithError.Ok <ErrorData>());

            var authenticationService            = new Mock <IAuthenticationService>();
            var currentAuthenticatedUserProvider = new Mock <ICurrentAuthenticatedUserProvider>();
            var page = new ValidateAppMfaCode(mediator.Object, authenticationService.Object,
                                              currentAuthenticatedUserProvider.Object);

            var result = Assert.IsType <RedirectToPageResult>(await page.OnPostEmailMfaAsync());

            Assert.Equal(PageLocations.AuthEmailMfa, result.PageName);
        }
        public void OnGet_GivenUserIsAuthenticated_ExpectMfaTypesToBeSet()
        {
            var mediator = new Mock <IMediator>();
            var authenticationService            = new Mock <IAuthenticationService>();
            var currentAuthenticatedUserProvider = new Mock <ICurrentAuthenticatedUserProvider>();

            currentAuthenticatedUserProvider.Setup(x => x.CurrentAuthenticatedUser)
            .Returns(Maybe.From(
                         new UnauthenticatedUser(
                             TestVariables.UserId, MfaProvider.App | MfaProvider.Device) as ISystemUser));

            var page = new ValidateAppMfaCode(mediator.Object, authenticationService.Object,
                                              currentAuthenticatedUserProvider.Object);

            page.OnGet();

            Assert.True(page.HasDevice);
        }
        public async Task OnPostDeviceMfaAsync_GivenCommandSucceeds_ExpectRedirectDeviceMfaPage()
        {
            var mediator = new Mock <IMediator>();

            mediator.Setup(x => x.Send(It.IsAny <DeviceMfaRequestCommand>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(
                Result.Ok <DeviceMfaRequestCommandResult, ErrorData>(
                    new DeviceMfaRequestCommandResult(new AssertionOptions())));

            var authenticationService            = new Mock <IAuthenticationService>();
            var currentAuthenticatedUserProvider = new Mock <ICurrentAuthenticatedUserProvider>();
            var page = new ValidateAppMfaCode(mediator.Object, authenticationService.Object,
                                              currentAuthenticatedUserProvider.Object)
            {
                TempData = new Mock <ITempDataDictionary>().Object,
            };

            var result = Assert.IsType <RedirectToPageResult>(await page.OnPostDeviceMfaAsync());

            Assert.Equal(PageLocations.AuthDeviceMfa, result.PageName);
        }
        public async Task OnPostAsync_GivenCommandFails_ExpectRedirectToPageResultToSamePageAndPrgStateSet()
        {
            var mediator = new Mock <IMediator>();

            mediator
            .Setup(x => x.Send(
                       It.IsAny <ValidateAppMfaCodeAgainstCurrentUserCommand>(),
                       It.IsAny <CancellationToken>())).ReturnsAsync(() =>
                                                                     Result.Fail <ValidateAppMfaCodeAgainstCurrentUserCommandResult, ErrorData>(
                                                                         new ErrorData(ErrorCodes.SavingChanges)));
            var authenticationService            = new Mock <IAuthenticationService>();
            var currentAuthenticatedUserProvider = new Mock <ICurrentAuthenticatedUserProvider>();

            var page = new ValidateAppMfaCode(mediator.Object, authenticationService.Object,
                                              currentAuthenticatedUserProvider.Object)
            {
                PageModel = new ValidateAppMfaCode.Model()
            };

            var result = await page.OnPostAsync();

            Assert.IsType <RedirectToPageResult>(result);
            Assert.Equal(PrgState.Failed, page.PrgState);
        }