public void AddFee_AddFixedFeeToFirstFeeOnly() { // Arrange var feeType = new InvoiceFixedFee(29.00M); var xJan1_1 = new Fee("x", new DateTime(2019, 01, 01), 100M); var xJan1_2 = new Fee("x", new DateTime(2019, 01, 01), 100M); var xJan2_1 = new Fee("x", new DateTime(2019, 01, 02), 100M); var xFeb1_1 = new Fee("x", new DateTime(2019, 02, 01), 100M); var xFeb1_2 = new Fee("x", new DateTime(2019, 02, 01), 100M); var xFeb2_1 = new Fee("x", new DateTime(2019, 02, 02), 100M); var yJan2_1 = new Fee("y", new DateTime(2019, 01, 02), 100M); var yJan2_2 = new Fee("y", new DateTime(2019, 01, 02), 100M); var yFeb1_1 = new Fee("y", new DateTime(2019, 02, 01), 100M); var yFeb1_2 = new Fee("y", new DateTime(2019, 02, 01), 100M); var yFeb2_1 = new Fee("y", new DateTime(2019, 02, 02), 100M); // Act var xJan1_1_result = feeType.AddFee(xJan1_1); var xJan1_2_result = feeType.AddFee(xJan1_2); var xJan2_1_result = feeType.AddFee(xJan2_1); var xFeb1_1_result = feeType.AddFee(xFeb1_1); var xFeb1_2_result = feeType.AddFee(xFeb1_2); var xFeb2_1_result = feeType.AddFee(xFeb2_1); var yJan2_1_result = feeType.AddFee(yJan2_1); var yJan2_2_result = feeType.AddFee(yJan2_2); var yFeb1_1_result = feeType.AddFee(yFeb1_1); var yFeb1_2_result = feeType.AddFee(yFeb1_2); var yFeb2_1_result = feeType.AddFee(yFeb2_1); // Assert Assert.True(new[] { xJan1_1_result, xFeb1_1_result, yJan2_1_result, yFeb1_1_result }.All(fee => fee.Amount == 129M)); Assert.True(new[] { xJan1_2_result, xJan2_1_result, xFeb1_2_result, xFeb2_1_result, yJan2_2_result, yFeb1_2_result, yFeb2_1_result, } .All(fee => fee.Amount == 100M)); }
private static FeeCalculationCommand BuildFeeCalculationCommand(MpConfig config, params object[] dependencies) { var defaultFee = new PercentageFee( config.Fees.PercentageFee, config.Fees.MinAllowedFeeAmount); var feeDiscount = new DiscountedFee( config.Fees.DiscountedFees, config.Fees.MinAllowedFeeAmount); var fixedFee = new InvoiceFixedFee( config.Fees.InvoiceFixedFee, config.Fees.MinAllowedFeeAmount); var extraFees = new IExtraFee[] { feeDiscount, fixedFee }; ITransactionRepository transactionRepository = dependencies .OfType <ITransactionRepository>() .FirstOrDefault() ?? new TransactionRepository( config.Input.TransactionsFilePath, new FileReader(), new TransactionParser( config.Input.Separator, config.Input.DateFormat)); IFeeCalculationService feeCalculationService = dependencies .OfType <IFeeCalculationService>() .FirstOrDefault() ?? new FeeCalculationService( new BaseFeeCalculator(defaultFee, new Dictionary <string, ITransactionFee>()), extraFees, new Mapper()); IOutputWriter outputWriter = dependencies .OfType <IOutputWriter>() .FirstOrDefault() ?? new OutputWriter( config.Output.DateFormat, config.Output.AmountFormat, config.Output.MerchantNameMinimalWidth); var command = new FeeCalculationCommand( transactionRepository, feeCalculationService, outputWriter); return(command); }