public async Task GetUserProfileAsync_ReturnsOkObjectResultWithUserProfileViewModel_WhenRequestedUserIsRequestingUser()
        {
            var options = this.CreateUniqueClassOptions <ApplicationDbContext>();

            using (var context = new ApplicationDbContext(options))
            {
                //You have to create the database
                context.Database.EnsureClean();
                context.Database.EnsureCreated();
                //context.SeedDatabaseFourBooks();

                context.Users.Add(SharedFunctions.CreateUser("testUser1"));
                context.Users.Add(SharedFunctions.CreateUser("testUser2"));

                context.SaveChanges();

                context.Users.Count().ShouldEqual(2);

                // Arrange
                var userManager = SharedFunctions.InitialiseUserManager(context);
                var controller  = new UserProfileController(_mapper, _logger.Object, userManager);

                string requestedUsername = "******";

                string requesterUsername = requestedUsername;

                controller.ControllerContext = new ControllerContext()
                {
                    HttpContext = new DefaultHttpContext()
                    {
                        User = SharedFunctions.GetTestClaimsPrincipal(requesterUsername)
                    }
                };

                // Act
                var result = await controller.GetUserProfileAsync(requestedUsername);

                // Assert
                var objectResult = result as ObjectResult;
                Assert.NotNull(objectResult);
                Assert.IsType <OkObjectResult>(result);
                Assert.True(objectResult is OkObjectResult);
                Assert.Equal(StatusCodes.Status200OK, objectResult.StatusCode);
                Assert.IsType <UserProfileViewModel>(objectResult.Value);

                var model = objectResult.Value as UserProfileViewModel;
                Assert.Equal(requestedUsername, model.UserName);
            }
        }
        public async Task GetUserProfileAsync_ReturnsNotFound_WhenRequestedUserIsNull()
        {
            var options = this.CreateUniqueClassOptions <ApplicationDbContext>();

            using (var context = new ApplicationDbContext(options))
            {
                //You have to create the database
                context.Database.EnsureClean();
                context.Database.EnsureCreated();
                //context.SeedDatabaseFourBooks();

                context.Users.Add(SharedFunctions.CreateUser("testUser1"));
                context.Users.Add(SharedFunctions.CreateUser("testUser2"));

                context.SaveChanges();

                context.Users.Count().ShouldEqual(2);

                // Arrange
                var userManager = SharedFunctions.InitialiseUserManager(context);
                var controller  = new UserProfileController(_mapper, _logger.Object, userManager);

                string requestedUsername = "******";

                string requesterUsername = requestedUsername;

                controller.ControllerContext = new ControllerContext()
                {
                    HttpContext = new DefaultHttpContext()
                    {
                        User = SharedFunctions.GetTestClaimsPrincipal(requesterUsername)
                    }
                };

                // Act
                var result = await controller.GetUserProfileAsync(requestedUsername);

                // Assert
                Assert.IsType <ObjectResult>(result);
                var objectResult = result as ObjectResult;
                Assert.Equal(StatusCodes.Status500InternalServerError, objectResult.StatusCode);
                Assert.Equal($"userManager returned null", objectResult.Value);
            }
        }
        public async Task GetUserProfileAsync_ReturnsBadRequest_WhenStringArgumentIsNullOrEmpty(string requestedUsername)
        {
            // Arrange
            var mockUserManager = SharedFunctions.InitialiseMockUserManager();

            var controller = new UserProfileController(_mapper, _logger.Object, mockUserManager.Object);

            controller.ControllerContext = new ControllerContext()
            {
                HttpContext = new DefaultHttpContext()
                {
                    User = SharedFunctions.GetTestClaimsPrincipal("NonExistentUsername")
                }
            };

            // Act
            var result = await controller.GetUserProfileAsync(requestedUsername);

            // Assert
            var objectResult = Assert.IsType <BadRequestObjectResult>(result);

            Assert.IsType <String>(objectResult.Value);
            Assert.Equal("requestedUsername argument is null or empty", objectResult.Value);
        }