def test_process_payment_return_request(rf): """ Order payment with default payment method with ``CustomPaymentProcessor`` should be deferred. Payment can't be processed if method doesn't have provider or provider is not enabled or payment method is not enabled. """ pm = PaymentMethod.objects.create( shop=get_default_shop(), name="Test method", enabled=False, tax_class=get_default_tax_class()) order = create_empty_order() order.payment_method = pm order.save() assert order.payment_status == PaymentStatus.NOT_PAID with pytest.raises(ValueError): # Can't process payment with unusable method order.payment_method.process_payment_return_request(order, rf.get("/")) assert order.payment_status == PaymentStatus.NOT_PAID pm.payment_processor = get_custom_payment_processor() pm.payment_processor.enabled = False pm.save() with pytest.raises(ValueError): # Can't process payment with unusable method order.payment_method.process_payment_return_request(order, rf.get("/")) assert order.payment_status == PaymentStatus.NOT_PAID pm.payment_processor.enabled = True pm.save() with pytest.raises(ValueError): # Can't process payment with unusable method order.payment_method.process_payment_return_request(order, rf.get("/")) assert order.payment_status == PaymentStatus.NOT_PAID pm.enabled = True pm.save() order.payment_method.process_payment_return_request(order, rf.get("/")) assert order.payment_status == PaymentStatus.DEFERRED
def test_refno_generation(method): for attempt in range(10): with override_settings(SHOOP_REFERENCE_NUMBER_METHOD=method): order = create_empty_order() order.save() assert order.reference_number with pytest.raises(ValueError): get_reference_number(order)
def test_custom_ident_generation(): methods = (custom_ident_gen, "%s.%s" % (__name__, custom_ident_gen.__name__)) for method in methods: with override_settings(SHOOP_ORDER_IDENTIFIER_METHOD=method): order = create_empty_order() order.save() assert order.identifier == custom_ident_gen(order) with pytest.raises(ValueError): get_order_identifier(order)
def test_custom_refno_generation(): methods = (custom_refno_gen, "%s.%s" % (__name__, custom_refno_gen.__name__)) for method in methods: with override_settings(SHOOP_REFERENCE_NUMBER_METHOD=method): order = create_empty_order() order.save() assert order.reference_number == custom_refno_gen(order) with pytest.raises(ValueError): get_reference_number(order)
def test_editing_existing_order(rf, admin_user): modifier = UserFactory() get_initial_order_status() # Needed for the API contact = create_random_person(locale="en_US", minimum_name_comp_len=5) state = get_frontend_order_state(contact=contact) shop = get_default_shop() order = create_empty_order(shop=shop) order.payment_data = {"payment_data": True} order.shipping_data = {"shipping_data": True} order.extra_data = {"external_id": "123"} order.save() assert order.lines.count() == 0 assert order.pk is not None assert order.modified_by == order.creator request = get_frontend_request_for_command(state, "finalize", modifier) response = OrderEditView.as_view()(request, pk=order.pk) assert_contains( response, "orderIdentifier") # this checks for status codes as a side effect data = json.loads(response.content.decode("utf8")) edited_order = Order.objects.get(pk=order.pk) # Re fetch the initial order # Check that identifiers has not changed assert edited_order.identifier == data[ "orderIdentifier"] == order.identifier assert edited_order.pk == order.pk # Check that the product content is updated based on state assert edited_order.lines.count() == 5 assert edited_order.customer == contact # Check that product line have right taxes for line in edited_order.lines.all(): if line.type == OrderLineType.PRODUCT: assert [line_tax.tax.code for line_tax in line.taxes.all()] == ["test_code"] assert line.taxful_price.amount > line.taxless_price.amount # Make sure order modification information is correct assert edited_order.modified_by != order.modified_by assert edited_order.modified_by == modifier assert edited_order.modified_on > order.modified_on # Make sure all non handled attributes is preserved from original order assert edited_order.creator == order.creator assert edited_order.ip_address == order.ip_address assert edited_order.orderer == order.orderer assert edited_order.customer_comment == order.customer_comment assert edited_order.marketing_permission == order.marketing_permission assert edited_order.order_date == order.order_date assert edited_order.status == order.status assert edited_order.payment_data == order.payment_data assert edited_order.shipping_data == order.shipping_data assert edited_order.extra_data == order.extra_data
def test_custom_ident_generation(): methods = ( custom_ident_gen, "%s.%s" % (__name__, custom_ident_gen.__name__) ) for method in methods: with override_settings(SHOOP_ORDER_IDENTIFIER_METHOD=method): order = create_empty_order() order.save() assert order.identifier == custom_ident_gen(order) with pytest.raises(ValueError): get_order_identifier(order)
def test_custom_refno_generation(): methods = ( custom_refno_gen, "%s.%s" % (__name__, custom_refno_gen.__name__) ) for method in methods: with override_settings(SHOOP_REFERENCE_NUMBER_METHOD=method): order = create_empty_order() order.save() assert order.reference_number == custom_refno_gen(order) with pytest.raises(ValueError): get_reference_number(order)
def test_empty_order(): order = create_empty_order() order.save() with pytest.raises(NoProductsToShipException): order.create_shipment_of_all_products() with pytest.raises(NoProductsToShipException): order.create_shipment(supplier=None, product_quantities={1: 0}) order.set_canceled() assert not order.can_set_complete(), "Can't process canceled order" order.set_canceled() # Again! (This should be a no-op) order.delete() assert order.pk and order.deleted, "Order is soft-deleted" order.delete() # Again! (This, too, should be a no-op)
def test_shipment_creation_with_invalid_unsaved_shipment(): shop = get_default_shop() supplier = get_default_supplier() order = _get_order(shop, supplier) second_order = create_empty_order(shop=shop) second_order.full_clean() second_order.save() product_lines = order.lines.exclude(product_id=None) for line in product_lines: for i in range(0, int(line.quantity)): with pytest.raises(AssertionError): unsaved_shipment = Shipment(supplier=supplier, order=second_order) order.create_shipment({line.product: 1}, shipment=unsaved_shipment) assert order.shipments.count() == 0
def test_editing_existing_order(rf, admin_user): modifier = UserFactory() get_initial_order_status() # Needed for the API contact = create_random_person(locale="en_US", minimum_name_comp_len=5) state = get_frontend_order_state(contact=contact) shop = get_default_shop() order = create_empty_order(shop=shop) order.payment_data = {"payment_data": True} order.shipping_data = {"shipping_data": True} order.extra_data = {"external_id": "123"} order.save() assert order.lines.count() == 0 assert order.pk is not None assert order.modified_by == order.creator request = get_frontend_request_for_command(state, "finalize", modifier) response = OrderEditView.as_view()(request, pk=order.pk) assert_contains(response, "orderIdentifier") # this checks for status codes as a side effect data = json.loads(response.content.decode("utf8")) edited_order = Order.objects.get(pk=order.pk) # Re fetch the initial order # Check that identifiers has not changed assert edited_order.identifier == data["orderIdentifier"] == order.identifier assert edited_order.pk == order.pk # Check that the product content is updated based on state assert edited_order.lines.count() == 5 assert edited_order.customer == contact # Check that product line have right taxes for line in edited_order.lines.all(): if line.type == OrderLineType.PRODUCT: assert [line_tax.tax.code for line_tax in line.taxes.all()] == ["test_code"] assert line.taxful_price.amount > line.taxless_price.amount # Make sure order modification information is correct assert edited_order.modified_by != order.modified_by assert edited_order.modified_by == modifier assert edited_order.modified_on > order.modified_on # Make sure all non handled attributes is preserved from original order assert edited_order.creator == order.creator assert edited_order.ip_address == order.ip_address assert edited_order.orderer == order.orderer assert edited_order.customer_comment == order.customer_comment assert edited_order.marketing_permission == order.marketing_permission assert edited_order.order_date == order.order_date assert edited_order.status == order.status assert edited_order.payment_data == order.payment_data assert edited_order.shipping_data == order.shipping_data assert edited_order.extra_data == order.extra_data
def test_known_extra_data(): order = create_empty_order() order.shipping_data = {"instruction": "Hello"} order.payment_data = {"ssn": "101010-010X"} order.extra_data = {"wrapping_color": "blue"} order.save() with override_settings( SHOOP_ORDER_KNOWN_SHIPPING_DATA_KEYS=[("instruction", "Instruction")], SHOOP_ORDER_KNOWN_PAYMENT_DATA_KEYS=[("ssn", "Social Security Number")], SHOOP_ORDER_KNOWN_EXTRA_DATA_KEYS=[("wrapping_color", "Wrapping Color")], ): known_data = dict(order.get_known_additional_data()) assert ("Instruction" in known_data) assert ("Social Security Number" in known_data) assert ("Wrapping Color" in known_data)
def test_line_discount(): order = create_empty_order(prices_include_tax=False) order.save() currency = order.shop.currency ol = OrderLine(order=order, type=OrderLineType.OTHER, quantity=5, text="Thing") ol.discount_amount = order.shop.create_price(50) ol.base_unit_price = order.shop.create_price(40) ol.save() ol.taxes.add(OrderLineTax.from_tax(get_default_tax(), ol.taxless_price.amount, order_line=ol)) assert ol.taxless_discount_amount == order.shop.create_price(50) assert ol.taxful_discount_amount == TaxfulPrice(75, currency) assert ol.taxless_price == order.shop.create_price(150) assert ol.taxful_price == TaxfulPrice(150 + 75, currency) assert ol.taxless_base_unit_price == order.shop.create_price(40) assert ol.taxful_base_unit_price == TaxfulPrice(60, currency) assert "Thing" in six.text_type(ol)
def _get_order(shop, supplier): order = create_empty_order(shop=shop) order.full_clean() order.save() for product_data in _get_product_data(): quantity = product_data.pop("quantity") product = create_product( sku=product_data.pop("sku"), shop=shop, supplier=supplier, default_price=3.33, **product_data) add_product_to_order(order, supplier, product, quantity=quantity, taxless_base_unit_price=1) order.cache_prices() order.check_all_verified() order.save() return order
def test_delete_toolbar_button(rf, admin_user, view_cls, get_method, method_attr): method = get_method() assert method.can_delete() view = view_cls.as_view() request = apply_request_middleware(rf.get("/"), user=admin_user) check_for_delete(view, request, method) # Create order for method and test the can_delete and edit view order = create_empty_order() setattr(order, method_attr, method) order.save() assert not method.can_delete() check_for_delete(view, request, method) # Make sure that the actual delete is also blocked with pytest.raises(ProtectedError): method.delete()
def test_line_discount_more(): order = create_empty_order() order.save() ol = OrderLine(order=order, type=OrderLineType.OTHER) ol.quantity = 5 ol.unit_price = TaxlessPrice(30) ol.total_discount = TaxlessPrice(50) ol.save() assert ol.taxless_unit_price == TaxlessPrice(30) assert ol.taxless_total_discount == TaxlessPrice(50) assert ol.taxless_total_price == TaxlessPrice(5 * 30 - 50) ol.taxes.add(OrderLineTax.from_tax(get_default_tax(), ol.taxless_total_price)) assert ol.taxless_total_discount == TaxlessPrice(50) assert ol.taxful_total_discount == TaxfulPrice(75) assert ol.taxless_total_price == TaxlessPrice(100) assert ol.taxful_total_price == TaxfulPrice(150) assert ol.taxless_unit_price == TaxlessPrice(30) assert ol.taxful_unit_price == TaxfulPrice(45)
def test_service_methods_with_long_name(rf): """ Make sure that service methods with long names (up to the max length of shipping or payment method names) don't cause exceptions when creating an order. """ MAX_LENGTH = 100 long_name = "X" * MAX_LENGTH assert len(long_name) == MAX_LENGTH sm = ShippingMethod.objects.language("en").create( shop=get_default_shop(), name=long_name, enabled=True, tax_class=get_default_tax_class()) pm = PaymentMethod.objects.language("en").create( shop=get_default_shop(), name=long_name, enabled=True, tax_class=get_default_tax_class()) order = create_empty_order() order.shipping_method = sm order.payment_method = pm order.full_clean() order.save()
def test_line_discount_more(): order = create_empty_order() order.save() ol = OrderLine(order=order, type=OrderLineType.OTHER) ol.quantity = 5 ol.base_unit_price = order.shop.create_price(30) ol.discount_amount = order.shop.create_price(50) ol.save() currency = order.shop.currency assert ol.taxless_base_unit_price == TaxlessPrice(30, currency) assert ol.taxless_discount_amount == TaxlessPrice(50, currency) assert ol.taxless_price == TaxlessPrice(5 * 30 - 50, currency) ol.taxes.add(OrderLineTax.from_tax(get_default_tax(), ol.taxless_price.amount, order_line=ol)) assert ol.taxless_discount_amount == TaxlessPrice(50, currency) assert ol.taxful_discount_amount == TaxfulPrice(75, currency) assert ol.taxless_price == TaxlessPrice(100, currency) assert ol.taxful_price == TaxfulPrice(150, currency) assert ol.taxless_base_unit_price == TaxlessPrice(30, currency) assert ol.taxful_base_unit_price == TaxfulPrice(45, currency)
def _get_order(shop, supplier): order = create_empty_order(shop=shop) order.full_clean() order.save() for product_data in _get_product_data(): quantity = product_data.pop("quantity") product = create_product(sku=product_data.pop("sku"), shop=shop, supplier=supplier, default_price=3.33, **product_data) add_product_to_order(order, supplier, product, quantity=quantity, taxless_base_unit_price=1) order.cache_prices() order.check_all_verified() order.save() return order
def test_line_discount_more(): order = create_empty_order() order.save() ol = OrderLine(order=order, type=OrderLineType.OTHER) ol.quantity = 5 ol.base_unit_price = order.shop.create_price(30) ol.discount_amount = order.shop.create_price(50) ol.save() currency = order.shop.currency assert ol.taxless_base_unit_price == TaxlessPrice(30, currency) assert ol.taxless_discount_amount == TaxlessPrice(50, currency) assert ol.taxless_price == TaxlessPrice(5 * 30 - 50, currency) ol.taxes.add(OrderLineTax.from_tax( get_default_tax(), ol.taxless_price.amount, order_line=ol)) assert ol.taxless_discount_amount == TaxlessPrice(50, currency) assert ol.taxful_discount_amount == TaxfulPrice(75, currency) assert ol.taxless_price == TaxlessPrice(100, currency) assert ol.taxful_price == TaxfulPrice(150, currency) assert ol.taxless_base_unit_price == TaxlessPrice(30, currency) assert ol.taxful_base_unit_price == TaxfulPrice(45, currency)
def test_line_discount(): order = create_empty_order() order.save() ol = OrderLine( order=order, type=OrderLineType.OTHER, quantity=5, text="Thing" ) ol.total_discount = TaxlessPrice(50) ol.unit_price = TaxlessPrice(40) ol.save() ol.taxes.add(OrderLineTax.from_tax(get_default_tax(), ol.taxless_total_price)) assert ol.taxless_total_discount == TaxlessPrice(50) assert ol.taxful_total_discount == TaxfulPrice(75) assert ol.taxless_total_price == TaxlessPrice(150) assert ol.taxful_total_price == TaxfulPrice(150 + 75) assert ol.taxless_unit_price == TaxlessPrice(40) assert ol.taxful_unit_price == TaxfulPrice(60) assert "Thing" in six.text_type(ol)
def test_line_discount(): order = create_empty_order(prices_include_tax=False) order.save() currency = order.shop.currency ol = OrderLine(order=order, type=OrderLineType.OTHER, quantity=5, text="Thing") ol.discount_amount = order.shop.create_price(50) ol.base_unit_price = order.shop.create_price(40) ol.save() ol.taxes.add( OrderLineTax.from_tax(get_default_tax(), ol.taxless_price.amount, order_line=ol)) assert ol.taxless_discount_amount == order.shop.create_price(50) assert ol.taxful_discount_amount == TaxfulPrice(75, currency) assert ol.taxless_price == order.shop.create_price(150) assert ol.taxful_price == TaxfulPrice(150 + 75, currency) assert ol.taxless_base_unit_price == order.shop.create_price(40) assert ol.taxful_base_unit_price == TaxfulPrice(60, currency) assert "Thing" in six.text_type(ol)
def test_anon_disabling(): with override_settings(SHOOP_ALLOW_ANONYMOUS_ORDERS=False): with pytest.raises(ValidationError): order = create_empty_order() order.save()