Ejemplo n.º 1
0
        public void WhenDiscountIsAvailableAndApplicable_DiscountApplied()
        {
            //Arrange
            var amount      = 100;
            var discount    = 0.1;
            var companyName = "COMPANYWITHDISCOUNT";

            Transaction transaction = new Transaction()
            {
                Date         = DateTime.Now,
                MerchantName = companyName,
                Amount       = amount
            };

            //Act
            var transactionFeeCalculator = new TransactionFeeCalculator(
                new List <IFeeRule>()
            {
                new FeeRuleWithDiscount(new FeeRule((x, y) => x.Amount * BaseFeePercentage),
                                        new List <IDiscountRule>()
                {
                    new MerchantDiscountRule(companyName, discount),
                }
                                        )
            }
                );
            var fee = transactionFeeCalculator.CalculateFee(transaction);

            //Assert
            Assert.Equal((amount * BaseFeePercentage) * (1 - discount), fee.Amount);
        }
Ejemplo n.º 2
0
        public void WhenDiscountBiggerThenAmount_FeeIsZero()
        {
            //Arrange
            var amount = 100;

            Transaction transaction = new Transaction()
            {
                Amount = amount
            };

            //Act
            var transactionFeeCalculator = new TransactionFeeCalculator(
                new List <IFeeRule>()
            {
                new FeeRuleWithDiscount(new FeeRule((x, y) => x.Amount * BaseFeePercentage),
                                        new List <IDiscountRule>()
                {
                    new DiscountRule(x => 1000),
                }
                                        )
            }
                );
            var fee = transactionFeeCalculator.CalculateFee(transaction);

            //Assert
            Assert.Equal(0, fee.Amount);
        }
        public void TestCalculateTotalTransactionFeeShouldReturnCorrectValue()
        {
            var calculator = TransactionFeeCalculator.Instance();

            var transactionObject = new TransactionObject()
            {
                TransactionDate = new DateTime(2018, 2, 1), MerchantName = "SEVEN-S", TransactionAmount = 0
            };

            var result = calculator.CalculateTotalTransactionFee(transactionObject);

            result.ShouldBe(0.00m);

            transactionObject = new TransactionObject()
            {
                TransactionDate = new DateTime(2018, 3, 1), MerchantName = "SEVEN-S", TransactionAmount = 200
            };

            result = calculator.CalculateTotalTransactionFee(transactionObject);
            result.ShouldBe(31.00m);

            transactionObject = new TransactionObject()
            {
                TransactionDate = new DateTime(2018, 3, 1), MerchantName = "SEVEN-S", TransactionAmount = 200
            };

            result = calculator.CalculateTotalTransactionFee(transactionObject);
            result.ShouldBe(2.00m);
        }
        public void TestCalculateTotalTransactionFeeShouldReturnCorrectValue()
        {
            var calculator = TransactionFeeCalculator.Instance <TransactionFeeCalculatorCircleK>();

            var transactionObject = new TransactionObject()
            {
                TransactionDate = new DateTime(2018, 5, 1), MerchantName = "Circle_K", TransactionAmount = 0
            };

            var result = calculator.CalculateTotalTransactionFee(transactionObject);

            result.ShouldBe(0.00m);

            transactionObject = new TransactionObject()
            {
                TransactionDate = new DateTime(2018, 10, 1), MerchantName = "Circle_K", TransactionAmount = 200
            };

            result = calculator.CalculateTotalTransactionFee(transactionObject);
            result.ShouldBe(30.60m);

            transactionObject = new TransactionObject()
            {
                TransactionDate = new DateTime(2018, 10, 1), MerchantName = "Circle_K", TransactionAmount = 200
            };

            result = calculator.CalculateTotalTransactionFee(transactionObject);
            result.ShouldBe(1.60m);
        }
Ejemplo n.º 5
0
        public void WhenNoFeeRule_FeeIsZero()
        {
            //Arrange
            Transaction transaction = new Transaction()
            {
                Date         = DateTime.Now,
                MerchantName = "",
                Amount       = 20
            };

            //Act
            var transactionFeeCalculator = new TransactionFeeCalculator(new List <IFeeRule>());
            var fee = transactionFeeCalculator.CalculateFee(transaction);

            //Assert
            Assert.Equal(0, fee.Amount);
        }
Ejemplo n.º 6
0
        public void MonthlyFeesAreAppliedCorrectly()
        {
            //Arrange
            Transaction transaction1 = new Transaction()
            {
                MerchantName = "NAME",
                Amount       = 100,
                Date         = new DateTime(2019, 1, 10)
            };

            Transaction transaction2 = new Transaction()
            {
                MerchantName = "NAME",
                Amount       = 100,
                Date         = new DateTime(2019, 1, 20)
            };

            Transaction transaction3 = new Transaction()
            {
                MerchantName = "NAME",
                Amount       = 100,
                Date         = new DateTime(2019, 2, 20)
            };

            //Act
            var transactionFeeCalculator = new TransactionFeeCalculator(
                new List <IFeeRule>()
            {
                new FeeRule((x, y) => x.Amount * BaseFeePercentage),
                new MonthlyInvoiceFeeRule()
            }
                );

            var baseFee = 100 * BaseFeePercentage;
            var fee1    = transactionFeeCalculator.CalculateFee(transaction1);
            var fee2    = transactionFeeCalculator.CalculateFee(transaction2);
            var fee3    = transactionFeeCalculator.CalculateFee(transaction3);

            //Assert
            //var baseFeePercentage = 100 *
            Assert.Equal(29 + baseFee, fee1.Amount);
            Assert.Equal(0 + baseFee, fee2.Amount);
            Assert.Equal(29 + baseFee, fee3.Amount);
        }
Ejemplo n.º 7
0
        public void WhenFeeIsZero_MonthlyFeesNotApplied()
        {
            //Arrange
            Transaction transaction1 = new Transaction()
            {
                MerchantName = "NAME",
                Amount       = 100,
                Date         = new DateTime(2019, 1, 10)
            };

            //Act
            var transactionFeeCalculator = new TransactionFeeCalculator(
                new List <IFeeRule>()
            {
                new MonthlyInvoiceFeeRule()
            }
                );
            var fee1 = transactionFeeCalculator.CalculateFee(transaction1);

            //Assert
            Assert.Equal(0, fee1.Amount);
        }
Ejemplo n.º 8
0
        public void WhenOnePercentFeeRule_FeeIsOnePercent()
        {
            //Arrange
            var amount = 100;

            Transaction transaction = new Transaction()
            {
                Date         = DateTime.Now,
                MerchantName = "",
                Amount       = amount
            };

            //Act
            var transactionFeeCalculator = new TransactionFeeCalculator(
                new List <IFeeRule>()
            {
                new FeeRule((x, y) => x.Amount * BaseFeePercentage),
            }
                );
            var fee = transactionFeeCalculator.CalculateFee(transaction);

            //Assert
            Assert.Equal(amount * BaseFeePercentage, fee.Amount);
        }
Ejemplo n.º 9
0
 public TransactionFeeCalculatorService()
 {
     _feeCalculator = new TransactionFeeCalculator(_feeCalculators);
 }
 public new static bool MerchantHasTransactionsForMonth(TransactionObject transactionObject)
 {
     return(TransactionFeeCalculator.MerchantHasTransactionsForMonth(transactionObject));
 }