public void TestSelectCustomer()
        {
            IRepository <Customer> customerRepo = new CustomerRepository();

            customerRepo.Insert(new Customer("Anthony", "Lucas"));
            customerRepo.Insert(new Customer("Sophia", "Rees"));
            customerRepo.Insert(new Customer("Thomas", "Perkins"));

            ISalesModel model = new SalesModel(customerRepo);
            var         view  = new Mock <ISalesFormView>();

            ISalesFormController controller = new SalesFormController(view.Object, model);

            // check for each customer, that the view is notified when the selection changes.

            for (int selectedCustomer = 0; selectedCustomer < customerRepo.GetAll().Length; selectedCustomer++)
            {
                controller.SelectedCustomerChanged(customerRepo.GetAll()[selectedCustomer].Id);

                // verify that we clear the customer and show the expected customer.
                view.Verify(x => x.ClearCustomerInfo(), Times.Exactly(1 + selectedCustomer)); //  ;
                view.Verify(x => x.ShowCustomerInfo(It.Is <Customer>(s => s.Id == customerRepo.GetAll()[selectedCustomer].Id)));

                Assert.IsTrue(model.CurrentCustomer == customerRepo.GetById(model.CurrentCustomer.Id));
            }
        }
        public void TestChangeCustomerDetails()
        {
            IRepository <Customer> customerRepo = new CustomerRepository();

            customerRepo.Insert(new Customer("Anthony", "Lucas"));
            customerRepo.Insert(new Customer("Sophia", "Rees"));
            customerRepo.Insert(new Customer("Thomas", "Perkins"));

            ISalesModel model = new SalesModel(customerRepo);

            model.CurrentCustomer = customerRepo.GetAll()[1];

            var view = new Mock <ISalesFormView>();

            view.Setup(x => x.CustomerFirstname).Returns("Victoria");
            view.Setup(x => x.CustomerLastname).Returns("Briggs");

            ISalesFormController controller = new SalesFormController(view.Object, model);

            controller.SaveChanges();

            // verify that the controller notifies the view to show the customer
            view.Verify(x => x.ShowCustomerInfo(It.IsAny <Customer>()));

            // confirm that the customer is set to 'new customer'
            Assert.IsTrue(model.CurrentCustomer.Firstname == "Victoria");
            Assert.IsTrue(model.CurrentCustomer.Surname == "Briggs");

            // Verify that the model has been updated.
            Assert.IsTrue(model.GetAllCustomers()[1].Firstname == "Victoria");
            Assert.IsTrue(model.GetAllCustomers()[1].Surname == "Briggs");
        }
        public void TestDeleteCustomerConfirmPrompt()
        {
            IRepository <Customer> repo = new CustomerRepository();

            repo.Insert(new Customer()
            {
                Firstname = "Delete", Surname = "Me"
            });
            repo.Insert(new Customer()
            {
                Firstname = "Don't Delete", Surname = "Me"
            });
            ISalesModel model = new SalesModel(repo);

            model.CurrentCustomer = model.GetAllCustomers()[0];

            // setup the view, so that the displayed question to confirm to delete
            // the custoemr is confirmed.
            var view = new Mock <ISalesFormView>();

            view.Setup(x => x.DisplayQuestion(It.IsAny <string>())).Returns(true);

            ISalesFormController controller = new SalesFormController(view.Object, model);

            controller.DeleteCustomer();

            // verify the view was notified for confirmation to delete the customer
            view.Verify(x => x.DisplayQuestion(It.IsAny <string>()), Times.Once);
            view.Verify(x => x.ClearCustomerInfo(), Times.AtLeastOnce);

            // confirm there is only one customer in the repository now.

            Assert.IsTrue(model.GetAllCustomers().Count == 1);
        }
        public void TestDeleteCustomerEnabledWithSelection()
        {
            IRepository <Customer> customerRepo = new CustomerRepository();

            customerRepo.Insert(new Customer("Anthony", "Lucas"));
            customerRepo.Insert(new Customer("Sophia", "Rees"));
            customerRepo.Insert(new Customer("Thomas", "Perkins"));

            ISalesModel model = new SalesModel(customerRepo);
            var         view  = new Mock <ISalesFormView>();

            model.CurrentCustomer = model.GetAllCustomers()[0];

            ISalesFormController controller = new SalesFormController(view.Object, model);

            view.Verify(x => x.EnableDeleteCustomer(It.Is <bool>(y => y == true)));
        }
        public void TestDeleteCustomerDisabledNoSelection()
        {
            IRepository <Customer> customerRepo = new CustomerRepository();

            customerRepo.Insert(new Customer("Anthony", "Lucas"));
            customerRepo.Insert(new Customer("Sophia", "Rees"));
            customerRepo.Insert(new Customer("Thomas", "Perkins"));

            ISalesModel model = new SalesModel(customerRepo);
            var         view  = new Mock <ISalesFormView>();

            model.CurrentCustomer = null;

            ISalesFormController controller = new SalesFormController(view.Object, model);

            view.Verify(x => x.EnableDeleteCustomer(It.Is <bool>(y => y == false)), Times.Once);
        }
        public void TestAddNewCustomer()
        {
            var         view  = new Mock <ISalesFormView>();
            ISalesModel model = new SalesModel(new CustomerRepository());

            ISalesFormController controller = new SalesFormController(view.Object, model);

            // Press the new-customer button
            controller.NewCustomer();

            // verify that the controller notifies the view to show the customer
            view.Verify(x => x.ShowCustomerInfo(It.IsAny <Customer>()));
            view.Verify(x => x.FocusCustomerEditFields(), Times.Once);

            // confirm that the customer is set to 'new customer'
            Assert.IsTrue(model.CurrentCustomer.Firstname == "New");
            Assert.IsTrue(model.CurrentCustomer.Surname == "Customer");
        }
        public void TestDeleteDisableWithNewCustomerSelected()
        {
            IRepository <Customer> customerRepo = new CustomerRepository();

            ISalesModel model = new SalesModel(customerRepo);
            var         view  = new Mock <ISalesFormView>();
            bool?       deleteCustomerEnabled = null;

            // Setup the view to monitor what parameters have been passed to the view mock
            view.Setup(x => x.EnableDeleteCustomer(It.IsAny <bool>()))
            .Callback <bool>((b) => deleteCustomerEnabled = b);

            ISalesFormController controller = new SalesFormController(view.Object, model);

            controller.NewCustomer();

            // verify that the EnableDeleteCustomer was called on the view and the last state was false
            // to reflect that the new customer cannot be deleted from the database

            view.Verify(x => x.EnableDeleteCustomer(It.Is <bool>(y => y == false)), Times.AtLeastOnce);
            Assert.IsTrue(deleteCustomerEnabled == false, "Delete Customer Button is enabled for new customer");
        }
        public void TestAddNewCustomerAndSave()
        {
            var         view  = new Mock <ISalesFormView>();
            ISalesModel model = new SalesModel(new CustomerRepository());

            view.Setup(x => x.CustomerFirstname).Returns("Anthony");
            view.Setup(x => x.CustomerLastname).Returns("Taylor");

            ISalesFormController controller = new SalesFormController(view.Object, model);

            controller.NewCustomer();

            view.Verify(x => x.ShowCustomerInfo(It.IsAny <Customer>()));

            // Hit the save changes button
            controller.SaveChanges();

            // confirm that we have saves a new customer with the expected name
            Customer c = model.FindCustomerById(model.CurrentCustomer.Id);

            Assert.IsTrue(c.Firstname == "Anthony");
            Assert.IsTrue(c.Surname == "Taylor");
        }
        public void TestDeleteCustomerDeclinePrompt()
        {
            IRepository <Customer> repo = new CustomerRepository();

            repo.Insert(new Customer()
            {
                Firstname = "Delete", Surname = "Me"
            });
            ISalesModel model = new SalesModel(repo);

            model.CurrentCustomer = model.GetAllCustomers()[0];

            var view = new Mock <ISalesFormView>();

            view.Setup(x => x.DisplayQuestion(It.IsAny <string>())).Returns(false);

            ISalesFormController controller = new SalesFormController(view.Object, model);

            controller.DeleteCustomer();
            view.Verify(x => x.DisplayQuestion(It.IsAny <string>()), Times.Once);

            Assert.IsTrue(model.GetAllCustomers().Count == 1);
        }