public async Task EditPost_GivenAProductIdThatDoesNotExist_ShouldReturnNotFound()
        {
            // Arrange
            var productServiceMock            = new Mock <IProductService>();
            int productIdThatDoesNotExist     = 0;
            var productWithIdThatDoesNotExist = new Product()
            {
                ProductId = productIdThatDoesNotExist
            };

            productServiceMock.Setup(ps => ps.DoesProductIdExist(productIdThatDoesNotExist))
            .ReturnsAsync(false);

            var authorizationServiceMock = new Mock <IAuthorizationService>();

            var mockUserStore   = new Mock <IUserStore <IdentityUser> >();
            var userManagerMock = new Mock <UserManager <IdentityUser> >(mockUserStore.Object, null, null, null, null, null, null, null, null);

            var productsController = new ProductsController(
                productServiceMock.Object,
                authorizationServiceMock.Object,
                userManagerMock.Object
                );

            // Act
            IActionResult actionResult = await productsController.EditPost(productWithIdThatDoesNotExist);

            // Assert
            actionResult.ShouldBeOfType <NotFoundResult>();
        }
        public async Task EditPost_GivenAProductIdThatExistsAsAnUnauthorizedUser_ShouldReturnForbid()
        {
            // Arrange
            var productServiceMock      = new Mock <IProductService>();
            int productIdThatExists     = 1;
            var productWithIdThatExists = new Product()
            {
                ProductId = productIdThatExists
            };

            productServiceMock.Setup(ps => ps.DoesProductIdExist(productIdThatExists))
            .ReturnsAsync(true);
            productServiceMock.Setup(ps => ps.GetProductByIdAsync(productIdThatExists))
            .ReturnsAsync(productWithIdThatExists);

            var authorizationServiceMock = CreateAuthorizationServiceMockThatDoesNotAuthorizeUser();

            var mockUserStore   = new Mock <IUserStore <IdentityUser> >();
            var userManagerMock = new Mock <UserManager <IdentityUser> >(mockUserStore.Object, null, null, null, null, null, null, null, null);

            var productsController = new ProductsController(
                productServiceMock.Object,
                authorizationServiceMock.Object,
                userManagerMock.Object
                );

            // Act
            IActionResult actionResult = await productsController.EditPost(productWithIdThatExists);

            // Assert
            actionResult.ShouldBeOfType <ForbidResult>();
        }