public void Can_Delete_User()
        {
            // Arrange
            var password = "******";
            var passwordCoderMock = new Mock<IPasswordCoder>();
            passwordCoderMock.Setup(pc => pc.PasswordFormat).Returns(MembershipPasswordFormat.Clear);
            var encodedPassword = Encoding.Default.GetBytes(password);
            passwordCoderMock.Setup(pc => pc.Encode(encodedPassword))
                                            .Returns(encodedPassword);

            HousingMgmtUser user = new HousingMgmtUser("username", password, passwordCoderMock.Object) {
                Email = "*****@*****.**"
            };

            LegalPerson legalPerson = new LegalPerson("12345678902", "FER");

            user.Person = legalPerson;

            UsersNHRepository usersNHRepository = new UsersNHRepository(SessionFactory);

            // Act
            using (var session = SessionFactory.OpenSession()) {
                using (var tx = Session.BeginTransaction()) {
                    usersNHRepository.SaveOrUpdate(user);
                    tx.Commit();
                }
            }

            using (var session = SessionFactory.OpenSession()) {
                using (var tx = Session.BeginTransaction()) {
                    usersNHRepository.Delete(user);
                    tx.Commit();
                }
            }

            HousingMgmtUser fetchedUser = null;
            using (var session = SessionFactory.OpenSession()) {
                using (var tx = Session.BeginTransaction()) {
                    fetchedUser = usersNHRepository.GetById(user.Id) as HousingMgmtUser;
                    tx.Commit();
                }

            }

            // Assert
            Assert.IsTrue(fetchedUser == null, "FetchedUser isn't null.");
        }
        public void Can_Save_Person_To_DB()
        {
            // Arrange
            var password = "******";
            var passwordCoderMock = new Mock<IPasswordCoder>();
            passwordCoderMock.Setup(pc => pc.PasswordFormat).Returns(MembershipPasswordFormat.Clear);
            var encodedPassword = Encoding.Default.GetBytes(password);
            passwordCoderMock.Setup(pc => pc.Encode(encodedPassword))
                                          	.Returns(encodedPassword);

            HousingMgmtUser user = new HousingMgmtUser("username", password, passwordCoderMock.Object) {
                Email = "*****@*****.**"
            };

            LegalPerson legalPerson = new LegalPerson("12345678902", "FER");

            user.Person = legalPerson;

            UsersNHRepository usersNHRepository = new UsersNHRepository(SessionFactory);

            // Act
            using (var session = SessionFactory.OpenSession()) {
                using (var tx = Session.BeginTransaction()) {
                    usersNHRepository.SaveOrUpdate(user);
                    tx.Commit();
                }
            }

            HousingMgmtUser fetchedUser = null;
            using (var session = SessionFactory.OpenSession()) {
                using (var tx = Session.BeginTransaction()) {
                    fetchedUser = usersNHRepository.GetById(user.Id) as HousingMgmtUser;
                    tx.Commit();
                }

            }

            // Assert
            Assert.IsTrue(fetchedUser != null, "FetchedUser is null.");
            Assert.AreEqual(legalPerson, fetchedUser.Person, "Persons aren't equal.");
            Assert.AreEqual(DateTime.MinValue.ToLocalTime(), fetchedUser.LastLockoutDate, "Date and Time aren't equal.");
        }
        /// <summary>
        /// Salje emailom obavijest o registraciji
        /// </summary>
        /// <param name="user">registrirani korisnik</param>
        public void NotifyOfRegistration(HousingMgmtUser user)
        {
            var mailTo = user.Email;
            var mailSubject = "Potvrda registracije";
            StringBuilder mailBodySb = new StringBuilder();
            mailBodySb.AppendFormat("Poštovani {0},{1}", user.Person.FullName, Environment.NewLine);
            mailBodySb.AppendLine("zahvaljujemo se na registraciji.");

            string mailBody = mailBodySb.ToString();

            using (var smtpClient = new SmtpClient()) {
                using(var mailMessage = new MailMessage(MAIL_FROM, mailTo, mailSubject, null)) {
                    using(var alternateView = AlternateView.CreateAlternateViewFromString(mailBody, mailMessage.BodyEncoding, "text/html")) {
                        alternateView.TransferEncoding = TransferEncoding.SevenBit;
                        mailMessage.AlternateViews.Add(alternateView);
                        smtpClient.Send(mailMessage);
                    }
                }
            }
        }
        /// <summary>
        /// Adds a new membership user to the data source.
        /// </summary>
        /// <returns>
        /// A <see cref="T:System.Web.Security.MembershipUser"/> object populated with the information for the newly created user.
        /// </returns>
        /// <param name="username">The user name for the new user.</param>
        /// <param name="password">The password for the new user.</param>
        /// <param name="email">The e-mail address for the new user.</param>
        /// <param name="passwordQuestion">The password question for the new user.</param>
        /// <param name="passwordAnswer">The password answer for the new user</param>
        /// <param name="isApproved">Whether or not the new user is approved to be validated.</param>
        /// <param name="providerUserKey">The unique identifier from the membership data source for the user.</param>
        /// <param name="status">A <see cref="T:System.Web.Security.MembershipCreateStatus"/> enumeration value indicating whether the user was created successfully.</param>
        public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion,
			string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
        {
            // validacija lozinke
            ValidatePasswordEventArgs validatePasswordEventArgs = new ValidatePasswordEventArgs(username, password, true);
            OnValidatingPassword(validatePasswordEventArgs);

            // ako username i lozinka ne zadovoljavaju
            if(validatePasswordEventArgs.Cancel) {
                status = MembershipCreateStatus.InvalidPassword;
                return null;
            }

            // provjera da li vec postoji ista email adresa ukoliko se trazi jedinstvena email adresa
            if(RequiresUniqueEmail) {
                string existedUserName = GetUserNameByEmail(email);
                if(!string.IsNullOrEmpty(existedUserName)) {
                    status = MembershipCreateStatus.DuplicateEmail;
                    return null;
                }
            }

            // da li konfiguracija podrzava QuestionAndAnswer
            if(RequiresQuestionAndAnswer) {
                // ako da trebaju biti zadani pitanje i odgovor

                if(string.IsNullOrEmpty(passwordQuestion)) {
                    status = MembershipCreateStatus.InvalidQuestion;
                    return null;
                }

                if(string.IsNullOrEmpty(passwordAnswer)) {
                    status = MembershipCreateStatus.InvalidAnswer;
                    return null;
                }
            }

            // provjera da li vec posotji korisnik sa istim korisnickim imenom
            User existingUser = usersRepository.GetUser(username);
            if(existingUser == null) {
                HousingMgmtUser user = new HousingMgmtUser(username, password, PasswordCoder) {
                    Email = email,
                    IsApproved = isApproved
                };

                if(RequiresQuestionAndAnswer) {
                    user.ChangePasswordQuestionAndAnswer(password, passwordQuestion, passwordAnswer, PasswordCoder);
                }

                usersRepository.SaveOrUpdate(user);
                status = MembershipCreateStatus.Success;

                NHibernateMembershipUser nHibernateMembershipUser = new NHibernateMembershipUser(user);

                return nHibernateMembershipUser;
            } else {
                status = MembershipCreateStatus.DuplicateUserName;
                return null;
            }
        }
 /// <summary>
 /// Konstruktor
 /// </summary>
 /// <param name="user">korisnik</param>
 public NHibernateMembershipUser(HousingMgmtUser user)
 {
     this.user = user;
 }