public void Index_Returns_A_Paged_List_Of_Customers()
        {
            /*
             *   Arrange 
             * 1º - Create a dummy list of customers
             * 2º - Initialize stub of SICustomerManagementService
             * 3º - Create controller to test
             */

            IList<Customer> customers = GetFakeCustomers();

            SICustomerManagementService customerService = new SICustomerManagementService();
            customerService.FindPagedCustomersInt32Int32 = (page, pageSize) => customers.Skip(page * pageSize).Take(pageSize).ToList();

            
            CustomerController controller = new CustomerController(customerService);

            //Act
            ViewResultBase result = controller.Index(0, 5) as ViewResult;

            //Assert
            Assert.IsNotNull(result, "Expected a view");
            CustomerListViewModel model = result.ViewData.Model as CustomerListViewModel;

            Assert.IsNotNull(model, "model is null or different than CustomerListViewModel");
            IList<Customer> resultCustomers = (model.PageItems as IEnumerable<Customer>).ToList();

            Assert.AreEqual(5, resultCustomers.Count(), "Expected a different number of customers");
            
        }
        public void CustomerPicture_Returns_A_Default_Image_When_The_Customer_Doesnt_Have_Image()
        {
            /*
             *   Arrange 
             * 1º - Create a dummy list of customers
             * 2º - Initialize stub of SICustomerManagementService
             * 3º - Create controller to test
             */

            //Create a customer
            Customer customer = new Customer(){ CustomerCode = "A0001", CustomerPicture = null};
            
            SICustomerManagementService customerService = new SICustomerManagementService();
            customerService.FindCustomerByCodeString = x => customer;

            CustomerController controller = new CustomerController(customerService);

            //Act
            FilePathResult result = controller.CustomerPicture("A0001") as FilePathResult;

            //Assert
            Assert.IsNotNull(result);
            Assert.AreEqual("img/png", result.ContentType);
            Assert.IsTrue(result.FileName.EndsWith("Unknown.png"));
        }
        public void Delete_Action_Deletes_The_Customer_And_Redirects_To_Index()
        {
           /*
           *   Arrange 
           * 1º - Create a dummy list of customers
           * 2º - Initialize stub of SICustomerManagementService
           * 3º - Create controller to test
           */
            
            Customer customer = new Customer() { CustomerCode = "A0001" };
            IList<Customer> customers = new List<Customer>() { customer };
            
            SICustomerManagementService customerService = new SICustomerManagementService();
            customerService.FindCustomerByCodeString = x => customer;
            customerService.RemoveCustomerCustomer = x => customers.Remove(customer);
            
            
            CustomerController controller = new CustomerController(customerService);

            //Act
            RedirectToRouteResult result = controller.Delete("A0001") as RedirectToRouteResult;

            //Assert
            Assert.IsNotNull(result); 

            Assert.AreEqual(0, customers.Count);

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

            Assert.IsNull(result.RouteValues["controller"]);

            Assert.AreEqual(0, result.RouteValues["page"]);

            Assert.AreEqual(10, result.RouteValues["pageSize"]);

        }
        public void Edit_Post_Saves_A_Valid_Customer_And_Redirects_To_Details_Of_The_Customer()
        {
           /*
           *   Arrange 
           * 1º - Create a dummy list of customers
           * 2º - Initialize stub of SICustomerManagementService
           * 3º - Create controller to test
           */

            Customer customer = new Customer() { CustomerCode = "A0001" };
            IList<Customer> customers = new List<Customer>();
            
            bool changeCustomerWasCalled = false;
            
            SICustomerManagementService customerService = new SICustomerManagementService();
            customerService.ChangeCustomerCustomer = x => changeCustomerWasCalled = true;
            
            CustomerController controller = new CustomerController(customerService);

            //Act
            RedirectToRouteResult result = controller.Edit(customer) as RedirectToRouteResult;

            //Assert
            Assert.IsNotNull(result);
            Assert.IsTrue(changeCustomerWasCalled);
            Assert.AreEqual("Details", result.RouteValues["action"]);

            //Asp.Net MVC convention to say "Same Controller"
            Assert.IsNull(result.RouteValues["controller"]);
            Assert.AreEqual("A0001", result.RouteValues["customerCode"]);
        }
        public void Edit_Post_Returns_Edit_View_With_An_Invalid_Customer()
        {
           /*
           *   Arrange 
           * 1º - Create a dummy list of customers
           * 2º - Initialize stub of SICustomerManagementService
           * 3º - Create controller to test
           */

            Customer customer = new Customer() { CustomerCode = "A0001" };
            SICustomerManagementService customerService = new SICustomerManagementService();
            
            CustomerController controller = new CustomerController(customerService);
            
            ModelState state = new ModelState();
            state.Value = new ValueProviderResult("A0001", "A0001", CultureInfo.CurrentCulture);
            state.Errors.Add("Invalid Customer Code");
            controller.ModelState.Add("CustomerCode", state);

            //Act
            ViewResult result = controller.Edit(customer) as ViewResult;

            //Assert
            Assert.IsNotNull(result);
            Assert.AreEqual("A0001", result.ViewData.ModelState["CustomerCode"].Value.AttemptedValue);
            Assert.AreEqual("", result.ViewName);
        }
        public void Edit_Get_Returns_The_Correct_Customer_To_Edit()
        {
           /*
           *   Arrange 
           * 1º - Create a dummy list of customers
           * 2º - Initialize stub of SICustomerManagementService
           * 3º - Create controller to test
           */

            Customer customer = new Customer() { CustomerCode = "A0001" };
            IList<Customer> customers = new List<Customer>();
            
            SICustomerManagementService customerService = new SICustomerManagementService();
            customerService.FindCustomerByCodeString = x => customer;

            CustomerController controller = new CustomerController(customerService);

            //Act
            ViewResult result = controller.Edit("A0001") as ViewResult;

            //Assert
            Assert.IsNotNull(result);

            Customer model = result.ViewData.Model as Customer;
            Assert.IsNotNull(model);

            Assert.AreSame(customer, model);

            Assert.AreEqual("", result.ViewName);

        }
        public void Create_Post_Adds_The_Customer_And_Redirects_To_The_Index_Page_With_A_Valid_Customer()
        {
            /*
            *   Arrange 
            * 1º - Create a dummy list of customers
            * 2º - Initialize stub of SICustomerManagementService
            * 3º - Create controller to test
            */

            Customer customer = new Customer() { CustomerCode = "A0001" };
            IList<Customer> customers = new List<Customer>();
            
            SICustomerManagementService customerService = new SICustomerManagementService();
            customerService.AddCustomerCustomer = x => customers.Add(customer);
            
            CustomerController controller = new CustomerController(customerService);

            //Act
            RedirectToRouteResult result =  controller.Create(customer) as RedirectToRouteResult;

            //Assert
            Assert.IsNotNull(result);

            Assert.AreEqual(0, result.RouteValues["page"]);

            Assert.AreEqual(10, result.RouteValues["pageSize"]);

            Assert.AreEqual(1, customers.Count);

            Assert.AreEqual("A0001", customers.First().CustomerCode);
        }
        public void Create_Get_Returns_Create_View()
        {
            /*
             *   Arrange 
             * 1º - Initialize stub of SICustomerManagementService
             * 2º - Create controller to test
             */

            SICustomerManagementService customerService = new SICustomerManagementService();
            
            CustomerController controller = new CustomerController(customerService);

            //Act
            ViewResult result = controller.Create() as ViewResult;

            //Assert
            Assert.IsNotNull(result);

            //This is a MVC convention. When you don't specify a view 
            //it takes the view with the same name as the controller action.
            Assert.AreEqual("", result.ViewName);
        }
        public void Details_Returns_The_Requested_Customer_Details()
        {
            /*
             *   Arrange 
             * 1º - Create a dummy list of customers
             * 2º - Initialize stub of SICustomerManagementService
             * 3º - Create controller to test
             */

            Customer customer = new Customer() { CustomerCode = "A0001", CustomerPicture = null };
            
            SICustomerManagementService customerService = new SICustomerManagementService();
            customerService.FindCustomerByCodeString = x => customer;

            
            CustomerController controller = new CustomerController(customerService);

            //Act
            ViewResult result = controller.Details("A0001") as ViewResult;
            
            //Assert
            Assert.IsNotNull(result);

            Assert.AreEqual("", result.ViewName);

            Customer model = result.ViewData.Model as Customer;
            Assert.IsNotNull(model);

            Assert.AreEqual("A0001", model.CustomerCode);
        }
        public void CustomerPicture_Returns_Customer_Image_When_The_Customer_Has_Image()
        {
            /*
             *   Arrange 
             * 1º - Create a dummy list of customers
             * 2º - Initialize stub of SICustomerManagementService
             * 3º - Create controller to test
             */

            byte[] customerPhoto = new byte[] { 0x10 };
            Customer customer = new Customer()
            {
                CustomerCode = "A0001",
                CustomerPicture = new CustomerPicture()
                {
                    Photo = customerPhoto
                }
            };
           
            SICustomerManagementService customerService = new SICustomerManagementService();
            customerService.FindCustomerByCodeString = x => customer;

            //Create the controller
            CustomerController controller = new CustomerController(customerService);

            //Act
            FileContentResult result = controller.CustomerPicture("A0001") as FileContentResult;

            //Assert
            Assert.IsNotNull(result);
            Assert.AreEqual("img", result.ContentType);
            Assert.AreEqual(customerPhoto.Length, result.FileContents.Length);
            for (int i = 0; i < customerPhoto.Length; i++)
            {
                Assert.AreEqual(customerPhoto[i], result.FileContents[i]);
            }

        }