def test_order_payment_flow(request_cart_with_item, client, address, shipping_zone): request_cart_with_item.shipping_address = address request_cart_with_item.billing_address = address.get_copy() request_cart_with_item.email = '*****@*****.**' request_cart_with_item.shipping_method = ( shipping_zone.shipping_methods.first()) request_cart_with_item.save() order = create_order(request_cart_with_item, 'tracking_code', discounts=None, taxes=None) # Select payment method url = reverse('order:payment', kwargs={'token': order.token}) data = {'method': 'default'} response = client.post(url, data, follow=True) assert len(response.redirect_chain) == 1 assert response.status_code == 200 redirect_url = reverse('order:payment', kwargs={ 'token': order.token, 'variant': 'default' }) assert response.request['PATH_INFO'] == redirect_url # Go to payment details page, enter payment data data = { 'status': PaymentStatus.PREAUTH, 'fraud_status': FraudStatus.UNKNOWN, 'gateway_response': '3ds-disabled', 'verification_result': 'waiting' } response = client.post(redirect_url, data) assert response.status_code == 302 redirect_url = reverse('order:payment-success', kwargs={'token': order.token}) assert get_redirect_location(response) == redirect_url # Complete payment, go to checkout success page data = {'status': 'ok'} response = client.post(redirect_url, data) assert response.status_code == 302 redirect_url = reverse('order:checkout-success', kwargs={'token': order.token}) assert get_redirect_location(response) == redirect_url # Assert that payment object was created and contains correct data payment = order.payments.all()[0] assert payment.total == order.total.gross.amount assert payment.tax == order.total.tax.amount assert payment.currency == order.total.currency assert payment.delivery == order.shipping_price.net.amount assert len(payment.get_purchased_items()) == len(order.lines.all())
def test_view_product_variant_edit(admin_client, product): variant = product.variants.get() url = reverse('dashboard:variant-update', kwargs={ 'product_pk': product.pk, 'variant_pk': variant.pk }) data = { 'sku': 'ABC', 'price_override': '', 'quantity': 10, 'cost_price': '' } response = admin_client.post(url, data) assert response.status_code == 302 variant = product.variants.last() assert get_redirect_location(response) == reverse( 'dashboard:variant-details', kwargs={ 'product_pk': product.pk, 'variant_pk': variant.pk }) assert variant.sku == 'ABC'
def test_view_product_type_edit_to_no_variants_valid(admin_client, product): product_type = ProductType.objects.create(name='New product type', has_variants=True) product.product_type = product_type product.save() url = reverse('dashboard:product-type-update', kwargs={'pk': product_type.pk}) # When all products have only one variant you can change # has_variants to false data = { 'name': product_type.name, 'product_attributes': product_type.product_attributes.values_list('pk', flat=True), 'variant_attributes': product_type.variant_attributes.values_list('pk', flat=True), 'has_variants': False, 'weight': ['3.47'] } response = admin_client.post(url, data) assert response.status_code == 302 assert get_redirect_location(response) == url product_type.refresh_from_db() assert not product_type.has_variants assert product.variants.count() == 1
def test_view_remove_draft_order(admin_client, draft_order): url = reverse( 'dashboard:draft-order-delete', kwargs={'order_pk': draft_order.pk}) response = admin_client.post(url, {}) assert response.status_code == 302 assert get_redirect_location(response) == reverse('dashboard:orders') assert Order.objects.count() == 0
def test_view_product_select_type(admin_client, product_type): url = reverse('dashboard:product-add-select-type') data = {'product_type': product_type.pk} response = admin_client.post(url, data) assert get_redirect_location(response) == reverse( 'dashboard:product-add', kwargs={'type_pk': product_type.pk}) assert response.status_code == 302
def test_view_order_create(admin_client): url = reverse('dashboard:order-create') response = admin_client.post(url, {}) assert response.status_code == 302 assert Order.objects.count() == 1 order = Order.objects.first() redirect_url = reverse( 'dashboard:order-details', kwargs={'order_pk': order.pk}) assert get_redirect_location(response) == redirect_url assert order.status == OrderStatus.DRAFT
def test_create_user_after_order(order, client): order.user_email = '*****@*****.**' order.save() url = reverse('order:checkout-success', kwargs={'token': order.token}) data = {'password': '******'} response = client.post(url, data) redirect_url = reverse('order:details', kwargs={'token': order.token}) assert get_redirect_location(response) == redirect_url user = User.objects.filter(email='*****@*****.**').first() assert user is not None assert user.orders.filter(token=order.token).exists()
def test_add_order_note_view(order, authorized_client, customer_user): order.user_email = customer_user.email order.save() url = reverse('order:details', kwargs={'token': order.token}) customer_note = 'bla-bla note' data = {'customer_note': customer_note} response = authorized_client.post(url, data) redirect_url = reverse('order:details', kwargs={'token': order.token}) assert get_redirect_location(response) == redirect_url order.refresh_from_db() assert order.customer_note == customer_note
def test_view_connect_order_with_user_authorized_user(order, authorized_client, customer_user): order.user_email = customer_user.email order.save() url = reverse('order:connect-order-with-user', kwargs={'token': order.token}) response = authorized_client.post(url) redirect_location = get_redirect_location(response) assert redirect_location == reverse('order:details', args=[order.token]) order.refresh_from_db() assert order.user == customer_user
def test_view_product_bulk_update_publish(admin_client, product_list): url = reverse('dashboard:product-bulk-update') products = [product.pk for product in product_list] data = {'action': ProductBulkAction.PUBLISH, 'products': products} response = admin_client.post(url, data) assert response.status_code == 302 assert get_redirect_location(response) == reverse('dashboard:product-list') for p in product_list: p.refresh_from_db() assert p.is_published
def test_view_cancel_fulfillment(admin_client, fulfilled_order): fulfillment = fulfilled_order.fulfillments.first() url = reverse( 'dashboard:fulfillment-cancel', kwargs={ 'order_pk': fulfilled_order.pk, 'fulfillment_pk': fulfillment.pk}) response = admin_client.post(url, {'csrfmiddlewaretoken': 'hello'}) assert response.status_code == 302 assert get_redirect_location(response) == reverse( 'dashboard:order-details', kwargs={'order_pk': fulfilled_order.pk}) fulfillment.refresh_from_db() assert fulfillment.status == FulfillmentStatus.CANCELED
def test_view_product_variant_details_redirect_to_product( admin_client, product): variant = product.variants.get() url = reverse('dashboard:variant-details', kwargs={ 'product_pk': product.pk, 'variant_pk': variant.pk }) response = admin_client.get(url) assert response.status_code == 302 assert get_redirect_location(response) == reverse( 'dashboard:product-details', kwargs={'pk': product.pk})
def test_view_create_from_draft_order_valid(admin_client, draft_order): order = draft_order url = reverse( 'dashboard:create-order-from-draft', kwargs={'order_pk': order.pk}) data = {'csrfmiddlewaretoken': 'hello'} response = admin_client.post(url, data) assert response.status_code == 302 order.refresh_from_db() assert order.status == OrderStatus.UNFULFILLED redirect_url = reverse( 'dashboard:order-details', kwargs={'order_pk': order.pk}) assert get_redirect_location(response) == redirect_url
def test_view_order_customer_edit_to_guest_customer(admin_client, draft_order): url = reverse( 'dashboard:order-customer-edit', kwargs={'order_pk': draft_order.pk}) data = {'user_email': '', 'user': '', 'update_addresses': False} response = admin_client.post(url, data) assert response.status_code == 302 draft_order.refresh_from_db() assert not draft_order.user_email assert not draft_order.user redirect_url = reverse( 'dashboard:order-details', kwargs={'order_pk': draft_order.pk}) assert get_redirect_location(response) == redirect_url
def test_view_order_shipping_remove(admin_client, draft_order): url = reverse( 'dashboard:order-shipping-remove', kwargs={'order_pk': draft_order.pk}) data = {'csrfmiddlewaretoken': 'hello'} response = admin_client.post(url, data) assert response.status_code == 302 redirect_url = reverse( 'dashboard:order-details', kwargs={'order_pk': draft_order.pk}) assert get_redirect_location(response) == redirect_url draft_order.refresh_from_db() assert not draft_order.shipping_method assert not draft_order.shipping_method_name assert draft_order.shipping_price == ZERO_TAXED_MONEY
def test_view_order_customer_remove(admin_client, draft_order): url = reverse( 'dashboard:order-customer-remove', kwargs={'order_pk': draft_order.pk}) data = {'csrfmiddlewaretoken': 'hello'} response = admin_client.post(url, data) assert response.status_code == 302 redirect_url = reverse( 'dashboard:order-details', kwargs={'order_pk': draft_order.pk}) assert get_redirect_location(response) == redirect_url draft_order.refresh_from_db() assert not draft_order.user assert not draft_order.user_email assert not draft_order.billing_address assert not draft_order.shipping_address
def test_view_change_fulfillment_tracking(admin_client, fulfilled_order): fulfillment = fulfilled_order.fulfillments.first() url = reverse( 'dashboard:fulfillment-change-tracking', kwargs={ 'order_pk': fulfilled_order.pk, 'fulfillment_pk': fulfillment.pk}) tracking_number = '1234-5678AF' data = {'tracking_number': tracking_number} response = admin_client.post(url, data) fulfillment.refresh_from_db() assert response.status_code == 302 assert get_redirect_location(response) == reverse( 'dashboard:order-details', kwargs={'order_pk': fulfilled_order.pk}) assert fulfillment.tracking_number == tracking_number
def test_view_product_type_create_variantless(admin_client, color_attribute, size_attribute): url = reverse('dashboard:product-type-add') data = { 'name': 'Testing Type', 'product_attributes': [color_attribute.pk], 'variant_attributes': [], 'has_variants': False, 'weight': ['3.47'] } response = admin_client.post(url, data) assert response.status_code == 302 assert get_redirect_location(response) == reverse( 'dashboard:product-type-list') assert ProductType.objects.count() == 1
def test_view_order_voucher_edit(admin_client, draft_order, voucher): total_before = draft_order.total url = reverse( 'dashboard:order-voucher-edit', kwargs={'order_pk': draft_order.pk}) data = {'voucher': voucher.pk} response = admin_client.post(url, data) assert response.status_code == 302 redirect_url = reverse( 'dashboard:order-details', kwargs={'order_pk': draft_order.pk}) assert get_redirect_location(response) == redirect_url draft_order.refresh_from_db() discount_amount = Money(voucher.discount_value, settings.DEFAULT_CURRENCY) assert draft_order.discount_amount == discount_amount assert draft_order.total == total_before - discount_amount
def test_view_mark_order_as_paid(admin_client, order_with_lines): url = reverse( 'dashboard:order-mark-as-paid', kwargs={'order_pk': order_with_lines.pk}) data = {'csrfmiddlewaretoken': 'hello'} response = admin_client.post(url, data) assert response.status_code == 302 redirect_url = reverse( 'dashboard:order-details', kwargs={'order_pk': order_with_lines.pk}) assert get_redirect_location(response) == redirect_url order_with_lines.refresh_from_db() assert order_with_lines.is_fully_paid() assert order_with_lines.history.filter( content='Order manually marked as paid').exists()
def test_view_order_shipping_edit( admin_client, draft_order, shipping_zone, settings, vatlayer): method = shipping_zone.shipping_methods.create( price=Money(5, settings.DEFAULT_CURRENCY), name='DHL') url = reverse( 'dashboard:order-shipping-edit', kwargs={'order_pk': draft_order.pk}) data = {'shipping_method': method.pk} response = admin_client.post(url, data) assert response.status_code == 302 redirect_url = reverse( 'dashboard:order-details', kwargs={'order_pk': draft_order.pk}) assert get_redirect_location(response) == redirect_url draft_order.refresh_from_db() assert draft_order.shipping_method_name == method.name assert draft_order.shipping_price == method.get_total_price(taxes=vatlayer) assert draft_order.shipping_method == method
def test_view_connect_order_with_user_different_email(order, authorized_client, customer_user): """Order was placed from different email, than user's we are trying to assign it to.""" order.user = None order.user_email = '*****@*****.**' order.save() assert order.user_email != customer_user.email url = reverse('order:connect-order-with-user', kwargs={'token': order.token}) response = authorized_client.post(url) redirect_location = get_redirect_location(response) assert redirect_location == reverse('account:details') order.refresh_from_db() assert order.user is None
def test_view_product_edit(admin_client, product): url = reverse('dashboard:product-update', kwargs={'pk': product.pk}) data = { 'name': 'Product second name', 'description': 'Product description.', 'price': 10, 'category': product.category.pk, 'variant-sku': '123', 'variant-quantity': 10 } response = admin_client.post(url, data) assert response.status_code == 302 product.refresh_from_db() assert get_redirect_location(response) == reverse( 'dashboard:product-details', kwargs={'pk': product.pk}) assert product.name == 'Product second name'
def test_view_product_create(admin_client, product_type, category): url = reverse('dashboard:product-add', kwargs={'type_pk': product_type.pk}) data = { 'name': 'Product', 'description': 'This is product description.', 'price': 10, 'category': category.pk, 'variant-sku': '123', 'variant-quantity': 2 } response = admin_client.post(url, data) assert response.status_code == 302 product = Product.objects.first() assert get_redirect_location(response) == reverse( 'dashboard:product-details', kwargs={'pk': product.pk}) assert Product.objects.count() == 1
def test_view_cancel_order_line(admin_client, draft_order, track_inventory): lines_before = draft_order.lines.all() lines_before_count = lines_before.count() line = lines_before.first() line_quantity = line.quantity quantity_allocated_before = line.variant.quantity_allocated line.variant.track_inventory = track_inventory line.variant.save() url = reverse( 'dashboard:orderline-cancel', kwargs={ 'order_pk': draft_order.pk, 'line_pk': line.pk}) response = admin_client.get(url) assert response.status_code == 200 response = admin_client.post(url, {'csrfmiddlewaretoken': 'hello'}) assert response.status_code == 302 assert get_redirect_location(response) == reverse( 'dashboard:order-details', args=[draft_order.pk]) # check ordered item removal lines_after = Order.objects.get().lines.all() assert lines_before_count - 1 == lines_after.count() # check stock deallocation line.variant.refresh_from_db() if track_inventory: assert line.variant.quantity_allocated == ( quantity_allocated_before - line_quantity) else: assert line.variant.quantity_allocated == quantity_allocated_before url = reverse( 'dashboard:orderline-cancel', kwargs={ 'order_pk': draft_order.pk, 'line_pk': OrderLine.objects.get().pk}) response = admin_client.post( url, {'csrfmiddlewaretoken': 'hello'}, follow=True) assert Order.objects.get().lines.all().count() == 0 # check success messages after redirect assert response.context['messages']
def test_view_variant_images(admin_client, product_with_image): variant = product_with_image.variants.get() product_image = product_with_image.images.get() url = reverse('dashboard:variant-images', kwargs={ 'product_pk': product_with_image.pk, 'variant_pk': variant.pk }) data = {'images': [product_image.pk]} response = admin_client.post(url, data) assert response.status_code == 302 assert get_redirect_location(response) == reverse( 'dashboard:variant-details', kwargs={ 'product_pk': product_with_image.pk, 'variant_pk': variant.pk }) assert variant.variant_images.filter(image=product_image).exists()
def test_view_add_variant_to_order(admin_client, order_with_lines): order_with_lines.status = OrderStatus.DRAFT order_with_lines.save() variant = ProductVariant.objects.get(sku='SKU_A') line = OrderLine.objects.get(product_sku='SKU_A') line_quantity_before = line.quantity added_quantity = 2 url = reverse( 'dashboard:add-variant-to-order', kwargs={'order_pk': order_with_lines.pk}) data = {'variant': variant.pk, 'quantity': added_quantity} response = admin_client.post(url, data) line.refresh_from_db() assert response.status_code == 302 assert get_redirect_location(response) == reverse( 'dashboard:order-details', kwargs={'order_pk': order_with_lines.pk}) assert line.quantity == line_quantity_before + added_quantity
def test_view_order_customer_edit_to_existing_user( admin_client, customer_user, draft_order): draft_order.user = None draft_order.save() url = reverse( 'dashboard:order-customer-edit', kwargs={'order_pk': draft_order.pk}) data = { 'user_email': '', 'user': customer_user.pk, 'update_addresses': True} response = admin_client.post(url, data) assert response.status_code == 302 draft_order.refresh_from_db() assert draft_order.user == customer_user assert not draft_order.user_email assert ( draft_order.billing_address == customer_user.default_billing_address) assert ( draft_order.shipping_address == customer_user.default_shipping_address) redirect_url = reverse( 'dashboard:order-details', kwargs={'order_pk': draft_order.pk}) assert get_redirect_location(response) == redirect_url
def test_view_order_voucher_remove(admin_client, draft_order, voucher): increase_voucher_usage(voucher) draft_order.voucher = voucher discount_amount = Money(voucher.discount_value, settings.DEFAULT_CURRENCY) draft_order.discount_amount = discount_amount draft_order.total -= discount_amount draft_order.save() total_before = draft_order.total url = reverse( 'dashboard:order-voucher-remove', kwargs={'order_pk': draft_order.pk}) data = {'csrfmiddlewaretoken': 'hello'} response = admin_client.post(url, data) assert response.status_code == 302 redirect_url = reverse( 'dashboard:order-details', kwargs={'order_pk': draft_order.pk}) assert get_redirect_location(response) == redirect_url draft_order.refresh_from_db() assert draft_order.discount_amount == ZERO_MONEY assert draft_order.total == total_before + discount_amount
def test_view_fulfill_order_lines(admin_client, order_with_lines): url = reverse( 'dashboard:fulfill-order-lines', kwargs={'order_pk': order_with_lines.pk}) data = { 'csrfmiddlewaretoken': 'hello', 'form-INITIAL_FORMS': '0', 'form-MAX_NUM_FORMS': '1000', 'form-MIN_NUM_FORMS': '0', 'form-TOTAL_FORMS': order_with_lines.lines.count(), 'send_mail': 'on', 'tracking_number': ''} for i, line in enumerate(order_with_lines): data['form-{}-order_line'.format(i)] = line.pk data['form-{}-quantity'.format(i)] = line.quantity_unfulfilled response = admin_client.post(url, data) assert response.status_code == 302 assert get_redirect_location(response) == reverse( 'dashboard:order-details', kwargs={'order_pk': order_with_lines.pk}) order_with_lines.refresh_from_db() for line in order_with_lines: assert line.quantity_unfulfilled == 0