Skip to content

Commit

Permalink
Update and extend checkout tests
Browse files Browse the repository at this point in the history
* Uses factory-boy factories
* Adds helpers to the CheckoutMixin helper
* Adds plenty of functional tests
* Adds HTML IDs to some forms to be able to easily reference them
  from our tests

This commit is the squashed version of #1645 by @maikhoepfel, but it
does not contain the template changes. The unused
ShippingAddressView code was already cherry-picked across in 549decb.
  • Loading branch information
itbabu authored and maiksprenger committed Jan 30, 2015
1 parent 567e81d commit 8fd80cb
Show file tree
Hide file tree
Showing 6 changed files with 239 additions and 34 deletions.
2 changes: 1 addition & 1 deletion src/oscar/templates/oscar/checkout/shipping_address.html
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ <h3>{% trans "An address from your addressbook?" %}</h3>
{% endfor %}
{% endblock %}
</address>
<form action="{% url 'checkout:shipping-address' %}" method="post">
<form action="{% url 'checkout:shipping-address' %}" method="post" id="select_shipping_address_{{ address.id }}">
{% csrf_token %}
<input type="hidden" name="action" value="ship_to" />
<input type="hidden" name="address_id" value="{{ address.id }}" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
{% block checkout_title %}{% trans "Delete address?" %}{% endblock %}

{% block shipping_address %}
<form action="." method="post">
<form action="." method="post" id="delete_address_{{ object.id }}">
{% csrf_token %}
<div class="well">
<address>
Expand Down
2 changes: 2 additions & 0 deletions src/oscar/test/newfactories.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

from oscar.core.loading import get_model, get_class
from oscar.core.compat import get_user_model
from oscar.core.phonenumber import PhoneNumber

__all__ = ["UserFactory", "CountryFactory", "UserAddressFactory",
"BasketFactory", "VoucherFactory", "ProductFactory",
Expand Down Expand Up @@ -59,6 +60,7 @@ class UserAddressFactory(factory.DjangoModelFactory):
line1 = "1 King Road"
line4 = "London"
postcode = "SW1 9RE"
phone_number = PhoneNumber.from_string('+49 351 3296645')
country = factory.SubFactory(CountryFactory)
user = factory.SubFactory(UserFactory)

Expand Down
32 changes: 22 additions & 10 deletions tests/functional/checkout/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,26 @@

from django.core.urlresolvers import reverse

from oscar.apps.address.models import Country
from oscar.core.loading import get_model, get_class
from oscar.test import factories

UserAddress = get_model('address', 'UserAddress')
Country = get_model('address', 'Country')
GatewayForm = get_class('checkout.forms', 'GatewayForm')


class CheckoutMixin(object):

def create_digital_product(self):
product = factories.create_product(price=D('12.00'), num_in_stock=None)
product.product_class.requires_shipping = False
product.product_class.track_stock = False
product.product_class.save()
product_class = factories.ProductClassFactory(requires_shipping=False, track_stock=False)
product = factories.ProductFactory(product_class=product_class)
stock_record = factories.StockRecordFactory(num_in_stock=None, price_excl_tax=D('12.00'), product=product)
return product

def add_product_to_basket(self, product=None):
if product is None:
product = factories.create_product(price=D('12.00'),
num_in_stock=10)
product = factories.ProductFactory()
stock_record = factories.StockRecordFactory(num_in_stock=10, price_excl_tax=D('12.00'), product=product)
detail_page = self.get(product.get_absolute_url())
form = detail_page.forms['add_to_basket_form']
form.submit()
Expand All @@ -34,11 +37,12 @@ def add_voucher_to_basket(self, voucher=None):
def enter_guest_details(self, email='guest@example.com'):
index_page = self.get(reverse('checkout:index'))
index_page.form['username'] = email
index_page.form.submit()
index_page.form.select('options', GatewayForm.GUEST)
return index_page.form.submit()


def create_shipping_country(self):
Country.objects.get_or_create(
iso_3166_1_a2='GB', is_shipping_country=True)
return factories.CountryFactory(iso_3166_1_a2='GB', is_shipping_country=True)

def enter_shipping_address(self):
self.create_shipping_country()
Expand All @@ -59,3 +63,11 @@ def place_order(self):
reverse('checkout:shipping-method')).follow().follow()
preview = payment_details.click(linkid="view_preview")
return preview.forms['place_order_form'].submit().follow()

def ready_to_place_an_order(self, is_guest=False):
self.add_product_to_basket()
if is_guest:
self.enter_guest_details('hello@egg.com')
self.enter_shipping_address()
payment_details = self.get(reverse('checkout:shipping-method')).follow().follow()
return payment_details.click(linkid="view_preview")
84 changes: 76 additions & 8 deletions tests/functional/checkout/customer_checkout_tests.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
from __future__ import unicode_literals
from django.core.urlresolvers import reverse

from oscar.core.loading import get_model, get_class
from oscar.test.newfactories import UserAddressFactory
from oscar.test.testcases import WebTestCase
from oscar.test import factories
from oscar.apps.order.models import Order
from oscar.apps.offer.models import ConditionalOffer
from . import CheckoutMixin

Order = get_model('order', 'Order')
ConditionalOffer = get_model('offer', 'ConditionalOffer')
UserAddress = get_model('address', 'UserAddress')
GatewayForm = get_class('checkout.forms', 'GatewayForm')


class TestIndexView(CheckoutMixin, WebTestCase):

Expand All @@ -26,8 +32,8 @@ def test_redirects_customers_to_shipping_address_view(self):
class TestShippingAddressView(CheckoutMixin, WebTestCase):

def setUp(self):
self.create_shipping_country()
super(TestShippingAddressView, self).setUp()
self.user_address = UserAddressFactory(user=self.user, country=self.create_shipping_country())

def test_requires_login(self):
response = self.get(reverse('checkout:shipping-address'), user=None)
Expand All @@ -47,11 +53,50 @@ def test_submitting_valid_form_adds_data_to_session(self):

session_data = self.app.session['checkout_data']
session_fields = session_data['shipping']['new_address_fields']
self.assertEqual(u'Barry', session_fields['first_name'])
self.assertEqual(u'Chuckle', session_fields['last_name'])
self.assertEqual(u'1 King Street', session_fields['line1'])
self.assertEqual(u'Gotham City', session_fields['line4'])
self.assertEqual(u'N1 7RR', session_fields['postcode'])
self.assertEqual('Barry', session_fields['first_name'])
self.assertEqual('Chuckle', session_fields['last_name'])
self.assertEqual('1 King Street', session_fields['line1'])
self.assertEqual('Gotham City', session_fields['line4'])
self.assertEqual('N1 7RR', session_fields['postcode'])

def test_only_shipping_address_are_shown(self):
not_shipping_country = factories.CountryFactory(
iso_3166_1_a2='US', name="UNITED STATES", is_shipping_country=False)
not_shipping_address = UserAddressFactory(user=self.user, country=not_shipping_country, line4='New York')
self.add_product_to_basket()
page = self.get(reverse('checkout:shipping-address'))
page.mustcontain(self.user_address.line4, self.user_address.country.name,
no=[not_shipping_address.country.name, not_shipping_address.line4])

def test_can_select_an_existing_shipping_address(self):
self.add_product_to_basket()
page = self.get(reverse('checkout:shipping-address'), user=self.user)
self.assertIsOk(page)
form = page.forms["select_shipping_address_%s" % self.user_address.id]
response = form.submit()
self.assertRedirectsTo(response, 'checkout:shipping-method')


class TestUserAddressUpdateView(CheckoutMixin, WebTestCase):

def setUp(self):
country = self.create_shipping_country()
super(TestUserAddressUpdateView, self).setUp()
self.user_address = UserAddressFactory(user=self.user, country=country)

def test_requires_login(self):
response = self.get(reverse('checkout:user-address-update', kwargs={'pk': self.user_address.pk}), user=None)
self.assertIsRedirect(response)

def test_submitting_valid_form_modifies_user_address(self):
page = self.get(reverse('checkout:user-address-update', kwargs={'pk': self.user_address.pk}),
user=self.user)

form = page.forms['update_user_address']
form['first_name'] = 'Tom'
response = form.submit()
self.assertRedirectsTo(response, 'checkout:shipping-address')
self.assertEqual('Tom', UserAddress.objects.get().first_name)


class TestShippingMethodView(CheckoutMixin, WebTestCase):
Expand All @@ -67,6 +112,29 @@ def test_redirects_when_only_one_shipping_method(self):
self.assertRedirectsTo(response, 'checkout:payment-method')


class TestDeleteUserAddressView(CheckoutMixin, WebTestCase):

def setUp(self):
super(TestDeleteUserAddressView, self).setUp()
self.country = self.create_shipping_country()
self.user_address = UserAddressFactory(user=self.user, country=self.country)

def test_requires_login(self):
response = self.get(reverse('checkout:user-address-delete', kwargs={'pk': self.user_address.pk}), user=None)
self.assertIsRedirect(response)

def test_can_delete_a_user_address_from_shipping_address_page(self):
self.add_product_to_basket()
page = self.get(reverse('checkout:shipping-address'), user=self.user)
delete_confirm = page.click(href=reverse('checkout:user-address-delete', kwargs={'pk': self.user_address.pk}))
form = delete_confirm.forms["delete_address_%s" % self.user_address.id]
form.submit()

# Ensure address is deleted
user_addresses = UserAddress.objects.filter(user=self.user)
self.assertEqual(0, len(user_addresses))


class TestPreviewView(CheckoutMixin, WebTestCase):

def test_allows_order_to_be_placed(self):
Expand Down
Loading

0 comments on commit 8fd80cb

Please sign in to comment.