public void CustomerWorkingForVeryImportantClientShouldHaveNoCreditLimit()
        {
            var customer = new Customer
            {
                Firstname    = "John",
                Surname      = "Dough",
                DateOfBirth  = new DateTime(1977, 1, 11),
                EmailAddress = "*****@*****.**",
                Company      = new Company()
                {
                    Id = 2
                }
            };

            var companyMock = new Mock <Company>();

            companyMock.Object.Id   = 2;
            companyMock.Object.Name = "VeryImportantClient";

            var companyRepositoryMock = new Mock <IRepository <Company> >();

            companyRepositoryMock.Setup(x => x.GetById(2)).Returns(companyMock.Object);

            var creditServiceMock = new Mock <ICustomerCreditService>();

            creditServiceMock.Setup(x => x.GetCreditLimit(customer.Firstname, customer.Surname, customer.DateOfBirth)).Returns(10000);

            var creditCheckService = new CreditCheckRule(creditServiceMock.Object, companyRepositoryMock.Object);

            var result = creditCheckService.Apply(customer);

            Assert.IsFalse(result.Failed);
            Assert.IsFalse(result.HasCreditLimit);
        }
        public void CustomerWithCreditLimitBelowThresholdShouldFailCreditCheck()
        {
            var customer = new Customer
            {
                Firstname    = "Jerome",
                Surname      = "Kerviel",
                DateOfBirth  = new DateTime(1977, 1, 11),
                EmailAddress = "*****@*****.**",
                Company      = new Company()
                {
                    Id = 7, Name = "SocGen"
                }
            };

            var companyMock = new Mock <Company>();

            companyMock.Object.Id   = 7;
            companyMock.Object.Name = "SocGen";

            var companyRepositoryMock = new Mock <IRepository <Company> >();

            companyRepositoryMock.Setup(x => x.GetById(7)).Returns(companyMock.Object);

            var creditServiceMock = new Mock <ICustomerCreditService>();

            creditServiceMock.Setup(x => x.GetCreditLimit(customer.Firstname, customer.Surname, customer.DateOfBirth)).Returns(499);

            var creditCheckService = new CreditCheckRule(creditServiceMock.Object, companyRepositoryMock.Object);

            var result = creditCheckService.Apply(customer);

            Assert.IsTrue(result.Failed);
            Assert.IsTrue(result.HasCreditLimit);
            Assert.AreEqual(499, result.CreditLimit);
        }
        public void CustomerWithCreditLimitAboveThresholdShouldSucceedCreditCheck()
        {
            var customer = new Customer
            {
                Firstname    = "John",
                Surname      = "Dough",
                DateOfBirth  = new DateTime(1977, 1, 11),
                EmailAddress = "*****@*****.**",
                Company      = new Company()
                {
                    Id = 1
                }
            };

            var companyMock = new Mock <Company>();

            companyMock.Object.Id   = 1;
            companyMock.Object.Name = "Moolah Corp.";

            var companyRepositoryMock = new Mock <IRepository <Company> >();

            companyRepositoryMock.Setup(x => x.GetById(1)).Returns(companyMock.Object);

            var creditServiceMock = new Mock <ICustomerCreditService>();

            creditServiceMock.Setup(x => x.GetCreditLimit(customer.Firstname, customer.Surname, customer.DateOfBirth)).Returns(10000);

            var creditCheckService = new CreditCheckRule(creditServiceMock.Object, companyRepositoryMock.Object);

            var result = creditCheckService.Apply(customer);

            Assert.IsFalse(result.Failed);
            Assert.IsTrue(result.HasCreditLimit);
            Assert.AreEqual(10000, result.CreditLimit);
        }
        public void InvalidCustomerNotAddedToRepo()
        {
            var customer = new Customer()
            {
                Firstname    = "Alice",
                Surname      = "Wonderland",
                EmailAddress = "alice.wonderland",
                Company      = new Company {
                    Id = 1, Name = "L Carroll Ltd"
                },
                DateOfBirth = DateTime.Now.AddYears(-25)
            };

            var customerRepositoryMock = new Mock <IRepository <Customer> >();

            var companyMock = new Mock <Company>();

            companyMock.Object.Id   = 1;
            companyMock.Object.Name = "L Carroll Ltd";

            var companyRepositoryMock = new Mock <IRepository <Company> >();

            companyRepositoryMock.Setup(x => x.GetById(1)).Returns(companyMock.Object);

            var creditServiceMock = new Mock <ICustomerCreditService>();

            creditServiceMock.Setup(x => x.GetCreditLimit(customer.Firstname, customer.Surname, customer.DateOfBirth)).Returns(800);
            var creditCheckRule = new CreditCheckRule(creditServiceMock.Object, companyRepositoryMock.Object);

            var customerValidator = new CustomerValidator();

            var customerService = new CustomerService(customerRepositoryMock.Object, companyRepositoryMock.Object, creditCheckRule, customerValidator);

            Assert.IsNotNull(customerService);
            var result = customerService.AddCustomer(customer.Firstname, customer.Surname, customer.EmailAddress, customer.DateOfBirth, 1);

            Assert.IsFalse(result);
        }