public async Task GlobalPlatformCannotVerifyCustomersThatHaveNoGlobalId()
        {
            // Arrange
            var hashCommand = new StubICommand<HashEmailAddressParameters, string>
            {
                ExecuteT0 = p => string.Empty
            };
            var getCommand = new StubICommand<GetCustomerFromDatabaseParameters, Task<customer>>
            {
                ExecuteT0 = p => Task.Run(() => new customer { global_id = null })
            };
            var updateCommand = new StubICommand<UpdateFirstLoginDateParameters, Task<DateTime>>();
            var verifyPasswordCommand = new StubICommand<VerifyPasswordParameters, Task<bool>>
            {
                ExecuteT0 = p => Task.Run(() => true)
            };

            var command = new VerifyCustomer(getCommand, hashCommand, updateCommand, verifyPasswordCommand);

            // Act
            var result = await command.ExecuteAsync(new VerifyCustomerParameters("256", "*****@*****.**", "whatever"));

            // Assert
            Assert.IsFalse(result);
        }
        public void WhenCorrectlyInitializedWillStoreInputValues()
        {
            var command = new StubICommand();
            var simpleMenuItem = new SimpleMenuItem("Test", 1, command);

            Assert.AreEqual("Test", simpleMenuItem.Name);
            Assert.AreEqual(1, simpleMenuItem.Priority);
            Assert.AreEqual(command, simpleMenuItem.Command);
        }
        public async Task InvalidSiteReturns400()
        {
            // Arrange
            var verifyCommand = new StubICommand<VerifyCustomerParameters, Task<bool>>
            {
                ExecuteT0 = (p) => { throw new InvalidSiteException(); }
            };

            var controller = new CustomerController(verifyCommand);

            // Act
            IHttpActionResult result = await controller.VerifyCredentialsAsync("256", "*****@*****.**", "whatever");

            // Assert
            Assert.IsInstanceOfType(result, typeof(BadRequestErrorMessageResult));
        }
        public async Task InCorrectCredentialsReturns404()
        {
            // Arrange
            var verifyCommand = new StubICommand<VerifyCustomerParameters, Task<bool>>
            {
                ExecuteT0 = (p) => Task.Run(() => false)
            };

            var controller = new CustomerController(verifyCommand);

            // Act
            IHttpActionResult result = await controller.VerifyCredentialsAsync("256", "*****@*****.**", "whatever");

            // Assert
            Assert.IsInstanceOfType(result, typeof(NotFoundResult));
        }
        public async Task VerifyCustomerReturnsFalseWhenCustomerIsNotFound()
        { 
            // Arrange
            var hashCommand = new StubICommand<HashEmailAddressParameters, string>
            {
                ExecuteT0 = p => string.Empty
            };
            var getCommand = new StubICommand<GetCustomerFromDatabaseParameters, Task<customer>>
            {
                ExecuteT0 = p => Task.Run(() => null as customer)
            };
            var updateCommand = new StubICommand<UpdateFirstLoginDateParameters, Task<DateTime>>();
            var verifyPasswordCommand = new StubICommand<VerifyPasswordParameters, Task<bool>>();

            var command = new VerifyCustomer(getCommand, hashCommand, updateCommand, verifyPasswordCommand);

            // Act
            var result = await command.ExecuteAsync(new VerifyCustomerParameters("256", "*****@*****.**", "whatever"));

            // Assert
            Assert.IsFalse(result);
        }
        public async Task FirstLoggedInDateIsNotUpdatedWhenCustomerCredentialsAreIncorrect()
        {
            // Arrange
            bool updatedCalled = false;

            var hashCommand = new StubICommand<HashEmailAddressParameters, string>
            {
                ExecuteT0 = p => string.Empty
            };
            var getCommand = new StubICommand<GetCustomerFromDatabaseParameters, Task<customer>>
            {
                ExecuteT0 = p => Task.Run(() => new customer
                {
                    first_login_date = null,
                    global_id = "i-am-a-global-id",
                    password_hash = new byte[0]
                })
            };
            var updateCommand = new StubICommand<UpdateFirstLoginDateParameters, Task<DateTime>>
            {
                ExecuteT0 = p => Task.Run(() =>
                {
                    updatedCalled = true;
                    return DateTime.UtcNow;
                })
            };
            var verifyPasswordCommand = new StubICommand<VerifyPasswordParameters, Task<bool>>
            {
                ExecuteT0 = p => Task.Run(() => false)
            };

            var command = new VerifyCustomer(getCommand, hashCommand, updateCommand, verifyPasswordCommand);

            // Act
            var result = await command.ExecuteAsync(new VerifyCustomerParameters("256", "*****@*****.**", "whatever"));

            // Assert
            Assert.IsFalse(result, "Customer was verified but should not have been.");
            Assert.IsFalse(updatedCalled, "First logged in date update command was called when it should not have been.");
        }
        public async Task WuakiPlatformCanVerifyWuakiCustomers()
        {
            // Arrange
            var hashCommand = new StubICommand<HashEmailAddressParameters, string>
            {
                ExecuteT0 = p => string.Empty
            };
            var getCommand = new StubICommand<GetCustomerFromDatabaseParameters, Task<customer>>
            {
                ExecuteT0 = p => Task.Run(() => new customer { website_id = 16384, password_hash = new byte[0] })
            };
            var updateCommand = new StubICommand<UpdateFirstLoginDateParameters, Task<DateTime>>
            {
                ExecuteT0 = p => Task.Run(() => DateTime.UtcNow)
            };
            var verifyPasswordCommand = new StubICommand<VerifyPasswordParameters, Task<bool>>
            {
                ExecuteT0 = p => Task.Run(() => true)
            };

            var command = new VerifyCustomer(getCommand, hashCommand, updateCommand, verifyPasswordCommand);

            // Act
            var result = await command.ExecuteAsync(new VerifyCustomerParameters("16384", "*****@*****.**", "whatever"));

            // Assert
            Assert.IsTrue(result);
        }