def test_order_creation_adds_usage(rf, admin_user): request, shop, group = initialize_test(rf, False) source = seed_source(admin_user, shop) source.add_line( type=OrderLineType.PRODUCT, product=get_default_product(), supplier=get_default_supplier(shop), quantity=1, base_unit_price=source.create_price(10), ) source.add_line( type=OrderLineType.OTHER, quantity=1, base_unit_price=source.create_price(10), require_verification=True, ) # add coupon coupon = Coupon.objects.create(active=True, code="asdf") campaign = BasketCampaign.objects.create(active=True, shop=shop, name="test", public_name="test", coupon=coupon) BasketDiscountPercentage.objects.create(campaign=campaign, discount_percentage="0.1") source.add_code(coupon.code) creator = OrderCreator() creator.create_order(source) assert CouponUsage.objects.count() == 1
def test_order_statuses(admin_user): create_default_order_statuses() source = seed_source(admin_user) source.add_line( type=OrderLineType.PRODUCT, product=get_default_product(), supplier=get_default_supplier(), quantity=1, base_unit_price=source.create_price(10), ) source.add_line( type=OrderLineType.OTHER, quantity=1, base_unit_price=source.create_price(10), require_verification=True, ) creator = OrderCreator() order = creator.create_order(source) # new order, status/role is new/initial assert order.status.identifier == DefaultOrderStatus.INITIAL.value assert order.status.role == OrderStatusRole.INITIAL # FUTURE: order gets payment the status changes to processing/processing total = order.taxful_total_price.amount order.create_payment(total) assert order.status.identifier == DefaultOrderStatus.INITIAL.value assert order.status.role == OrderStatusRole.INITIAL # FUTURE: order is fully shipped the status changes to complete/complete order.create_shipment_of_all_products() assert order.status.identifier == DefaultOrderStatus.INITIAL.value assert order.status.role == OrderStatusRole.INITIAL
def test_order_statuses(admin_user): create_default_order_statuses() source = seed_source(admin_user) source.add_line( type=OrderLineType.PRODUCT, product=get_default_product(), supplier=get_default_supplier(), quantity=1, base_unit_price=source.create_price(10), ) source.add_line( type=OrderLineType.OTHER, quantity=1, base_unit_price=source.create_price(10), require_verification=True, ) creator = OrderCreator() order = creator.create_order(source) # new order, status/role is new/initial assert order.status.identifier == DefaultOrderStatus.INITIAL.value assert order.status.role == OrderStatusRole.INITIAL # FUTURE: order gets payment the status changes to processing/processing total = order.taxful_total_price.amount order.create_payment(total) assert order.status.identifier == DefaultOrderStatus.INITIAL.value assert order.status.role == OrderStatusRole.INITIAL # FUTURE: order is fully shipped the status changes to complete/complete order.create_shipment_of_all_products() assert order.status.identifier == DefaultOrderStatus.INITIAL.value assert order.status.role == OrderStatusRole.INITIAL
def test_order_source(rf, admin_user): """ Test order source validation with stocked products. """ shop = get_default_shop() supplier = get_simple_supplier() product = create_product("simple-test-product", shop, supplier) product.stock_behavior = StockBehavior.STOCKED product.save() quantity = 345 supplier.adjust_stock(product.pk, quantity) assert supplier.get_stock_statuses([product.id])[product.id].logical_count == quantity assert not list(supplier.get_orderability_errors(product.get_shop_instance(shop), quantity, customer=None)) assert list(supplier.get_orderability_errors(product.get_shop_instance(shop), quantity+1, customer=None)) source = seed_source(admin_user, shop) source.add_line( type=OrderLineType.PRODUCT, product=product, supplier=supplier, quantity=quantity, base_unit_price=source.create_price(10), ) assert not list(source.get_validation_errors()) source.add_line( type=OrderLineType.PRODUCT, product=product, supplier=supplier, quantity=quantity, base_unit_price=source.create_price(10), ) assert list(source.get_validation_errors())
def test_order_creation_adds_usage(rf, admin_user): request, shop, group = initialize_test(rf, False) source = seed_source(admin_user) source.add_line( type=OrderLineType.PRODUCT, product=get_default_product(), supplier=get_default_supplier(), quantity=1, base_unit_price=source.create_price(10), ) source.add_line( type=OrderLineType.OTHER, quantity=1, base_unit_price=source.create_price(10), require_verification=True, ) # add coupon coupon = Coupon.objects.create(active=True, code="asdf") campaign = BasketCampaign.objects.create( active=True, shop=shop, name="test", public_name="test", coupon=coupon) BasketDiscountPercentage.objects.create(campaign=campaign, discount_percentage="0.1") source.add_code(coupon.code) creator = OrderCreator() creator.create_order(source) assert CouponUsage.objects.count() == 1
def test_discount_service_behavior(admin_user, get_service, service_attr): DISCOUNT_PERC = Decimal(8.0) PRODUCT_PRICE = Decimal(2.5) PRODUCT_QTNTY = 4 service = get_service() component = DiscountPercentageBehaviorComponent.objects.create(percentage=DISCOUNT_PERC) service.behavior_components.add(component) source = seed_source(admin_user) supplier = get_default_supplier() product = create_product( sku="39917329183", shop=source.shop, supplier=supplier, default_price=PRODUCT_PRICE ) source.add_line( type=OrderLineType.PRODUCT, product=product, supplier=supplier, quantity=PRODUCT_QTNTY, base_unit_price=source.create_price(PRODUCT_PRICE), ) setattr(source, service_attr, service) assert getattr(source, service_attr) == service assert service.behavior_components.count() == 1 costs = list(service.get_costs(source)) unavailability_reasons = list(service.get_unavailability_reasons(source)) assert not unavailability_reasons and costs assert len(costs) == 1 assert costs[0].price.value == (PRODUCT_QTNTY * PRODUCT_PRICE) * (-DISCOUNT_PERC) / Decimal(100.0)
def test_order_source(rf, admin_user): """ Test order source validation with stocked products. """ shop = get_default_shop() supplier = get_simple_supplier() product = create_product("simple-test-product", shop, supplier) quantity = 345 supplier.adjust_stock(product.pk, quantity) assert supplier.get_stock_statuses([product.id])[product.id].logical_count == quantity assert not list(supplier.get_orderability_errors(product.get_shop_instance(shop), quantity, customer=None)) assert list(supplier.get_orderability_errors(product.get_shop_instance(shop), quantity+1, customer=None)) source = seed_source(admin_user, shop) source.add_line( type=OrderLineType.PRODUCT, product=product, supplier=supplier, quantity=quantity, base_unit_price=source.create_price(10), ) assert not list(source.get_validation_errors()) source.add_line( type=OrderLineType.PRODUCT, product=product, supplier=supplier, quantity=quantity, base_unit_price=source.create_price(10), ) assert list(source.get_validation_errors())
def test_discount_service_behavior(admin_user, get_service, service_attr): DISCOUNT_PERC = Decimal(8.0) PRODUCT_PRICE = Decimal(2.5) PRODUCT_QTNTY = 4 service = get_service() component = DiscountPercentageBehaviorComponent.objects.create( percentage=DISCOUNT_PERC) service.behavior_components.add(component) source = seed_source(admin_user) supplier = get_default_supplier() product = create_product(sku="39917329183", shop=source.shop, supplier=supplier, default_price=PRODUCT_PRICE) source.add_line( type=OrderLineType.PRODUCT, product=product, supplier=supplier, quantity=PRODUCT_QTNTY, base_unit_price=source.create_price(PRODUCT_PRICE), ) setattr(source, service_attr, service) assert getattr(source, service_attr) == service assert service.behavior_components.count() == 1 costs = list(service.get_costs(source)) unavailability_reasons = list(service.get_unavailability_reasons(source)) assert not unavailability_reasons and costs assert len(costs) == 1 assert costs[0].price.value == (PRODUCT_QTNTY * PRODUCT_PRICE) * ( -DISCOUNT_PERC) / Decimal(100.0)
def test_correios_delivery_time_2(rf, admin_user): with patch.object(CorreiosWS, 'get_preco_prazo', return_value=MOCKED_SUCCESS_RESULT): pac_carrier = get_correios_carrier_2() contact = get_person_contact(admin_user) p1 = create_product(sku='p1', supplier=get_default_supplier(), width=400, depth=400, height=400, gross_weight=1250) # P2 é pesado pacas - é empacotado em uma caixa separada # só para dar problema na metade da entrega p2 = create_product(sku='p2', supplier=get_default_supplier(), width=400, depth=400, height=400, gross_weight=31250) source = seed_source(admin_user) source.add_line( type=OrderLineType.PRODUCT, product=p1, supplier=get_default_supplier(), quantity=2, base_unit_price=source.create_price(10)) source.add_line( type=OrderLineType.PRODUCT, product=p2, supplier=get_default_supplier(), quantity=1, base_unit_price=source.create_price(20)) billing_address = get_address() shipping_address = get_address(name="My House", country='BR') shipping_address.postal_code = "89070210" source.billing_address = billing_address source.shipping_address = shipping_address source.customer = contact shipping = ShippingMethod.objects.filter(carrier=pac_carrier).first() bc = shipping.behavior_components.first() packages = bc._pack_source(source) assert len(packages) == 3 results = bc._get_correios_results(source, packages) assert len(results) == 3
def test_correios_delivery_time_1(rf, admin_user): with patch.object(CorreiosWS, 'get_preco_prazo', return_value=MOCKED_SUCCESS_RESULT): pac_carrier = get_correios_carrier_2() contact = get_person_contact(admin_user) p1 = create_product(sku='p1', supplier=get_default_supplier(), width=400, depth=400, height=400, gross_weight=1250) source = seed_source(admin_user) source.add_line( type=OrderLineType.PRODUCT, product=p1, supplier=get_default_supplier(), quantity=1, base_unit_price=source.create_price(10)) billing_address = get_address() shipping_address = get_address(name="My House", country='BR') shipping_address.postal_code = "89070210" source.billing_address = billing_address source.shipping_address = shipping_address source.customer = contact bc = ShippingMethod.objects.filter(carrier=pac_carrier).first().behavior_components.first() packages = bc._pack_source(source) assert len(packages) == 1 results = bc._get_correios_results(source, packages) assert len(results) == 1 assert results[0].erro == 0 assert results[0].valor > Decimal(0) delivery_time = bc.get_delivery_time(ShippingMethod.objects.filter(carrier=pac_carrier).first(), source) assert delivery_time is not None assert delivery_time.max_duration == delivery_time.min_duration assert delivery_time.max_duration.days == results[0].prazo_entrega + bc.additional_delivery_time costs = list(bc.get_costs(ShippingMethod.objects.filter(carrier=pac_carrier).first(), source)) assert len(costs) == 1 assert source.create_price(results[0].valor + bc.additional_price) == costs[0].price