public async Task AccountService_CheckPassword_Fail_NotExists()
        {
            var repositoryMock = new EntityRepositoryMock();
            var sut            = new AccountService(repositoryMock, repositoryMock);

            var result = await sut.CheckAccountPassword("*****@*****.**", "somethingelse");

            Assert.AreEqual(false, result, "CheckPassword confirmed correctness.");
        }
        public async Task AccountService_CreateAccount_GeneratesPassword()
        {
            var repositoryMock = new EntityRepositoryMock();
            var sut            = new AccountService(repositoryMock, repositoryMock);

            await sut.CreateAccount("*****@*****.**", "testpassword");

            var account        = repositoryMock.GetEntities <Account>().Single();
            var hashedPassword = new HashedPassword(account.PasswordHash, account.PasswordSalt);

            Assert.IsTrue(hashedPassword.EqualsPlainPassword("testpassword"), "Password not set correctly.");
        }
        public async Task AccountService_CreateAccount_CreatesAccount()
        {
            var repositoryMock = new EntityRepositoryMock();
            var sut            = new AccountService(repositoryMock, repositoryMock);

            await sut.CreateAccount("*****@*****.**", "testpassword");

            var accountEntities = repositoryMock.GetEntities <Account>();

            Assert.AreEqual(1, accountEntities.Count, "Unexpected number of accounts.");
            Assert.AreEqual("*****@*****.**", accountEntities.First().EmailAddress, "Unexpected email address.");
        }
        public async Task AccountService_CreateAccount_ThrowsEmailAlreadyRegisteredException()
        {
            var repositoryMock = new EntityRepositoryMock();
            var sut            = new AccountService(repositoryMock, repositoryMock);

            repositoryMock.Add(new Account
            {
                Id           = 1,
                EmailAddress = "*****@*****.**"
            });

            await sut.CreateAccount("*****@*****.**", "password");
        }
        public async Task AccountService_CreateAccount_CreatesInitialTransaction()
        {
            var repositoryMock = new EntityRepositoryMock();
            var sut            = new AccountService(repositoryMock, repositoryMock);

            await sut.CreateAccount("*****@*****.**", "testpassword");

            var account = repositoryMock.GetEntities <Account>().Single();

            Assert.AreEqual(1, account.ContextFreeTransactions.Count, "Count");

            var transaction = account.ContextFreeTransactions.Single();

            Assert.AreEqual(account.Id, transaction.AccountId, "AccountId");
            Assert.AreEqual(10000, transaction.Amount, "Amount");
        }
        public async Task AccountService_CheckPassword_Fail()
        {
            var repositoryMock = new EntityRepositoryMock();
            var sut            = new AccountService(repositoryMock, repositoryMock);

            var hashedPassword = HashedPassword.CreateFromPlainPassword("testpassword");

            repositoryMock.Add(new Account
            {
                Id           = 1,
                EmailAddress = "*****@*****.**",
                PasswordHash = hashedPassword.Hash,
                PasswordSalt = hashedPassword.Salt
            });

            var result = await sut.CheckAccountPassword("*****@*****.**", "somethingelse");

            Assert.AreEqual(false, result, "CheckPassword confirmed correctness.");
        }
        public async Task AccountService_ChangePassword_ChangesPassword()
        {
            var repositoryMock = new EntityRepositoryMock();
            var sut            = new AccountService(repositoryMock, repositoryMock);

            repositoryMock.Add(new Account
            {
                Id           = 1,
                EmailAddress = "*****@*****.**"
            });

            await sut.ChangePassword(1, "testpassword");

            var account        = repositoryMock.GetEntities <Account>().Single();
            var hashedPassword = new HashedPassword(account.PasswordHash, account.PasswordSalt);

            Assert.IsNotNull(account.PasswordHash, "account.PasswordHash");
            Assert.IsNotNull(account.PasswordSalt, "account.PasswordSalt");
            Assert.IsTrue(hashedPassword.EqualsPlainPassword("testpassword"), "Password not set correctly.");
        }