def test_basket_partial_quantity_update(): request = get_request_with_basket() basket = request.basket product = get_default_product() sales_unit = SalesUnit.objects.create(identifier="test-sales-partial", decimals=2, name="Partial unit") product.sales_unit = sales_unit # Set the sales unit for the product product.save() basket_commands.handle_add(request, basket, product_id=product.pk, quantity=1.5) assert basket.product_count == 1.5 line_id = basket.get_lines()[0].line_id basket_commands.handle_update(request, basket, **{"q_%s" % line_id: "1.5"}) assert basket.product_count == 1.5 basket_commands.handle_update(request, basket, **{"q_%s" % line_id: "3.5"}) assert basket.product_count == 3.5 basket_commands.handle_update(request, basket, **{"q_%s" % line_id: "3.0"}) assert basket.product_count == 3.0 basket_commands.handle_update(request, basket, **{"q_%s" % line_id: "4"}) assert basket.product_count == 4 basket_commands.handle_update(request, basket, **{"delete_%s" % line_id: "1"}) assert basket.product_count == 0
def test_basket_update_errors(): request = get_request_with_basket() basket = request.basket product = get_default_product() basket_commands.handle_add(request, basket, product_id=product.pk, quantity=1) # Hide product and now updating quantity should give errors shop_product = product.get_shop_instance(request.shop) shop_product.suppliers.clear() line_id = basket.get_lines()[0].line_id basket_commands.handle_update(request, basket, **{"q_%s" % line_id: "2"}) error_messages = messages.get_messages(request) # One warning is added to messages assert len(error_messages) == 1 assert any("not supplied" in msg.message for msg in error_messages) shop_product.visible = False shop_product.save() basket_commands.handle_update(request, basket, **{"q_%s" % line_id: "2"}) error_messages = messages.get_messages(request) # Two warnings is added to messages assert len(error_messages) == 3 assert any("not visible" in msg.message for msg in error_messages) assert all("[" not in msg.message for msg in error_messages)
def test_basket_update(): request = get_request_with_basket() basket = request.basket product = get_default_product() basket_commands.handle_add(request, basket, product_id=product.pk, quantity=1) assert basket.product_count == 1 line_id = basket.get_lines()[0].line_id basket_commands.handle_update(request, basket, **{"q_%s" % line_id: "2"}) assert basket.product_count == 2 basket_commands.handle_update(request, basket, **{"delete_%s" % line_id: "1"}) assert basket.product_count == 0
def partial_update(self, request, *args, **kwargs): serializer = self.get_serializer_class()(data=request.data) if serializer.is_valid(raise_exception=True): # super weird, sorry for that - it's the implementation of their basket thing update_command = 'q_{}'.format(kwargs['line_id']) update_args = { update_command: serializer.validated_data['quantity'] } handle_update(request, request.basket, **update_args) request.basket.save() new_basket = self.get_basket() return Response(APIBasketSerializer(new_basket, context={'request': self.request}).data)
def test_basket_update(): request = get_request_with_basket() basket = request.basket product = create_product('fractionable', fractional=True) complete_product(product) basket_commands.handle_add(request, basket, product_id=product.pk, quantity=1.75) assert basket.product_count == 1.75 line_id = basket.get_lines()[0].line_id basket_commands.handle_update(request, basket, **{"q_%s" % line_id: "2"}) assert basket.product_count == 2 basket_commands.handle_update(request, basket, **{"delete_%s" % line_id: "1"}) assert basket.product_count == 0
def test_basket_update_with_discount(): supplier = get_default_supplier() request = get_request_with_basket() basket = request.basket default_price = 10 product = create_product('fractionable', fractional=True, default_price=default_price, shop=basket.shop, supplier=supplier) discount_amount_value = 4 basket_rule1 = BasketTotalAmountCondition.objects.create(value="2") campaign = BasketCampaign.objects.create(shop=basket.shop, public_name="test", name="test", active=True) campaign.conditions.add(basket_rule1) campaign.save() BasketDiscountAmount.objects.create(campaign=campaign, discount_amount=discount_amount_value) #basket_commands.handle_add(request, basket, product_id=product.pk, quantity=1) basket.add_line( line_id="product-line", type=OrderLineType.PRODUCT, product=product, supplier=supplier, quantity=1, shop=basket.shop, ) line_id = basket.get_lines()[0].line_id basket_commands.handle_update(request, basket, **{"q_%s" % line_id: "2"}) basket.uncache() assert basket.product_count == 2 assert OrderLineType.DISCOUNT in [l.type for l in basket.get_final_lines()] basket.clear_all() basket.add_line(line_id="product-line", type=OrderLineType.PRODUCT, product=product, supplier=supplier, quantity=1, shop=basket.shop, on_parent_change_behavior=OrderLineBehavior.SKIP) line_id = basket.get_lines()[0].line_id basket_commands.handle_update(request, basket, **{"q_%s" % line_id: "3"}) assert basket.product_count == 1 basket.clear_all() basket.add_line(line_id="product-line", type=OrderLineType.PRODUCT, product=product, supplier=supplier, quantity=1, shop=basket.shop, on_parent_change_behavior=OrderLineBehavior.DELETE) line_id = basket.get_lines()[0].line_id basket_commands.handle_update(request, basket, **{"q_%s" % line_id: "4"}) assert basket.product_count == 0
def test_basket_update_with_package_product(): if "shuup.simple_supplier" not in settings.INSTALLED_APPS: pytest.skip("Need shuup.simple_supplier in INSTALLED_APPS") from shuup_tests.simple_supplier.utils import get_simple_supplier request = get_request_with_basket() basket = request.basket shop = get_default_shop() supplier = get_simple_supplier() parent, child = get_unstocked_package_product_and_stocked_child(shop, supplier, child_logical_quantity=2) # There should be enough stock for 1 parent and 1 extra child, each of quantity 1 basket_commands.handle_add(request, basket, product_id=parent.pk, quantity=1) assert basket.product_count == 1 basket_commands.handle_add(request, basket, product_id=child.pk, quantity=1) assert basket.product_count == 2 assert not messages.get_messages(request) basket_lines = {line.product.id: line for line in basket.get_lines()} package_line = basket_lines[parent.id] extra_child_line = basket_lines[child.id] # Trying to increase package product line quantity should fail, with error message basket_commands.handle_update(request, basket, **{"q_%s" % package_line.line_id: "2"}) assert basket.product_count == 2 assert len(messages.get_messages(request)) == 1 # So should increasing the extra child line quantity basket_commands.handle_update(request, basket, **{"q_%s" % extra_child_line.line_id: "2"}) assert basket.product_count == 2 assert len(messages.get_messages(request)) == 2 # However, if we delete the parent line, we can increase the extra child basket_commands.handle_update(request, basket, **{"delete_%s" % package_line.line_id: "1"}) assert basket.product_count == 1 basket_commands.handle_update(request, basket, **{"q_%s" % extra_child_line.line_id: "2"}) assert basket.product_count == 2 # Resetting to original basket contents basket_commands.handle_update(request, basket, **{"q_%s" % extra_child_line.line_id: "1"}) basket_commands.handle_add(request, basket, product_id=parent.pk, quantity=1) basket_lines = {line.product.id: line for line in basket.get_lines()} package_line = basket_lines[parent.id] # Package line will have a new ID assert basket.product_count == 2 # Like above, delete the child line and we can now increase the parent basket_commands.handle_update(request, basket, **{"delete_%s" % extra_child_line.line_id: "1"}) assert basket.product_count == 1 basket_commands.handle_update(request, basket, **{"q_%s" % package_line.line_id: "2"}) assert basket.product_count == 2
def test_basket_update_with_package_product(): if "shuup.simple_supplier" not in settings.INSTALLED_APPS: pytest.skip("Need shuup.simple_supplier in INSTALLED_APPS") from shuup_tests.simple_supplier.utils import get_simple_supplier request = get_request_with_basket() basket = request.basket shop = get_default_shop() supplier = get_simple_supplier() parent, child = get_unstocked_package_product_and_stocked_child( shop, supplier, child_logical_quantity=2) # There should be enough stock for 1 parent and 1 extra child, each of quantity 1 basket_commands.handle_add(request, basket, product_id=parent.pk, quantity=1) assert basket.product_count == 1 basket_commands.handle_add(request, basket, product_id=child.pk, quantity=1) assert basket.product_count == 2 assert not messages.get_messages(request) basket_lines = {line.product.id: line for line in basket.get_lines()} package_line = basket_lines[parent.id] extra_child_line = basket_lines[child.id] # Trying to increase package product line quantity should fail, with error message basket_commands.handle_update(request, basket, **{"q_%s" % package_line.line_id: "2"}) assert basket.product_count == 2 assert len(messages.get_messages(request)) == 1 # So should increasing the extra child line quantity basket_commands.handle_update(request, basket, **{"q_%s" % extra_child_line.line_id: "2"}) assert basket.product_count == 2 assert len(messages.get_messages(request)) == 2 # However, if we delete the parent line, we can increase the extra child basket_commands.handle_update(request, basket, **{"delete_%s" % package_line.line_id: "1"}) assert basket.product_count == 1 basket_commands.handle_update(request, basket, **{"q_%s" % extra_child_line.line_id: "2"}) assert basket.product_count == 2 # Resetting to original basket contents basket_commands.handle_update(request, basket, **{"q_%s" % extra_child_line.line_id: "1"}) basket_commands.handle_add(request, basket, product_id=parent.pk, quantity=1) basket_lines = {line.product.id: line for line in basket.get_lines()} package_line = basket_lines[parent.id] # Package line will have a new ID assert basket.product_count == 2 # Like above, delete the child line and we can now increase the parent basket_commands.handle_update( request, basket, **{"delete_%s" % extra_child_line.line_id: "1"}) assert basket.product_count == 1 basket_commands.handle_update(request, basket, **{"q_%s" % package_line.line_id: "2"}) assert basket.product_count == 2 # Clear basket basket_commands.handle_clear(request, basket) assert basket.product_count == 0 # Remove the Shop Product from the child child.get_shop_instance(shop).delete() # Child not available for this shop with pytest.raises(ProductNotOrderableProblem): basket_commands.handle_add(request, basket, product_id=parent.pk, quantity=1) # use the update methods object to check orderability errors update_methods = BasketUpdateMethods(request, basket) errors = update_methods._get_orderability_errors(parent, supplier, 1) assert len(errors) == 2 assert any( ["product_not_available_in_shop" in error.code for error in errors])
def test_basket_update_with_package_product(): if "shuup.simple_supplier" not in settings.INSTALLED_APPS: pytest.skip("Need shuup.simple_supplier in INSTALLED_APPS") from shuup_tests.simple_supplier.utils import get_simple_supplier request = get_request_with_basket() basket = request.basket shop = get_default_shop() supplier = get_simple_supplier() parent, child = get_unstocked_package_product_and_stocked_child(shop, supplier, child_logical_quantity=2) # There should be enough stock for 1 parent and 1 extra child, each of quantity 1 basket_commands.handle_add(request, basket, product_id=parent.pk, quantity=1) assert basket.product_count == 1 basket_commands.handle_add(request, basket, product_id=child.pk, quantity=1) assert basket.product_count == 2 assert not messages.get_messages(request) basket_lines = {line.product.id: line for line in basket.get_lines()} package_line = basket_lines[parent.id] extra_child_line = basket_lines[child.id] # Trying to increase package product line quantity should fail, with error message basket_commands.handle_update(request, basket, **{"q_%s" % package_line.line_id: "2"}) assert basket.product_count == 2 assert len(messages.get_messages(request)) == 1 # So should increasing the extra child line quantity basket_commands.handle_update(request, basket, **{"q_%s" % extra_child_line.line_id: "2"}) assert basket.product_count == 2 assert len(messages.get_messages(request)) == 2 # However, if we delete the parent line, we can increase the extra child basket_commands.handle_update(request, basket, **{"delete_%s" % package_line.line_id: "1"}) assert basket.product_count == 1 basket_commands.handle_update(request, basket, **{"q_%s" % extra_child_line.line_id: "2"}) assert basket.product_count == 2 # Resetting to original basket contents basket_commands.handle_update(request, basket, **{"q_%s" % extra_child_line.line_id: "1"}) basket_commands.handle_add(request, basket, product_id=parent.pk, quantity=1) basket_lines = {line.product.id: line for line in basket.get_lines()} package_line = basket_lines[parent.id] # Package line will have a new ID assert basket.product_count == 2 # Like above, delete the child line and we can now increase the parent basket_commands.handle_update(request, basket, **{"delete_%s" % extra_child_line.line_id: "1"}) assert basket.product_count == 1 basket_commands.handle_update(request, basket, **{"q_%s" % package_line.line_id: "2"}) assert basket.product_count == 2 # Clear basket basket_commands.handle_clear(request, basket) assert basket.product_count == 0 # Remove the Shop Product from the child child.get_shop_instance(shop).delete() # Child not available for this shop with pytest.raises(ProductNotOrderableProblem): basket_commands.handle_add(request, basket, product_id=parent.pk, quantity=1) # use the update methods object to check orderability errors update_methods = BasketUpdateMethods(request, basket) errors = update_methods._get_orderability_errors(parent, supplier, 1) assert len(errors) == 2 assert any(["product_not_available_in_shop" in error.code for error in errors])