Esempio n. 1
0
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())
Esempio n. 2
0
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'
Esempio n. 3
0
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
Esempio n. 4
0
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
Esempio n. 5
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
Esempio n. 6
0
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
Esempio n. 7
0
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()
Esempio n. 8
0
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
Esempio n. 9
0
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
Esempio n. 10
0
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
Esempio n. 11
0
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
Esempio n. 12
0
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})
Esempio n. 13
0
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
Esempio n. 14
0
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
Esempio n. 15
0
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
Esempio n. 16
0
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
Esempio n. 17
0
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
Esempio n. 18
0
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
Esempio n. 19
0
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
Esempio n. 20
0
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()
Esempio n. 21
0
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
Esempio n. 22
0
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
Esempio n. 23
0
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'
Esempio n. 24
0
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
Esempio n. 25
0
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']
Esempio n. 26
0
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()
Esempio n. 27
0
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
Esempio n. 28
0
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
Esempio n. 29
0
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
Esempio n. 30
0
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