Try your search with a different keyword or use * as a wildcard.
using FluentAssertions;
using Nop.Core.Domain.Catalog;
using Nop.Core.Domain.Customers;
using Nop.Core.Domain.Discounts;
using Nop.Core.Domain.Orders;
using Nop.Core.Domain.Shipping;
using Nop.Core.Domain.Stores;
using Nop.Core.Domain.Tax;
using Nop.Data;
using Nop.Services.Attributes;
using Nop.Services.Catalog;
using Nop.Services.Common;
using Nop.Services.Configuration;
using Nop.Services.Customers;
using Nop.Services.Discounts;
using Nop.Services.Orders;
using Nop.Services.Stores;
using Nop.Tests.Nop.Services.Tests.Payments;
using NUnit.Framework;
namespace Nop.Tests.Nop.Services.Tests.Orders;
[TestFixture]
public class OrderTotalCalculationServiceTests : ServiceTest
{
private IOrderTotalCalculationService _orderTotalCalcService;
private IProductService _productService;
private ICustomerService _customerService;
private IDiscountService _discountService;
private TaxSettings _taxSettings;
private ISettingService _settingService;
private IShoppingCartService _shoppingCartService;
private ShoppingCartSettings _shoppingCartSettings;
private IStoreService _storeService;
private RewardPointsSettings _rewardPointsSettings;
private IGenericAttributeService _genericAttributeService;
private Discount _discount;
private Customer _customer;
private Store _store;
private string _checkoutAttrXml;
#region Utilities
private async Task CreateTestShopCartItemAsync(decimal productPrice, int quantity = 1)
{
//shopping cart
var product = new Product
{
Name = "Product name 1",
Price = productPrice,
CustomerEntersPrice = false,
Published = true,
//set HasTierPrices property
HasTierPrices = true
};
await _productService.InsertProductAsync(product);
var shoppingCartItem = new ShoppingCartItem
{
CustomerId = _customer.Id,
ProductId = product.Id,
StoreId = _store.Id,
Quantity = quantity
};
return shoppingCartItem;
}
private async Task> GetShoppingCartAsync()
{
var product = await _productService.GetProductBySkuAsync("FR_451_RB");
var sci1 = new ShoppingCartItem
{
ProductId = product.Id,
Quantity = 2
};
product = await _productService.GetProductBySkuAsync("FIRST_PRP");
var sci2 = new ShoppingCartItem
{
ProductId = product.Id,
Quantity = 3
};
var cart = new List { sci1, sci2 };
foreach (var sci in cart)
{
sci.CustomerId = _customer.Id;
}
return cart;
}
#endregion
[SetUp]
public async Task SetUp()
{
_settingService = GetService();
var shippingSettings = GetService();
shippingSettings.ActiveShippingRateComputationMethodSystemNames.Add("FixedRateTestShippingRateComputationMethod");
_taxSettings = GetService();
_taxSettings.ActiveTaxProviderSystemName = "FixedTaxRateTest";
_taxSettings.ShippingIsTaxable = true;
await _settingService.SaveSettingAsync(shippingSettings);
await _settingService.SaveSettingAsync(_taxSettings);
_orderTotalCalcService = GetService();
_productService = GetService();
_customerService = GetService();
_discountService = GetService();
_shoppingCartService = GetService();
_shoppingCartSettings = GetService();
_storeService = GetService();
_rewardPointsSettings = GetService();
_genericAttributeService = GetService();
var checkoutAttributeService = GetService>();
var attr = await checkoutAttributeService.GetAttributeByIdAsync(1);
var values = await checkoutAttributeService.GetAttributeValuesAsync(attr.Id);
var val = values.FirstOrDefault(p => p.Name == "Yes")?.Id.ToString();
_checkoutAttrXml = GetService>().AddAttribute(string.Empty, attr, val);
_discount = new Discount
{
IsActive = true,
Name = "Discount 1",
DiscountType = DiscountType.AssignedToOrderSubTotal,
DiscountAmount = 3,
DiscountLimitation = DiscountLimitationType.Unlimited
};
_customer = await _customerService.GetCustomerByEmailAsync(NopTestsDefaults.AdminEmail);
_store = (await _storeService.GetAllStoresAsync()).First();
await _genericAttributeService.SaveAttributeAsync(_customer,
NopCustomerDefaults.SelectedPaymentMethodAttribute, "Payments.TestMethod", 1);
}
[TearDown]
public async Task TearDown()
{
var settingService = GetService();
var shippingSettings = GetService();
shippingSettings.ActiveShippingRateComputationMethodSystemNames.Clear();
_taxSettings.PaymentMethodAdditionalFeeIsTaxable = false;
_taxSettings.ActiveTaxProviderSystemName = string.Empty;
_taxSettings.ShippingIsTaxable = false;
await settingService.SaveSettingAsync(shippingSettings);
await settingService.SaveSettingAsync(_taxSettings);
var product = await _productService.GetProductBySkuAsync("FR_451_RB");
product.AdditionalShippingCharge = 0M;
product.IsFreeShipping = true;
await _productService.UpdateProductAsync(product);
product = await _productService.GetProductBySkuAsync("FIRST_PRP");
product.AdditionalShippingCharge = 0M;
product.IsFreeShipping = true;
await _productService.UpdateProductAsync(product);
await GetService().SaveAttributeAsync(_customer, NopCustomerDefaults.SelectedPaymentMethodAttribute, null, 1);
foreach (var item in GetService>().Table.Where(d => d.Name == "Discount 1").ToList())
await _discountService.DeleteDiscountAsync(item);
await _productService.DeleteProductsAsync(GetService>().Table.Where(p => p.Name == "Product name 1").ToList());
await _genericAttributeService.SaveAttributeAsync(_customer, NopCustomerDefaults.CheckoutAttributes, null, _store.Id);
}
[Test]
public async Task CanGetShoppingCartSubTotalExcludingTax()
{
//10% - default tax rate
var (discountAmount, appliedDiscounts, subTotalWithoutDiscount, subTotalWithDiscount, taxRates) = await _orderTotalCalcService.GetShoppingCartSubTotalAsync(await GetShoppingCartAsync(), false);
discountAmount.Should().Be(0);
appliedDiscounts.Count.Should().Be(0);
subTotalWithoutDiscount.Should().Be(207M);
subTotalWithDiscount.Should().Be(207M);
taxRates.Count.Should().Be(1);
taxRates.ContainsKey(10).Should().BeTrue();
taxRates[10].Should().Be(20.7M);
}
[Test]
public async Task CanGetShoppingCartSubTotalIncludingTax()
{
var (discountAmount, appliedDiscounts, subTotalWithoutDiscount, subTotalWithDiscount, taxRates) = await _orderTotalCalcService.GetShoppingCartSubTotalAsync(await GetShoppingCartAsync(), true);
discountAmount.Should().Be(0);
appliedDiscounts.Count.Should().Be(0);
subTotalWithoutDiscount.Should().Be(227.7M);
subTotalWithDiscount.Should().Be(227.7M);
taxRates.Count.Should().Be(1);
taxRates.ContainsKey(10).Should().BeTrue();
taxRates[10].Should().Be(20.7M);
}
[Test]
public async Task CanGetShoppingCartSubTotal()
{
var (discountAmountInclTax, discountAmountExclTax, appliedDiscounts, subTotalWithoutDiscountInclTax, subTotalWithoutDiscountExclTax, subTotalWithDiscountInclTax, subTotalWithDiscountExclTax, taxRates) = await _orderTotalCalcService.GetShoppingCartSubTotalsAsync(await GetShoppingCartAsync());
discountAmountExclTax.Should().Be(0);
subTotalWithoutDiscountExclTax.Should().Be(207M);
subTotalWithDiscountExclTax.Should().Be(207M);
discountAmountInclTax.Should().Be(0);
subTotalWithoutDiscountInclTax.Should().Be(227.7M);
subTotalWithDiscountInclTax.Should().Be(227.7M);
appliedDiscounts.Count.Should().Be(0);
taxRates.Count.Should().Be(1);
taxRates.ContainsKey(10).Should().BeTrue();
taxRates[10].Should().Be(20.7M);
}
[Test]
public async Task CanGetShoppingCartSubTotalWithCheckoutAttribute()
{
var (discountAmountInclTax, discountAmountExclTax, appliedDiscounts, subTotalWithoutDiscountInclTax, subTotalWithoutDiscountExclTax, subTotalWithDiscountInclTax, subTotalWithDiscountExclTax, taxRates) = await _orderTotalCalcService.GetShoppingCartSubTotalsAsync(await GetShoppingCartAsync());
discountAmountExclTax.Should().Be(0);
subTotalWithoutDiscountExclTax.Should().Be(207M);
subTotalWithDiscountExclTax.Should().Be(207M);
discountAmountInclTax.Should().Be(0);
subTotalWithoutDiscountInclTax.Should().Be(227.7M);
subTotalWithDiscountInclTax.Should().Be(227.7M);
appliedDiscounts.Count.Should().Be(0);
taxRates.Count.Should().Be(1);
taxRates.ContainsKey(10).Should().BeTrue();
taxRates[10].Should().Be(20.7M);
await _genericAttributeService.SaveAttributeAsync(_customer, NopCustomerDefaults.CheckoutAttributes, _checkoutAttrXml, _store.Id);
(_, _, _, subTotalWithoutDiscountInclTax, subTotalWithoutDiscountExclTax, subTotalWithDiscountInclTax, subTotalWithDiscountExclTax, taxRates) = await _orderTotalCalcService.GetShoppingCartSubTotalsAsync(await GetShoppingCartAsync());
subTotalWithoutDiscountExclTax.Should().Be(217M);
subTotalWithDiscountExclTax.Should().Be(217M);
subTotalWithoutDiscountInclTax.Should().Be(238.7M);
subTotalWithDiscountInclTax.Should().Be(238.7M);
await _genericAttributeService.SaveAttributeAsync(_customer, NopCustomerDefaults.CheckoutAttributes, null, _store.Id);
}
[Test]
public async Task CanGetShoppingCartSubtotalDiscountExcludingTax()
{
await _discountService.InsertDiscountAsync(_discount);
//10% - default tax rate
var (discountAmount, appliedDiscounts, subTotalWithoutDiscount, subTotalWithDiscount, taxRates) = await _orderTotalCalcService.GetShoppingCartSubTotalAsync(await GetShoppingCartAsync(), false);
await _discountService.DeleteDiscountAsync(_discount);
discountAmount.Should().Be(3);
appliedDiscounts.Count.Should().Be(1);
appliedDiscounts.First().Name.Should().Be("Discount 1");
subTotalWithoutDiscount.Should().Be(207M);
subTotalWithDiscount.Should().Be(204M);
taxRates.Count.Should().Be(1);
taxRates.ContainsKey(10).Should().BeTrue();
taxRates[10].Should().Be(20.4M);
}
[Test]
public async Task CanGetShoppingCartSubtotalDiscountIncludingTax()
{
await _discountService.InsertDiscountAsync(_discount);
var (discountAmount, appliedDiscounts, subTotalWithoutDiscount, subTotalWithDiscount, taxRates) = await _orderTotalCalcService.GetShoppingCartSubTotalAsync(await GetShoppingCartAsync(), true);
await _discountService.DeleteDiscountAsync(_discount);
//The comparison test failed before, because of a very tiny number difference.
//discountAmount.ShouldEqual(3.3);
(Math.Round(discountAmount, 10) == 3.3M).Should().BeTrue();
appliedDiscounts.Count.Should().Be(1);
appliedDiscounts.First().Name.Should().Be("Discount 1");
subTotalWithoutDiscount.Should().Be(227.7M);
subTotalWithDiscount.Should().Be(224.4M);
taxRates.Count.Should().Be(1);
taxRates.ContainsKey(10).Should().BeTrue();
taxRates[10].Should().Be(20.4M);
}
[Test]
public async Task CanGetShoppingCartSubtotalDiscountExcludingAndIncludingTax()
{
await _discountService.InsertDiscountAsync(_discount);
//10% - default tax rate
var (discountAmountInclTax, discountAmountExclTax, appliedDiscounts, subTotalWithoutDiscountInclTax, subTotalWithoutDiscountExclTax, subTotalWithDiscountInclTax, subTotalWithDiscountExclTax, taxRates) = await _orderTotalCalcService.GetShoppingCartSubTotalsAsync(await GetShoppingCartAsync());
await _discountService.DeleteDiscountAsync(_discount);
discountAmountExclTax.Should().Be(3);
subTotalWithoutDiscountExclTax.Should().Be(207M);
subTotalWithDiscountExclTax.Should().Be(204M);
(Math.Round(discountAmountInclTax, 10) == 3.3M).Should().BeTrue();
subTotalWithoutDiscountInclTax.Should().Be(227.7M);
subTotalWithDiscountInclTax.Should().Be(224.4M);
appliedDiscounts.Count.Should().Be(1);
appliedDiscounts.First().Name.Should().Be("Discount 1");
taxRates.Count.Should().Be(1);
taxRates.ContainsKey(10).Should().BeTrue();
taxRates[10].Should().Be(20.4M);
}
[Test]
public async Task ShippingShouldBeFreeWhenAllShoppingCartItemsAreMarkedAsFreeShipping()
{
await TearDown();
await SetUp();
var product = await _productService.GetProductBySkuAsync("FR_451_RB");
product.IsFreeShipping = true;
await _productService.UpdateProductAsync(product);
await _productService.GetProductBySkuAsync("FIRST_PRP");
product.IsFreeShipping = true;
await _productService.UpdateProductAsync(product);
var isFreeShipping = await _orderTotalCalcService.IsFreeShippingAsync(await GetShoppingCartAsync());
isFreeShipping.Should().BeTrue();
}
[Test]
public async Task ShippingShouldNotBeFreeWhenSomeOfShoppingCartItemsAreNotMarkedAsFreeShipping()
{
var product = await _productService.GetProductBySkuAsync("FR_451_RB");
product.IsFreeShipping = false;
await _productService.UpdateProductAsync(product);
var isFreeShipping = await _orderTotalCalcService.IsFreeShippingAsync(await GetShoppingCartAsync());
product.IsFreeShipping = true;
await _productService.UpdateProductAsync(product);
isFreeShipping.Should().BeFalse();
}
[Test]
public async Task ShippingShouldBeFreeWhenCustomerIsInRoleWithFreeShipping()
{
var product = await _productService.GetProductBySkuAsync("FR_451_RB");
product.IsFreeShipping = false;
await _productService.UpdateProductAsync(product);
var role = await _customerService.GetCustomerRoleBySystemNameAsync(NopCustomerDefaults.AdministratorsRoleName);
role.FreeShipping = true;
await _customerService.UpdateCustomerRoleAsync(role);
product.IsFreeShipping = true;
await _productService.UpdateProductAsync(product);
role.FreeShipping = false;
await _customerService.UpdateCustomerRoleAsync(role);
var isFreeShipping = await _orderTotalCalcService.IsFreeShippingAsync(await GetShoppingCartAsync());
isFreeShipping.Should().BeTrue();
}
[Test]
public async Task CanGetShippingTotalWithFixedShippingRateExcludingTax()
{
var product = await _productService.GetProductBySkuAsync("FR_451_RB");
product.AdditionalShippingCharge = 21.25M;
product.IsFreeShipping = false;
await _productService.UpdateProductAsync(product);
var (shipping, taxRate, appliedDiscounts) =
await _orderTotalCalcService.GetShoppingCartShippingTotalAsync(await GetShoppingCartAsync(), false);
product.AdditionalShippingCharge = 0M;
product.IsFreeShipping = true;
await _productService.UpdateProductAsync(product);
shipping.Should().NotBeNull();
//10 - default fixed shipping rate, 42.5 - additional shipping change
shipping.Should().Be(52.5M);
appliedDiscounts.Count.Should().Be(0);
//10 - default fixed tax rate
taxRate.Should().Be(10);
}
[Test]
public async Task CanGetShippingTotalWithFixedShippingRateIncludingTax()
{
var product = await _productService.GetProductBySkuAsync("FR_451_RB");
product.AdditionalShippingCharge = 21.25M;
product.IsFreeShipping = false;
await _productService.UpdateProductAsync(product);
var (shipping, taxRate, appliedDiscounts) =
await _orderTotalCalcService.GetShoppingCartShippingTotalAsync(await GetShoppingCartAsync(), true);
product.AdditionalShippingCharge = 0M;
product.IsFreeShipping = true;
await _productService.UpdateProductAsync(product);
shipping.Should().NotBeNull();
//10 - default fixed shipping rate, 42.5 - additional shipping change
shipping.Should().Be(57.75M);
appliedDiscounts.Count.Should().Be(0);
//10 - default fixed tax rate
taxRate.Should().Be(10);
}
[Test]
public async Task CanGetShippingTotalsWithFixedShippingRate()
{
var product = await _productService.GetProductBySkuAsync("FR_451_RB");
product.AdditionalShippingCharge = 21.25M;
product.IsFreeShipping = false;
await _productService.UpdateProductAsync(product);
var (shippingInclTax, shippingExclTax, taxRate, appliedDiscounts) =
await _orderTotalCalcService.GetShoppingCartShippingTotalsAsync(await GetShoppingCartAsync());
product.AdditionalShippingCharge = 0M;
product.IsFreeShipping = true;
await _productService.UpdateProductAsync(product);
shippingInclTax.Should().NotBeNull();
//10 - default fixed shipping rate, 42.5 - additional shipping change
shippingInclTax.Should().Be(57.75M);
appliedDiscounts.Count.Should().Be(0);
//10 - default fixed tax rate
taxRate.Should().Be(10);
shippingExclTax.Should().NotBeNull();
//10 - default fixed shipping rate, 42.5 - additional shipping change
shippingExclTax.Should().Be(52.5M);
}
[Test]
public async Task CanGetShippingTotalDiscountExcludingTax()
{
var product = await _productService.GetProductBySkuAsync("FR_451_RB");
product.AdditionalShippingCharge = 21.25M;
product.IsFreeShipping = false;
await _productService.UpdateProductAsync(product);
_discount.DiscountType = DiscountType.AssignedToShipping;
await _discountService.InsertDiscountAsync(_discount);
var (shipping, taxRate, appliedDiscounts) =
await _orderTotalCalcService.GetShoppingCartShippingTotalAsync(await GetShoppingCartAsync(), false);
await _discountService.DeleteDiscountAsync(_discount);
_discount.DiscountType = DiscountType.AssignedToOrderSubTotal;
product.AdditionalShippingCharge = 0M;
product.IsFreeShipping = true;
await _productService.UpdateProductAsync(product);
appliedDiscounts.Count.Should().Be(1);
appliedDiscounts.First().Name.Should().Be("Discount 1");
shipping.Should().NotBeNull();
//10 - default fixed shipping rate, 42.5 - additional shipping change, -3 - discount
shipping.Should().Be(49.5M);
//10 - default fixed tax rate
taxRate.Should().Be(10);
}
[Test]
public async Task CanGetShippingTotalDiscountIncludingTax()
{
var product = await _productService.GetProductBySkuAsync("FR_451_RB");
product.AdditionalShippingCharge = 21.25M;
product.IsFreeShipping = false;
await _productService.UpdateProductAsync(product);
_discount.DiscountType = DiscountType.AssignedToShipping;
await _discountService.InsertDiscountAsync(_discount);
var (shipping, taxRate, appliedDiscounts) =
await _orderTotalCalcService.GetShoppingCartShippingTotalAsync(await GetShoppingCartAsync(), true);
await _discountService.DeleteDiscountAsync(_discount);
_discount.DiscountType = DiscountType.AssignedToOrderSubTotal;
product.AdditionalShippingCharge = 0M;
product.IsFreeShipping = true;
await _productService.UpdateProductAsync(product);
appliedDiscounts.Count.Should().Be(1);
appliedDiscounts.First().Name.Should().Be("Discount 1");
shipping.Should().NotBeNull();
//10 - default fixed shipping rate, 42.5 - additional shipping change, -3 - discount
shipping.Should().Be(54.45M);
//10 - default fixed tax rate
taxRate.Should().Be(10);
}
[Test]
public async Task CanGetTaxTotal()
{
//207 - items, 10 - shipping (fixed), 20 - payment fee
TestPaymentMethod.AdditionalHandlingFee = 20M;
var product = await _productService.GetProductBySkuAsync("FR_451_RB");
product.IsFreeShipping = false;
await _productService.UpdateProductAsync(product);
//1. shipping is taxable, payment fee is taxable
_taxSettings.ShippingIsTaxable = true;
_taxSettings.PaymentMethodAdditionalFeeIsTaxable = true;
await _settingService.SaveSettingAsync(_taxSettings);
var (taxTotal, taxRates) = await GetService().GetTaxTotalAsync(await GetShoppingCartAsync());
taxTotal.Should().Be(23.7M);
taxRates.Should().NotBeNull();
taxRates.Count.Should().Be(1);
taxRates.ContainsKey(10).Should().BeTrue();
taxRates[10].Should().Be(23.7M);
//2. shipping is taxable, payment fee is not taxable
_taxSettings.PaymentMethodAdditionalFeeIsTaxable = false;
await _settingService.SaveSettingAsync(_taxSettings);
(taxTotal, taxRates) = await GetService().GetTaxTotalAsync(await GetShoppingCartAsync());
taxTotal.Should().Be(21.7M);
taxRates.Should().NotBeNull();
taxRates.Count.Should().Be(1);
taxRates.ContainsKey(10).Should().BeTrue();
taxRates[10].Should().Be(21.7M);
//3. shipping is not taxable, payment fee is taxable
_taxSettings.ShippingIsTaxable = false;
_taxSettings.PaymentMethodAdditionalFeeIsTaxable = true;
await _settingService.SaveSettingAsync(_taxSettings);
(taxTotal, taxRates) = await GetService().GetTaxTotalAsync(await GetShoppingCartAsync());
taxTotal.Should().Be(22.7M);
taxRates.Should().NotBeNull();
taxRates.Count.Should().Be(1);
taxRates.ContainsKey(10).Should().BeTrue();
taxRates[10].Should().Be(22.7M);
//4. shipping is not taxable, payment fee is not taxable
_taxSettings.ShippingIsTaxable = false;
_taxSettings.PaymentMethodAdditionalFeeIsTaxable = false;
await _settingService.SaveSettingAsync(_taxSettings);
(taxTotal, taxRates) = await GetService().GetTaxTotalAsync(await GetShoppingCartAsync());
taxTotal.Should().Be(20.7M);
taxRates.Should().NotBeNull();
taxRates.Count.Should().Be(1);
taxRates.ContainsKey(10).Should().BeTrue();
taxRates[10].Should().Be(20.7M);
TestPaymentMethod.AdditionalHandlingFee = 0M;
product = await _productService.GetProductBySkuAsync("FR_451_RB");
product.IsFreeShipping = false;
await _productService.UpdateProductAsync(product);
}
[Test]
public async Task CanGetShoppingCartTotalWithoutShippingRequired()
{
await TearDown();
await SetUp();
//shipping is taxable, payment fee is taxable
_taxSettings.ShippingIsTaxable = true;
_taxSettings.PaymentMethodAdditionalFeeIsTaxable = true;
await _settingService.SaveSettingAsync(_taxSettings);
TestPaymentMethod.AdditionalHandlingFee = 20M;
//207 - items, 20 - payment fee, 22.7 - tax
var (cartTotal, _, _, _, _, _) =
await _orderTotalCalcService.GetShoppingCartTotalAsync(await GetShoppingCartAsync());
cartTotal.Should().Be(249.7M);
TestPaymentMethod.AdditionalHandlingFee = 0M;
}
[Test]
public async Task CanGetShoppingCartTotalWithShippingRequired()
{
//shipping is taxable, payment fee is taxable
_taxSettings.ShippingIsTaxable = true;
_taxSettings.PaymentMethodAdditionalFeeIsTaxable = true;
await _settingService.SaveSettingAsync(_taxSettings);
var product = await _productService.GetProductBySkuAsync("FR_451_RB");
product.IsFreeShipping = false;
await _productService.UpdateProductAsync(product);
TestPaymentMethod.AdditionalHandlingFee = 20M;
//207 - items, 10 - shipping (fixed), 20 - payment fee, 23.7 - tax
var (cartTotal, _, _, _, _, _) =
await _orderTotalCalcService.GetShoppingCartTotalAsync(await GetShoppingCartAsync());
cartTotal.Should().Be(260.7M);
TestPaymentMethod.AdditionalHandlingFee = 0M;
product.IsFreeShipping = true;
await _productService.UpdateProductAsync(product);
}
[Test]
public async Task CanGetShoppingCartItemUnitPrice()
{
var items = await GetShoppingCartAsync();
var (unitPrice, _, _) = await _shoppingCartService.GetUnitPriceAsync(items[0], true);
unitPrice.Should().Be(new decimal(27.0));
}
[Test]
public async Task CanGetShoppingCartItemSubtotal()
{
var items = await GetShoppingCartAsync();
var (subTotal, _, _, _) = await _shoppingCartService.GetSubTotalAsync(items[0], true);
subTotal.Should().Be(new decimal(54.0));
}
[Test]
[TestCase(12.00009, 12.00)]
[TestCase(12.119, 12.12)]
[TestCase(12.115, 12.12)]
[TestCase(12.114, 12.11)]
public async Task TestGetUnitPriceWhenRoundPricesDuringCalculationIsTruePriceMustBeRounded(decimal inputPrice, decimal expectedPrice)
{
// arrange
var shoppingCartItem = await CreateTestShopCartItemAsync(inputPrice);
// act
_shoppingCartSettings.RoundPricesDuringCalculation = true;
await _settingService.SaveSettingAsync(_shoppingCartSettings);
var (resultPrice, _, _) = await GetService().GetUnitPriceAsync(shoppingCartItem, true);
// assert
resultPrice.Should().Be(expectedPrice);
}
[Test]
[TestCase(12.00009, 12.00009)]
[TestCase(12.119, 12.119)]
[TestCase(12.115, 12.115)]
[TestCase(12.114, 12.114)]
public async Task TestGetUnitPriceWhenNotRoundPricesDuringCalculationIsFalsePriceMustNotBeRounded(decimal inputPrice, decimal expectedPrice)
{
// arrange
var shoppingCartItem = await CreateTestShopCartItemAsync(inputPrice);
// act
_shoppingCartSettings.RoundPricesDuringCalculation = false;
await _settingService.SaveSettingAsync(_shoppingCartSettings);
var (resultPrice, _, _) = await GetService().GetUnitPriceAsync(shoppingCartItem, true);
// assert
resultPrice.Should().Be(expectedPrice);
}
[Test]
public async Task CanGetShoppingCartTotalDiscount()
{
_discount.DiscountType = DiscountType.AssignedToOrderTotal;
await _discountService.InsertDiscountAsync(_discount);
//shipping is taxable, payment fee is taxable
_taxSettings.ShippingIsTaxable = true;
_taxSettings.PaymentMethodAdditionalFeeIsTaxable = true;
await _settingService.SaveSettingAsync(_taxSettings);
TestPaymentMethod.AdditionalHandlingFee = 20M;
var product = await _productService.GetProductBySkuAsync("FR_451_RB");
product.IsFreeShipping = false;
await _productService.UpdateProductAsync(product);
//207 - items, 10 - shipping (fixed), 20 - payment fee, 23.7 - tax, [-3] - discount
var (scTotal, discountAmount, appliedDiscounts, _, _, _) = await GetService().GetShoppingCartTotalAsync(await GetShoppingCartAsync());
await _discountService.DeleteDiscountAsync(_discount);
_discount.DiscountType = DiscountType.AssignedToOrderSubTotal;
TestPaymentMethod.AdditionalHandlingFee = 0M;
product.IsFreeShipping = true;
await _productService.UpdateProductAsync(product);
scTotal.Should().Be(257.7M);
discountAmount.Should().Be(3);
appliedDiscounts.Count.Should().Be(1);
appliedDiscounts.First().Name.Should().Be("Discount 1");
}
[Test]
public async Task CanConvertRewardPointsToAmount()
{
_rewardPointsSettings.ExchangeRate = 15M;
await _settingService.SaveSettingAsync(_rewardPointsSettings);
var rewardPointsToAmount = await GetService().ConvertRewardPointsToAmountAsync(100);
_rewardPointsSettings.ExchangeRate = 1M;
await _settingService.SaveSettingAsync(_rewardPointsSettings);
rewardPointsToAmount.Should().Be(1500);
}
[Test]
public async Task CanCheckMinimumRewardPointsToUseRequirement()
{
_rewardPointsSettings.Enabled = true;
_rewardPointsSettings.MinimumRewardPointsToUse = 0;
await _settingService.SaveSettingAsync(_rewardPointsSettings);
GetService().CheckMinimumRewardPointsToUseRequirement(0).Should().BeTrue();
GetService().CheckMinimumRewardPointsToUseRequirement(1).Should().BeTrue();
GetService().CheckMinimumRewardPointsToUseRequirement(10).Should().BeTrue();
_rewardPointsSettings.MinimumRewardPointsToUse = 2;
await _settingService.SaveSettingAsync(_rewardPointsSettings);
GetService().CheckMinimumRewardPointsToUseRequirement(0).Should().BeFalse();
GetService().CheckMinimumRewardPointsToUseRequirement(1).Should().BeFalse();
GetService().CheckMinimumRewardPointsToUseRequirement(2).Should().BeTrue();
GetService().CheckMinimumRewardPointsToUseRequirement(10).Should().BeTrue();
}
}