public async Task <ActionResult> ValidateEmail(string id, string t)
        {
            if (id == null || t == null)
            {
                Log.Warn(LogTag.EmailValidationMissingParams, Request, new { aspNetUserId = id, encodedToken = t });
                return(View(new EmailConfirmationViewModel()));
            }
            using (_db)
            {
                //Andriy: decodedExtendedToken has format "token:email"
                string decodedExtendedToken = EmailConfirmationHelper.TokenDecode(t);

                string[]   compositeToken = decodedExtendedToken.Split(':');
                AspNetUser aspNetUser     = await UserManager.FindByIdAsync(id);

                if (!compositeToken[1].Equals(aspNetUser.Email, StringComparison.InvariantCulture))
                {
                    Log.Warn(LogTag.EmailValidationWrongEmail, Request, new { aspNetUserId = id, decodedToken = compositeToken[0], email = compositeToken[1] });
                    return(View(new EmailConfirmationViewModel()));
                }
                if (aspNetUser.EmailConfirmed)
                {
                    Log.Warn(LogTag.EmailValidationIsAlreadyDone, Request, new { aspNetUserId = id, encodedToken = t });
                    await SignInManager.SignInAsync(aspNetUser, false, false);

                    return(View(new EmailConfirmationViewModel {
                        isSuccess = true
                    }));
                }
                string securityToken = compositeToken[0];
                var    result        = await UserManager.ConfirmEmailAsync(id, securityToken);

                if (result.Succeeded)
                {
                    User user = await _db.Users.FindAsync(aspNetUser.Users.FirstOrDefault()?.Id);

                    user.StatusId = UserStatuses.Valid;
                    try
                    {
                        await _db.SaveChangesAsync();
                    }
                    catch (Exception ex)
                    {
                        Log.Error(LogTag.SaveUserEmailConfirmedStatusError, ex, new { UserId = user.Id });
                        return(View(new EmailConfirmationViewModel()));
                    }
                    // Sign anyone out and sign the new user in
                    await SignInManager.SignInAsync(aspNetUser, false, false);

                    return(View(new EmailConfirmationViewModel {
                        isSuccess = true
                    }));
                }
                Log.Error(LogTag.EmailValidationFailed, Request, new { userId = id, errors = string.Join(";", result?.Errors), tokenFromEmail = t, decodedToken = decodedExtendedToken });
                return(View(new EmailConfirmationViewModel()));
            }
        }
        public async Task ConfirmationEmailStatusUpdateFailedTest()
        {
            string aspNetUserId  = "123";
            int    userId        = 5;
            string token         = "token";
            string email         = "*****@*****.**";
            string composedToken = $"{token}:{email}";
            string encodedToken  = EmailConfirmationHelper.TokenEncode(composedToken);
            string decodedToken  = EmailConfirmationHelper.TokenDecode(encodedToken);

            List <User> userData = new List <User>()
            {
                new User()
                {
                    Id = userId, StatusId = UserStatuses.PendingEmailValidation
                }
            };
            AspNetUser aspNetUser = new AspNetUser()
            {
                Id = aspNetUserId, Email = email, Users = new List <User>()
                {
                    new User()
                    {
                        Id = userId
                    }
                }
            };

            var entitiesMock = GetEntitiesMockForEmailValidationTests(userData);

            entitiesMock.Setup(e => e.SaveChangesAsync())
            .Callback(() => { userData.FirstOrDefault().StatusId = UserStatuses.PendingEmailValidation; })
            .Throws(new Exception("Saving is failed."));
            var userManagerMock   = GetApplicationUserManagerMock(new Mock <IUserStore <AspNetUser, string> >());
            var signInManagerMock = GetSignInManagerMock(userManagerMock, GetAuthenticationManagerMock());

            userManagerMock.Setup(m => m.FindByIdAsync(It.Is <string>((id) => id == aspNetUserId))).ReturnsAsync(aspNetUser);
            userManagerMock.Setup(m => m.ConfirmEmailAsync(It.Is <string>((id) => id == aspNetUserId), It.Is <string>((t) => t == token)))
            .ReturnsAsync(new IdentityResult());

            AccountController controller = new AccountController(entitiesMock.Object, userManagerMock.Object, signInManagerMock.Object, new Mock <IEmailSender>().Object);

            controller.ControllerContext = GetDefaultAccountControllerRequest(controller);

            //Act
            ActionResult result = await controller.ValidateEmail(aspNetUserId, encodedToken);

            //Assert
            ViewResult viewResult = (ViewResult)result;

            Assert.AreEqual(composedToken, decodedToken);
            Assert.AreEqual("", viewResult.ViewName);
            Assert.AreEqual(userData.FirstOrDefault()?.StatusId, UserStatuses.PendingEmailValidation);
        }
        public async Task ConfirmationEmailTest()
        {
            string aspNetUserId  = "123";
            int    userId        = 5;
            string token         = "token";
            string email         = "*****@*****.**";
            string composedToken = $"{token}:{email}";
            string encodedToken  = EmailConfirmationHelper.TokenEncode(composedToken);
            string decodedToken  = EmailConfirmationHelper.TokenDecode(encodedToken);

            List <User> usertData = new List <User>()
            {
                new User()
                {
                    Id = userId, StatusId = UserStatuses.PendingEmailValidation
                }
            };
            AspNetUser aspNetUser = new AspNetUser()
            {
                Id = aspNetUserId, Email = email, Users = new List <User>()
                {
                    new User()
                    {
                        Id = userId
                    }
                }
            };

            var entitiesMock      = GetEntitiesMock();
            var userManagerMock   = GetApplicationUserManagerMock(new Mock <IUserStore <AspNetUser, string> >());
            var signInManagerMock = GetSignInManagerMock(userManagerMock, GetAuthenticationManagerMock());
            var usersDbSetMock    = GetUsersDbSetMock(usertData);

            usersDbSetMock.Setup(u => u.FindAsync(It.Is <int>((id) => id == userId))).ReturnsAsync(usertData [0]);
            entitiesMock.Setup(e => e.Users).Returns(usersDbSetMock.Object);
            entitiesMock.Setup(e => e.SaveChangesAsync()).ReturnsAsync(0).Verifiable();
            userManagerMock.Setup(m => m.FindByIdAsync(It.Is <string>((id) => id == aspNetUserId))).ReturnsAsync(aspNetUser);
            userManagerMock.Setup(m => m.ConfirmEmailAsync(It.Is <string>((id) => id == aspNetUserId), It.Is <string>((t) => t == token)))
            .ReturnsAsync(IdentityResult.Success);

            //Act

            AccountController controller = new AccountController(entitiesMock.Object, userManagerMock.Object, signInManagerMock.Object, new Mock <IEmailSender>().Object);
            ActionResult      result     = await controller.ValidateEmail(aspNetUserId, encodedToken);

            //Assert
            ViewResult viewResult = (ViewResult)result;

            Assert.AreEqual(composedToken, decodedToken);
            Assert.AreEqual((( EmailConfirmationViewModel )viewResult.Model).isSuccess, true);
            Assert.AreEqual(usertData.FirstOrDefault()?.StatusId, UserStatuses.Valid);
            entitiesMock.Verify();
        }
        public async Task ConfirmationEmailWrongUserEmailFailedTest()
        {
            string aspNetUserId  = "123";
            int    userId        = 5;
            string token         = "token";
            string email         = "*****@*****.**";
            string newEmail      = "*****@*****.**";
            string composedToken = $"{token}:{email}";
            string encodedToken  = EmailConfirmationHelper.TokenEncode(composedToken);
            string decodedToken  = EmailConfirmationHelper.TokenDecode(encodedToken);

            List <User> userData = new List <User>()
            {
                new User()
                {
                    Id = userId, StatusId = UserStatuses.PendingEmailValidation
                }
            };
            AspNetUser aspNetUser = new AspNetUser()
            {
                Id = aspNetUserId, Email = newEmail, Users = new List <User>()
                {
                    new User()
                    {
                        Id = userId
                    }
                }
            };

            var entitiesMock      = GetEntitiesMockForEmailValidationTests(userData);
            var userManagerMock   = GetApplicationUserManagerMock(new Mock <IUserStore <AspNetUser, string> >());
            var signInManagerMock = GetSignInManagerMock(userManagerMock, GetAuthenticationManagerMock());

            userManagerMock.Setup(m => m.FindByIdAsync(It.Is <string>((id) => id == aspNetUserId))).ReturnsAsync(aspNetUser);
            userManagerMock.Setup(m => m.ConfirmEmailAsync(It.Is <string>((id) => id == aspNetUserId), It.Is <string>((t) => t == decodedToken)))
            .ReturnsAsync(new IdentityResult());

            AccountController controller = new AccountController(entitiesMock.Object, userManagerMock.Object, signInManagerMock.Object, new Mock <IEmailSender>().Object);

            controller.ControllerContext = GetDefaultAccountControllerRequest(controller);

            //Act
            ActionResult result = await controller.ValidateEmail(aspNetUserId, encodedToken);

            //Assert
            ViewResult viewResult = (ViewResult)result;

            Assert.AreEqual(composedToken, decodedToken);
            Assert.AreEqual((( EmailConfirmationViewModel )viewResult.Model).isSuccess, false);
            Assert.AreEqual(userData.FirstOrDefault()?.StatusId, UserStatuses.PendingEmailValidation);
            userManagerMock.Verify(m => m.ConfirmEmailAsync(It.Is <string>((id) => id == aspNetUserId), It.Is <string>((t) => t == token)), Times.Never);
        }