public void Create_PostInvalidModel_ReturnsModelWithListOfCategories()
        {
            var mockProductService         = new Mock <IProductService>();
            var mockCategoryService        = new Mock <ICategoryService>();
            var mockCategoryProductService = new Mock <ICategoryAndProductService>();

            var controller = new ProductsController(mockProductService.Object,
                                                    mockCategoryService.Object,
                                                    mockCategoryProductService.Object);

            mockCategoryService.Setup(x => x.GetAllCategories()).Returns(GetCategories());

            var productCreateEditViewModel = new ProductCreateEditFormViewModel();

            controller.ModelState.AddModelError("FakeError", "Fake Error Message");

            var result     = controller.Create(productCreateEditViewModel) as ViewResult;
            var categories = ((ProductCreateEditFormViewModel)result.ViewData.Model).Categories.ToList();

            Assert.IsNotNull(result);
            Assert.AreEqual(string.Empty, result.ViewName);
            Assert.IsFalse(result.ViewData.ModelState.IsValid);
            Assert.AreEqual(4, categories.Count);
            Assert.AreEqual(2, categories[1].Id);
            Assert.AreEqual("Accessories", categories[3].Name);
        }
        public ActionResult Create()
        {
            var model = new ProductCreateEditFormViewModel()
            {
                Categories = _categoryService.GetAllCategories()
            };

            return(View(model));
        }
        public ActionResult Edit(int id)
        {
            var product = _productService.GetProductById(id);
            var model   = new ProductCreateEditFormViewModel()
            {
                Id          = product.Id,
                Name        = product.Name,
                Description = product.Description,
                CategoryId  = product.CategoryId,
                Categories  = _categoryService.GetAllCategories()
            };

            return(View(model));
        }
        public ActionResult Edit(ProductCreateEditFormViewModel model)
        {
            if (!ModelState.IsValid)
            {
                model.Categories = _categoryService.GetAllCategories();
                return(View(model));
            }

            var product = new Product()
            {
                Id          = model.Id,
                Name        = model.Name,
                Description = model.Description,
                CategoryId  = model.CategoryId
            };

            _productService.EditProduct(product);
            return(RedirectToAction("Index"));
        }
        public void Create_PostValidModel_RedirectsToActionIndex()
        {
            var mockProductService         = new Mock <IProductService>();
            var mockCategoryService        = new Mock <ICategoryService>();
            var mockCategoryProductService = new Mock <ICategoryAndProductService>();

            var controller = new ProductsController(mockProductService.Object,
                                                    mockCategoryService.Object,
                                                    mockCategoryProductService.Object);

            var productCreateEditFormViewModel = new ProductCreateEditFormViewModel
            {
                Name        = "Test Product",
                Description = "Test Product Description",
                CategoryId  = 1
            };

            var result = controller.Create(productCreateEditFormViewModel) as RedirectToRouteResult;

            Assert.AreEqual(result.RouteValues["Action"], "Index");
        }