def test_shipped_orders_cannot_be_shipped_again(self):
        initialOrder = Order()
        initialOrder.set_id(1)
        initialOrder.set_status(OrderStatus.SHIPPED)
        self.order_repository.add_order(initialOrder)

        request = OrderShipmentRequest()
        request.set_order_id(1)

        assert_that(
            calling(self.use_case.run).with_args(request),
            raises(OrderCannotBeShippedTwiceError))
        assert_that(self.order_repository.get_saved_order(), is_(none()))
        assert_that(self.shipment_service.get_shipped_order(), is_(none()))
    def test_shipped_orders_cannot_be_rejected(self):
        initial_order = Order()
        initial_order.set_status(OrderStatus.SHIPPED)
        initial_order.set_id(1)
        self.order_repository.add_order(initial_order)

        request = OrderApprovalRequest()
        request.set_order_id(1)
        request.set_approved(False)

        assert_that(
            calling(self.use_case.run).with_args(request),
            raises(ShippedOrdersCannotBeChangedError))
        assert_that(self.order_repository.get_saved_order(), is_(none()))
    def test_cannot_approve_rejected_order(self):
        initial_order = Order()
        initial_order.set_status(OrderStatus.REJECTED)
        initial_order.set_id(1)
        self.order_repository.add_order(initial_order)

        request = OrderApprovalRequest()
        request.set_order_id(1)
        request.set_approved(True)

        assert_that(
            calling(self.use_case.run).with_args(request),
            raises(RejectedOrderCannotBeApprovedError))
        assert_that(self.order_repository.get_saved_order(), is_(none()))
    def test_rejected_existing_order(self):
        initial_order = Order()
        initial_order.set_status(OrderStatus.CREATED)
        initial_order.set_id(1)
        self.order_repository.add_order(initial_order)

        request = OrderApprovalRequest()
        request.set_order_id(1)
        request.set_approved(False)

        self.use_case.run(request)

        saved_order = self.order_repository.get_saved_order()
        assert_that(saved_order.get_status(), is_(OrderStatus.REJECTED))
    def test_ship_approved_order(self):
        initial_order = Order()
        initial_order.set_id(1)
        initial_order.set_status(OrderStatus.APPROVED)
        self.order_repository.add_order(initial_order)

        request = OrderShipmentRequest()
        request.set_order_id(1)

        self.use_case.run(request)

        assert_that(self.order_repository.get_saved_order().get_status(),
                    is_(OrderStatus.SHIPPED))
        assert_that(self.shipment_service.get_shipped_order(),
                    is_(initial_order))
예제 #6
0
    def run(self, request: SellItemsRequest):
        order = Order()
        order.set_status(OrderStatus.CREATED)
        order.set_items([])
        order.set_currency("EUR")
        order.set_total(Decimal("0.00"))
        order.set_tax(Decimal("0.00"))

        for item_request in request.get_requests():
            product = self.product_catalog.get_by_name(
                item_request.get_product_name())

            if product is None:
                raise UnknownProductError()
            else:
                unitary_tax = Decimal(
                    product.get_price() / Decimal(100) *
                    product.get_category().get_tax_percentage()).quantize(
                        Decimal('0.01'), rounding=ROUND_HALF_UP)
                unitary_taxed_amount = Decimal(product.get_price() +
                                               unitary_tax).quantize(
                                                   Decimal('0.01'),
                                                   rounding=ROUND_HALF_UP)
                taxed_amount = Decimal(
                    unitary_taxed_amount *
                    Decimal(item_request.get_quantity())).quantize(
                        Decimal('0.01'), rounding=ROUND_HALF_UP)
                tax_amount = unitary_tax * (Decimal(
                    item_request.get_quantity()))

                orderItem = OrderItem()
                orderItem.set_product(product)
                orderItem.set_quantity(item_request.get_quantity())
                orderItem.set_tax(tax_amount)
                orderItem.set_taxed_amount(taxed_amount)
                order.get_items().append(orderItem)

                order.set_total(order.get_total() + taxed_amount)
                order.set_tax(order.get_tax() + tax_amount)

        self.order_repository.save(order)