public async Task ItSavesAndReturnsANewAuthTokenIfLoginWasSuccessful()
        {
            var credentialsMessage = new CredentialsMessage
            {
                UserName = "******",
                Password = "******",
                UniqueDeviceId = "some unique id"
            };

            var loggedInUser = new ApplicationUser
            {
                Id = "some user id"
            };

            autoMocker.Get<ApplicationUserManager>().Expect(mock => mock.FindAsync(
                                        Arg<string>.Matches(userName => userName == credentialsMessage.UserName),
                                        Arg<string>.Matches(password => password == credentialsMessage.Password)))
                    .Return(Task.FromResult(loggedInUser));

            var someNewAuthToken = new AuthToken("the auth token value", new DateTime());
            autoMocker.Get<IAuthTokenGenerator>().Expect(mock => mock.GenerateAuthToken(loggedInUser.Id, credentialsMessage.UniqueDeviceId)).Return(someNewAuthToken);

            //--act
            var actualResponse = await autoMocker.ClassUnderTest.Login(credentialsMessage);

            Assert.That(actualResponse.Content, Is.TypeOf(typeof(ObjectContent<NewAuthTokenMessage>)));
            var content = actualResponse.Content as ObjectContent<NewAuthTokenMessage>;
            var newAuthTokenMessage = content.Value as NewAuthTokenMessage;
            Assert.That(newAuthTokenMessage.AuthenticationToken, Is.EqualTo(someNewAuthToken.AuthenticationTokenString));
            Assert.That(newAuthTokenMessage.AuthenticationTokenExpirationDateTime, Is.EqualTo(someNewAuthToken.AuthenticationTokenExpirationDateTime));
        }
        public async Task<HttpResponseMessage> Login(CredentialsMessage credentialsMessage)
        {
            var user = await applicationUserManager.FindAsync(credentialsMessage.UserName, credentialsMessage.Password);
            if (user == null)
            {
                return Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "Invalid credentials provided.");
            }

            var newAuthToken = authTokenGenerator.GenerateAuthToken(user.Id, credentialsMessage.UniqueDeviceId);

            var newAuthTokenMessage = new NewAuthTokenMessage
            {
                AuthenticationTokenExpirationDateTime = newAuthToken.AuthenticationTokenExpirationDateTime,
                AuthenticationToken = newAuthToken.AuthenticationTokenString
            };
            return Request.CreateResponse(HttpStatusCode.OK, newAuthTokenMessage);
        }
        public async Task ItReturnsAnHttp401NotAuthorizedResponseIfTheUsernameAndPasswordIsNotValid()
        {
            var credentialsMessage = new CredentialsMessage
            {
                UserName = "******",
                Password = "******"
            };

            autoMocker.Get<ApplicationUserManager>().Expect(mock => mock.FindAsync(
                                        Arg<string>.Matches(userName => userName == credentialsMessage.UserName),
                                        Arg<string>.Matches(password => password == credentialsMessage.Password)))
                    .Return(Task.FromResult((ApplicationUser)null));

            var actualResponse = await autoMocker.ClassUnderTest.Login(credentialsMessage);

            AssertThatApiAction.HasThisError(actualResponse, HttpStatusCode.Unauthorized, "Invalid credentials provided.");
        }