Exemple #1
0
        public void Given_ParcelWithFastDeliveryOption_Should_ReturnValidResultWithCorrectTotalPrice()
        {
            //Arrange
            var parcelMetadataProvider = new Mock <IParcelMetadataProvider>();

            parcelMetadataProvider.Setup(x => x.ResolveParcelMetadata(It.IsAny <Parcel>()))
            .Returns(new ParcelMetadata(ParcelType.Small, 10, 10, 2));

            var weightCostCalculator = new Mock <IWeightCostCalculator>();

            weightCostCalculator.Setup(y => y.GetCost(It.IsAny <decimal>(), It.IsAny <decimal>(), It.IsAny <decimal>()))
            .Returns(20);

            var discountCalculator = new Mock <IDiscountCalculator>();

            discountCalculator.Setup(x => x.CalculateDiscount(It.IsAny <IEnumerable <ParcelDeliveryCost> >()))
            .Returns(new List <DeliveryDiscount>());

            var sut = new ParcelPriceCalculator(parcelMetadataProvider.Object, discountCalculator.Object,
                                                weightCostCalculator.Object);
            var parcel = new Parcel(10, 10, 10, 10);

            //Act
            var result = sut.Calculate(parcel, d => d.WithFastDelivery());

            //Assert
            result.Should().NotBeNull();
            result.DeliveryCost.Should().Be(30);
            result.TotalCost.Should().Be(60);
            result.FastDeliveryCost.Should().Be(30);
        }
Exemple #2
0
        Given_ListOfParcelsWithFastDeliveryOptionAndEligibleDiscounts_Should_ReturnValidResultWithCorrectTotalPrice()
        {
            //Arrange
            var parcel1 = new Parcel(10, 10, 10, 10);
            var parcel2 = new Parcel(10, 10, 10, 60);

            var parcelMetadataProvider = new Mock <IParcelMetadataProvider>();

            parcelMetadataProvider.Setup(x => x.ResolveParcelMetadata(It.Is <Parcel>(p => p.Weight == parcel1.Weight)))
            .Returns(new ParcelMetadata(ParcelType.Small, 10, 10, 2));

            parcelMetadataProvider.Setup(x => x.ResolveParcelMetadata(It.Is <Parcel>(p => p.Weight == parcel2.Weight)))
            .Returns(new ParcelMetadata(ParcelType.Heavy, 50, 50, 1));

            var weightCostCalculator = new Mock <IWeightCostCalculator>();

            weightCostCalculator.Setup(y => y.GetCost(It.IsAny <decimal>(), It.IsAny <decimal>(), It.IsAny <decimal>()))
            .Returns(20);

            var discountCalculator = new Mock <IDiscountCalculator>();

            discountCalculator.Setup(x => x.CalculateDiscount(It.IsAny <IEnumerable <ParcelDeliveryCost> >()))
            .Returns(new List <DeliveryDiscount> {
                new DeliveryDiscount("Delivery Discount for Small Parcel", 5m)
            });

            var sut = new ParcelPriceCalculator(parcelMetadataProvider.Object, discountCalculator.Object,
                                                weightCostCalculator.Object);

            //Act
            var result = sut.Calculate(new[] { parcel1, parcel2 }, options => options.WithFastDelivery());

            //Assert
            result.Should().NotBeNull();
            result.DeliveryDiscounts.Should().HaveCount(1);
            result.ParcelDeliveryCosts.Should().HaveCount(2)
            .And.Contain(m =>
                         m.ParcelName == "Parcel #0, Small Parcel" && m.ParcelType == ParcelType.Small &&
                         m.Cost == 30m) // Parcel + Overweight
            .And.Contain(m =>
                         m.ParcelName == "Parcel #1, Heavy Parcel" && m.ParcelType == ParcelType.Heavy &&
                         m.Cost == 70m); // Parcel + Overweight

            result.FastDeliveryCost.Should().Be(95);
            result.TotalCost.Should().Be(190);
        }