public void Should_Process_Failed_Attempt()
        {
            var dataUser = new User
            {
                CreationDate = new DateTime(2000, 01, 20),
                Email = "*****@*****.**",
                FirstName = "Jack",
                LastName = "Hoffman",
                UserId = "551581bf90eb291bd0e97fb2",
                LastLogin = new DateTime(2012, 10, 31)
            };

            MockRetrievableUserById
                .Setup(x => x.Retrieve(It.IsAny<ByUserId>()))
                .Returns(dataUser);

            MockRetrievableUserByEmail
                .Setup(x => x.Retrieve(It.IsAny<ByUserEmail>()))
                .Returns(dataUser);

            MockRetrievableAuthyId
                .Setup(x => x.RetrieveAll(It.IsAny<ByEncodedUserId>()))
                .Returns(new List<UserAuthentication>
                {
                    new UserAuthentication
                    {
                        AccountActive = true,
                        AccountType = AccountType.ActualAccount,
                        EncodedPassword = "******",
                        EncodedUserId = "Yvf08ew7hUptyomgslYIYhQmJ+jhUM/nrgQtbJgnW50=",
                        EncryptionKey = "ApplePear",
                        FailedLoginAttemptCount = 0
                    },
                    new UserAuthentication
                    {
                        AccountActive = true,
                        AccountType = AccountType.Trap1Account,
                        EncodedPassword = "******",
                        EncodedUserId = "Yvf08ew7hUptyomgslYIYhQmJ+jhUM/nrgQtbJgnW50=",
                        EncryptionKey = "PearBanana",
                        FailedLoginAttemptCount = 0
                    },
                    new UserAuthentication
                    {
                        AccountActive = true,
                        AccountType = AccountType.Trap2Account,
                        EncodedPassword = "******",
                        EncodedUserId = "Yvf08ew7hUptyomgslYIYhQmJ+jhUM/nrgQtbJgnW50=",
                        EncryptionKey = "BananaGrape",
                        FailedLoginAttemptCount = 0
                    },
                    new UserAuthentication
                    {
                        AccountActive = true,
                        AccountType = AccountType.Trap3Account,
                        EncodedPassword = "******",
                        EncodedUserId = "Yvf08ew7hUptyomgslYIYhQmJ+jhUM/nrgQtbJgnW50=",
                        EncryptionKey = "GrapeApple",
                        FailedLoginAttemptCount = 0
                    }
                });

            //arrange
            MockSystemTime
                .Setup(x => x.Current())
                .Returns(new DateTime(2015, 12, 2, 0, 0, 0, DateTimeKind.Utc));

            var input = new Credentials
            {
                Email = "*****@*****.**",
                Password = "******"
            };

            UserAccount actual;

            //act
            actual = Subject.RetrieveAccount(input);

            //assert
            MockUpdatableAuth.Verify(x=>x.Update(It.Is<UserAuthentication>(i=> i.FailedLoginAttemptCount == 1)), Times.Exactly(4));
            MockUpdatableAuth.Verify(x=>x.Save(),Times.Once);
        }
        public void Should_Return_Account()
        {
            //Data Layer Arrange
            var dataUser = new User
            {
                CreationDate = new DateTime(2000, 01, 20),
                Email = "*****@*****.**",
                FirstName = "Jack",
                LastName = "Hoffman",
                UserId = "551581bf90eb291bd0e97fb2",
                LastLogin = new DateTime(2012, 10, 31)
            };

            MockRetrievableUserById
                .Setup(x => x.Retrieve(It.IsAny<ByUserId>()))
                .Returns(dataUser);

            MockRetrievableUserByEmail
                .Setup(x => x.Retrieve(It.IsAny<ByUserEmail>()))
                .Returns(dataUser);

            MockRetrievableAuthyId
                .Setup(x => x.RetrieveAll(It.IsAny<ByEncodedUserId>()))
                .Returns(new List<UserAuthentication>
                {
                    new UserAuthentication
                    {
                        AccountActive = true,
                        AccountType = AccountType.ActualAccount,
                        EncodedPassword = "******",
                        EncodedUserId = "Yvf08ew7hUptyomgslYIYhQmJ+jhUM/nrgQtbJgnW50=",
                        EncryptionKey = "ApplePear",
                        FailedLoginAttemptCount = 0
                    },
                    new UserAuthentication
                    {
                        AccountActive = true,
                        AccountType = AccountType.Trap1Account,
                        EncodedPassword = "******",
                        EncodedUserId = "Yvf08ew7hUptyomgslYIYhQmJ+jhUM/nrgQtbJgnW50=",
                        EncryptionKey = "PearBanana",
                        FailedLoginAttemptCount = 0
                    },
                    new UserAuthentication
                    {
                        AccountActive = true,
                        AccountType = AccountType.Trap2Account,
                        EncodedPassword = "******",
                        EncodedUserId = "Yvf08ew7hUptyomgslYIYhQmJ+jhUM/nrgQtbJgnW50=",
                        EncryptionKey = "BananaGrape",
                        FailedLoginAttemptCount = 0
                    },
                    new UserAuthentication
                    {
                        AccountActive = true,
                        AccountType = AccountType.Trap3Account,
                        EncodedPassword = "******",
                        EncodedUserId = "Yvf08ew7hUptyomgslYIYhQmJ+jhUM/nrgQtbJgnW50=",
                        EncryptionKey = "GrapeApple",
                        FailedLoginAttemptCount = 0
                    }
                });

            //arrange
            MockSystemTime
                .Setup(x => x.Current())
                .Returns(new DateTime(2015, 12, 2, 0, 0, 0, DateTimeKind.Utc));

            var input = new Credentials
            {
                Email = "*****@*****.**",
                Password = "******"
            };

            var expected = new UserAccount
            {
                Email = "*****@*****.**",
                FirstName = "Jack",
                LastName = "Hoffman",
                UserId = "551581bf90eb291bd0e97fb2"
            };

            UserAccount actual;

            //act
            actual = Subject.RetrieveAccount(input);

            //assert
            Assert.AreEqual(expected.Email, actual.Email, string.Format("Expected Email of {0}, actual was {1}", expected.Email, actual.Email));
            Assert.AreEqual(expected.FirstName, actual.FirstName, string.Format("Expected FirstName of {0}, actual was {1}", expected.FirstName, actual.FirstName));
            Assert.AreEqual(expected.LastName, actual.LastName, string.Format("Expected LastName of {0}, actual was {1}", expected.LastName, actual.LastName));
            Assert.AreEqual(expected.UserId, actual.UserId, string.Format("Expected UserId of {0}, actual was {1}", expected.UserId, actual.UserId));
        }
        public IList<UserAuthentication> GetUserAuthCollection(User user)
        {
            var encodedUserId = EncryptionHandler.Encrypt(user.UserId, user.UserId);
            var query = new ByEncodedUserId
            {
                EncodedUserId = encodedUserId
            };

            return _retrieveAllUserAuthenticationByEncodedUserId.RetrieveAll(query);
        }