public void RegisterUser(RegistrationInfo registrationInfo)
        {
            Assert.ArgumentNotNull(registrationInfo, nameof(registrationInfo));
              Assert.ArgumentNotNullOrEmpty(registrationInfo.Email, "registrationInfo.Email");
              Assert.ArgumentNotNullOrEmpty(registrationInfo.Password, "registrationInfo.Password");
              Assert.ArgumentNotNullOrEmpty(registrationInfo.ConfirmPassword, "registrationInfo.ConfirmPassword");

              var fullName = Context.Domain.GetFullName(registrationInfo.Email);
              Assert.IsNotNullOrEmpty(fullName, "Can't retrieve full userName");

              var user = User.Create(fullName, registrationInfo.Password);
              user.Profile.Email = registrationInfo.Email;
              user.Profile.Save();

              AuthenticationManager.Login(user);
        }
        public void RegisterShouldReturnModelIfItsNotValid(RegistrationInfo registrationInfo, [Frozen] IAccountRepository repo, [NoAutoProperties] AccountsController controller)
        {
            controller.ModelState.AddModelError("Error", "Error");

              var result = controller.Register(registrationInfo);
              result.Should().BeOfType<ViewResult>().Which.Model.Should().Be(registrationInfo);
        }
        public void RegisterShouldReturnErrorIfRegistrationThrowsMembershipException(RegistrationInfo registrationInfo, MembershipCreateUserException exception, [Frozen] IAccountRepository repo, [Frozen] INotificationService notifyService)
        {
            repo.When(x => x.RegisterUser(Arg.Any<RegistrationInfo>())).Do(x => { throw new MembershipCreateUserException(); });
              var controller = new AccountsController(repo, notifyService);

              var result = controller.Register(registrationInfo);
              result.Should().BeOfType<ViewResult>().Which.Model.Should().Be(registrationInfo);
              result.Should().BeOfType<ViewResult>().Which.ViewData.ModelState.Should().ContainKey(nameof(registrationInfo.Email))
            .WhichValue.Errors.Should().Contain(x => x.ErrorMessage == exception.Message);
        }
        public void RegisterShouldRedirectToHomePageIfUserLoggedIn(Database db, [Content] DbItem item, RegistrationInfo registrationInfo, [Frozen] IAccountRepository repo, [NoAutoProperties] AccountsController controller)
        {
            var fakeSite = new FakeSiteContext(new StringDictionary
              {
            {
              "rootPath", "/sitecore/content"
            },
            {
              "startItem", item.Name
            }
              }) as SiteContext;
              fakeSite.Database = db;
              Language.Current = Language.Invariant;

              using (new SiteContextSwitcher(fakeSite))
              {
            using (new UserSwitcher(@"extranet\John", true))
            {
              var result = controller.Register(registrationInfo);
              result.Should().BeOfType<RedirectResult>().Which.Url.Should().Be("/");
            }
              }
        }
        public void RegisterShouldCallRegisterUserAndRedirectToHomePage(Database db, [Content] DbItem item, RegistrationInfo registrationInfo, [Frozen] IAccountRepository repo, [Frozen] INotificationService notifyService)
        {
            repo.Exists(Arg.Any<string>()).Returns(false);
              var controller = new AccountsController(repo, notifyService);

              var fakeSite = new FakeSiteContext(new StringDictionary
              {
            {
              "rootPath", "/sitecore/content"
            },
            {
              "startItem", item.Name
            }
              }) as SiteContext;
              fakeSite.Database = db;
              Language.Current = Language.Invariant;

              using (new SiteContextSwitcher(fakeSite))
              {
            var result = controller.Register(registrationInfo);
            result.Should().BeOfType<RedirectResult>().Which.Url.Should().Be("/");

            repo.Received(1).RegisterUser(registrationInfo);
              }
        }
        public void RegisterShouldReturnModelWithErrorIfSameUserExists(Database db, [Content] DbItem item, RegistrationInfo registrationInfo, [Frozen] IAccountRepository repo, [NoAutoProperties] AccountsController controller)
        {
            var fakeSite = new FakeSiteContext(new StringDictionary
              {
            {
              "rootPath", "/sitecore/content"
            },
            {
              "startItem", item.Name
            }
              }) as SiteContext;
              fakeSite.Database = db;
              Language.Current = Language.Invariant;

              using (new SiteContextSwitcher(fakeSite))
              using (new UserSwitcher($@"extranet\{registrationInfo.Email}", false))
              {
            var result = controller.Register(registrationInfo);
            result.Should().BeOfType<ViewResult>().Which.Model.Should().Be(registrationInfo);
            result.Should().BeOfType<ViewResult>().Which.ViewData.ModelState.Should().ContainKey(nameof(registrationInfo.Email))
              .WhichValue.Errors.Should().Contain(x => x.ErrorMessage == Errors.UserAlreadyExists);
              }
        }
        public void RegisterShouldReturnModelIfItsNotValid(Database db, [Content] DbItem item, RegistrationInfo registrationInfo, [Frozen] IAccountRepository repo, [NoAutoProperties] AccountsController controller)
        {
            var fakeSite = new FakeSiteContext(new StringDictionary
              {
            {
              "displayMode", "normal"
            }
              }) as SiteContext;
              using (new SiteContextSwitcher(fakeSite))
              {
            controller.ModelState.AddModelError("Error", "Error");

            var result = controller.Register(registrationInfo);
            result.Should().BeOfType<ViewResult>().Which.Model.Should().Be(registrationInfo);
              }
        }
        public void RegisterShouldCallRegisterUserAndRedirectToHomePage(Database db, [Content] DbItem item, Item profileItem, RegistrationInfo registrationInfo, [Frozen] IAccountRepository repo, [Frozen] INotificationService notifyService, [Frozen] IAccountsSettingsService accountsSettingsService, [Frozen] IUserProfileService userProfileService)
        {
            accountsSettingsService.GetPageLinkOrDefault(Arg.Any<Item>(), Arg.Any<ID>(), Arg.Any<Item>()).Returns("/redirect");
              repo.Exists(Arg.Any<string>()).Returns(false);
              userProfileService.GetUserDefaultProfileId().Returns(profileItem.ID.ToString());

              var controller = new AccountsController(repo, notifyService, accountsSettingsService, userProfileService);

              var fakeSite = new FakeSiteContext(new StringDictionary
              {
            {
              "rootPath", "/sitecore/content"
            },
            {
              "startItem", item.Name
            }
              }) as SiteContext;
              fakeSite.Database = db;
              Language.Current = Language.Invariant;

              using (new SiteContextSwitcher(fakeSite))
              {
            var result = controller.Register(registrationInfo);
            result.Should().BeOfType<RedirectResult>().Which.Url.Should().Be("/redirect");

            repo.Received(1).RegisterUser(registrationInfo.Email, registrationInfo.Password, Arg.Any<string>());
              }
        }
        public void RegisterShouldCreateUserWithEmailAndPassword(FakeMembershipUser user, MembershipProvider membershipProvider, RegistrationInfo registrationInfo, string userProfile, AccountRepository repository)
        {
            user.ProviderName.Returns("fake");
              user.UserName.Returns("name");
              MembershipCreateStatus status;
              membershipProvider.CreateUser(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>(), Arg.Any<bool>(), Arg.Any<object>(), out status).Returns(user);
              membershipProvider.GetUser(Arg.Any<string>(), Arg.Any<bool>()).Returns(user);

              using (new Switcher<Domain, Domain>(new Domain("somedomain")))
              {
            using (new MembershipSwitcher(membershipProvider))
            {
              repository.RegisterUser(registrationInfo.Email,registrationInfo.Password, userProfile);
              membershipProvider.Received(1).CreateUser($@"somedomain\{registrationInfo.Email}", registrationInfo.Password, Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>(), Arg.Any<bool>(), Arg.Any<object>(), out status);
            }
              }
        }
        public void RegisterShouldTrackLoginAndRegisterEvents(FakeMembershipUser user, [Substitute]MembershipProvider membershipProvider, [Substitute]AuthenticationProvider authenticationProvider, RegistrationInfo registrationInfo, [Frozen]IAccountTrackerService accountTrackerService, AccountRepository repository, string profileId)
        {
            user.UserName.Returns("name");
              MembershipCreateStatus status;
              membershipProvider.CreateUser(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>(), Arg.Any<bool>(), Arg.Any<object>(), out status).Returns(user);
              membershipProvider.GetUser(Arg.Any<string>(), Arg.Any<bool>()).Returns(user);

              using (new Switcher<Domain, Domain>(new Domain("somedomain")))
              {
            using (new MembershipSwitcher(membershipProvider))
            {
              using (new AuthenticationSwitcher(authenticationProvider))
              {
            repository.RegisterUser(registrationInfo.Email, registrationInfo.Password, profileId);
            accountTrackerService.Received(1).TrackLogin();
            accountTrackerService.Received(1).TrackRegister();
              }
            }
              }
        }
        public void RegisterShouldCreateLoginUser(FakeMembershipUser user, [Substitute] MembershipProvider membershipProvider, [Substitute] AuthenticationProvider authenticationProvider, RegistrationInfo registrationInfo, AccountRepository repository, string profileId)
        {
            user.ProviderName.Returns("fake");
              user.UserName.Returns("name");
              MembershipCreateStatus status;
              membershipProvider.CreateUser(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>(), Arg.Any<bool>(), Arg.Any<object>(), out status).Returns(user);
              membershipProvider.GetUser(Arg.Any<string>(), Arg.Any<bool>()).Returns(user);

              using (new Switcher<Domain, Domain>(new Domain("somedomain")))
              {
            using (new MembershipSwitcher(membershipProvider))
            {
              using (new AuthenticationSwitcher(authenticationProvider))
              {
            repository.RegisterUser(registrationInfo.Email, registrationInfo.Password, profileId);
            authenticationProvider.Received(1).Login(Arg.Is<User>(u => u.Name == $@"somedomain\{registrationInfo.Email}"));
              }
            }
              }
        }
 public void LogoutShouldLogoutUser(User user, MembershipProvider membershipProvider, RegistrationInfo registrationInfo, AccountRepository repository)
 {
     var authenticationProvider = Substitute.For<AuthenticationProvider>();
       authenticationProvider.GetActiveUser().Returns(user);
       using (new AuthenticationSwitcher(authenticationProvider))
       {
       repository.Logout();
       authenticationProvider.Received(1).Logout();
       }
 }
 public void RegisterShouldThrowArgumentException(RegistrationInfo registrationInfo)
 {
     var repository = new AccountRepository();
       repository.Invoking(x => x.RegisterUser(registrationInfo)).ShouldThrow<ArgumentNullException>();
 }
 public void RegisterShouldReturnModelWithErrorIfSameUserExists(RegistrationInfo registrationInfo, [Frozen] IAccountRepository repo, [NoAutoProperties] AccountsController controller)
 {
     using (new UserSwitcher($@"extranet\{registrationInfo.Email}", false))
       {
     var result = controller.Register(registrationInfo);
     result.Should().BeOfType<ViewResult>().Which.Model.Should().Be(registrationInfo);
     result.Should().BeOfType<ViewResult>().Which.ViewData.ModelState.Should().ContainKey(nameof(registrationInfo.Email))
       .WhichValue.Errors.Should().Contain(x => x.ErrorMessage == Errors.UserAlreadyExists);
       }
 }
        public void RegisterShouldReturnErrorIfRegistrationThrowsMembershipException(Database db, [Content] DbItem item, Item profileItem, RegistrationInfo registrationInfo, MembershipCreateUserException exception, [Frozen] IAccountRepository repo, [Frozen] INotificationService notifyService, [Frozen] IAccountsSettingsService accountsSettingsService, [Frozen] IUserProfileService userProfileService)
        {
            repo.When(x => x.RegisterUser(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>())).Do(x => { throw new MembershipCreateUserException(); });
              userProfileService.GetUserDefaultProfileId().Returns(profileItem.ID.ToString());

              var controller = new AccountsController(repo, notifyService, accountsSettingsService, userProfileService);

              var fakeSite = new FakeSiteContext(new StringDictionary
              {
            {
              "rootPath", "/sitecore/content"
            },
            {
              "startItem", item.Name
            }
              }) as SiteContext;
              fakeSite.Database = db;
              Language.Current = Language.Invariant;

              using (new SiteContextSwitcher(fakeSite))
              {
            var result = controller.Register(registrationInfo);
            result.Should().BeOfType<ViewResult>().Which.Model.Should().Be(registrationInfo);
            result.Should().BeOfType<ViewResult>().Which.ViewData.ModelState.Should().ContainKey(nameof(registrationInfo.Email))
              .WhichValue.Errors.Should().Contain(x => x.ErrorMessage == exception.Message);
              }
        }
        public ActionResult Register(RegistrationInfo registrationInfo)
        {
            var redirect = this.RedirectAuthenticatedUser();
              if (redirect != null)
              {
            return redirect;
              }

              if (!this.ModelState.IsValid)
              {
            return this.View(registrationInfo);
              }

              if (this.accountRepository.Exists(registrationInfo.Email))
              {
            this.ModelState.AddModelError(nameof(registrationInfo.Email), Errors.UserAlreadyExists);

            return this.View(registrationInfo);
              }

              try
              {
            this.accountRepository.RegisterUser(registrationInfo);
            var link = this.accountsSettingsService.GetPageLinkOrDefault(Context.Item, Templates.AccountsSettings.Fields.AfterLoginPage, Context.Site.GetRootItem());
            return this.Redirect(link);
              }
              catch (MembershipCreateUserException ex)
              {
            Log.Error($"Can't create user with {registrationInfo.Email}", ex, this);
            this.ModelState.AddModelError(nameof(registrationInfo.Email), ex.Message);

            return this.View(registrationInfo);
              }
        }
        public ActionResult Register(RegistrationInfo registrationInfo)
        {
            if (!Context.IsLoggedIn)
              {
            if (!this.ModelState.IsValid)
            {
              return this.View(registrationInfo);
            }

            if (this.accountRepository.Exists(registrationInfo.Email))
            {
              this.ModelState.AddModelError(nameof(registrationInfo.Email), Errors.UserAlreadyExists);

              return this.View(registrationInfo);
            }

            try
            {
              this.accountRepository.RegisterUser(registrationInfo);
            }
            catch (MembershipCreateUserException ex)
            {
              Log.Error($"Can't create user with {registrationInfo.Email}", ex, this);
              this.ModelState.AddModelError(nameof(registrationInfo.Email), ex.Message);

              return this.View(registrationInfo);
            }
              }

              return this.Redirect(Context.Site.GetRoot().Url());
        }