public void CalculateCostOfOrderWithSpeedyShipping()
        {
            _sizeCalculatorMock.Setup(c => c.CalculateParcelSizeFactor(It.IsAny <ParcelSize>())).Returns(ParcelSizeFactor.ExtraLarge);
            _parcelCostCalculatorMock.Setup(c => c.CalculateDeliveryCost(It.IsAny <ParcelSizeFactor>())).Returns(25m);
            _weightLimitCalculatorMock.Setup(c => c.CalculateWeightLimit(It.IsAny <ParcelSizeFactor>())).Returns(100);
            _overweightFeeCalculatorMock.Setup(c => c.CalculateOverWeightFee(It.IsAny <ParcelSizeFactor>())).Returns(0);

            var costCalculator = new OrderDeliveryCostCalculator(
                _sizeCalculatorMock.Object,
                _parcelCostCalculatorMock.Object,
                _weightLimitCalculatorMock.Object,
                _overweightFeeCalculatorMock.Object);

            var parcel1 = new Parcel(new ParcelSize(1, 1, 1), 1);
            var parcel2 = new Parcel(new ParcelSize(1, 1, 1), 1);
            var parcel3 = new Parcel(new ParcelSize(1, 1, 1), 1);

            var order = new Order(new List <Parcel>()
            {
                parcel1, parcel2, parcel3
            }).WithSpeedyShipping();

            var invoice = costCalculator.CalculateOrderDeliveryCost(order);

            Assert.IsNotNull(invoice);
            Assert.AreEqual(1, invoice.Services.Count);
            Assert.AreEqual(PostServiceType.SpeedyShipping, invoice.Services.First().ServiceType);
            Assert.AreEqual(75, invoice.Services.First().Cost);
            Assert.AreEqual(150, invoice.Total);
        }
        public void CalculateCostOfOrderWithMultipleParcels()
        {
            _sizeCalculatorMock.Setup(c => c.CalculateParcelSizeFactor(It.IsAny <ParcelSize>())).Returns(ParcelSizeFactor.ExtraLarge);
            _parcelCostCalculatorMock.Setup(c => c.CalculateDeliveryCost(It.IsAny <ParcelSizeFactor>())).Returns(25m);
            _weightLimitCalculatorMock.Setup(c => c.CalculateWeightLimit(It.IsAny <ParcelSizeFactor>())).Returns(100);
            _overweightFeeCalculatorMock.Setup(c => c.CalculateOverWeightFee(It.IsAny <ParcelSizeFactor>())).Returns(0);

            var costCalculator = new OrderDeliveryCostCalculator(
                _sizeCalculatorMock.Object,
                _parcelCostCalculatorMock.Object,
                _weightLimitCalculatorMock.Object,
                _overweightFeeCalculatorMock.Object);

            var parcel1 = new Parcel(new ParcelSize(1, 1, 1), 1);
            var parcel2 = new Parcel(new ParcelSize(1, 1, 1), 1);
            var parcel3 = new Parcel(new ParcelSize(1, 1, 1), 1);

            var order = new Order(new List <Parcel> {
                parcel1, parcel2, parcel3
            });

            var invoice = costCalculator.CalculateOrderDeliveryCost(order);

            Assert.IsNotNull(invoice);
            Assert.AreEqual(3, invoice.Parcels.Count);
            Assert.AreEqual(75, invoice.Total);
        }
        public void CalculateCostOfOrderWithOneParcel()
        {
            _sizeCalculatorMock.Setup(c => c.CalculateParcelSizeFactor(It.IsAny <ParcelSize>())).Returns(ParcelSizeFactor.ExtraLarge);
            _parcelCostCalculatorMock.Setup(c => c.CalculateDeliveryCost(It.IsAny <ParcelSizeFactor>())).Returns(25m);
            _weightLimitCalculatorMock.Setup(c => c.CalculateWeightLimit(It.IsAny <ParcelSizeFactor>())).Returns(100);
            _overweightFeeCalculatorMock.Setup(c => c.CalculateOverWeightFee(It.IsAny <ParcelSizeFactor>())).Returns(0);

            var costCalculator = new OrderDeliveryCostCalculator(
                _sizeCalculatorMock.Object,
                _parcelCostCalculatorMock.Object,
                _weightLimitCalculatorMock.Object,
                _overweightFeeCalculatorMock.Object);

            var order = new Order(new List <Parcel> {
                _dummyParcel
            });

            var invoice = costCalculator.CalculateOrderDeliveryCost(order);

            Assert.IsNotNull(invoice);
            Assert.AreEqual(order.Id, invoice.RelatedOrder.Id);
            Assert.AreEqual(1, invoice.Parcels.Count);
            Assert.AreEqual(25, invoice.Parcels.First().Cost);
            Assert.AreEqual(25, invoice.Total);
        }
        public void CalculateCostOfEmptyOrderWithSpeedyShipping()
        {
            var costCalculator = new OrderDeliveryCostCalculator(
                _sizeCalculatorMock.Object,
                _parcelCostCalculatorMock.Object,
                _weightLimitCalculatorMock.Object,
                _overweightFeeCalculatorMock.Object);

            var order = new Order(new List <Parcel>()).WithSpeedyShipping();

            var invoice = costCalculator.CalculateOrderDeliveryCost(order);

            Assert.IsNotNull(invoice);
            Assert.AreEqual(1, invoice.Services.Count);
            Assert.AreEqual(PostServiceType.SpeedyShipping, invoice.Services.First().ServiceType);
            Assert.AreEqual(0, invoice.Services.First().Cost);
            Assert.AreEqual(0, invoice.Total);
        }
        public void CalculateCostOfOverweightedParcel()
        {
            var costCalculator = new OrderDeliveryCostCalculator(
                _sizeCalculatorMock.Object,
                _parcelCostCalculatorMock.Object,
                _weightLimitCalculatorMock.Object,
                _overweightFeeCalculatorMock.Object);

            var overweightedParcel = new Parcel(new ParcelSize(1, 1, 1), 10);

            var overweightFee = 5m;
            var weightLimit   = 5;

            _sizeCalculatorMock.Setup(c => c.CalculateParcelSizeFactor(It.IsAny <ParcelSize>())).Returns(ParcelSizeFactor.Small);
            _parcelCostCalculatorMock.Setup(c => c.CalculateDeliveryCost(It.IsAny <ParcelSizeFactor>())).Returns(0);
            _weightLimitCalculatorMock.Setup(c => c.CalculateWeightLimit(It.IsAny <ParcelSizeFactor>())).Returns(weightLimit);
            _overweightFeeCalculatorMock.Setup(c => c.CalculateOverWeightFee(It.IsAny <ParcelSizeFactor>())).Returns(overweightFee);

            var deliverCost = costCalculator.CalculateParcelCost(overweightedParcel);

            Assert.AreEqual((overweightedParcel.Weight - weightLimit) * overweightFee, deliverCost);
        }