Skip to content

Commit

Permalink
Merge pull request #284 from patrys/pytest
Browse files Browse the repository at this point in the history
Improve our test suite
  • Loading branch information
mociepka committed Jun 10, 2015
2 parents 3c4533e + 38e8a6e commit f8ccb5f
Show file tree
Hide file tree
Showing 4 changed files with 233 additions and 280 deletions.
6 changes: 5 additions & 1 deletion pytest.ini
Original file line number Diff line number Diff line change
@@ -1,2 +1,6 @@
[pytest]
DJANGO_SETTINGS_MODULE=saleor.test_settings
norecursedirs =
.*
build
node_modules
DJANGO_SETTINGS_MODULE = saleor.test_settings
264 changes: 117 additions & 147 deletions saleor/cart/test_cart.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@
from django.utils.encoding import smart_text
from mock import MagicMock
from prices import Price
import pytest
from satchless.item import InsufficientStock

from . import Cart, SessionCart
from .forms import AddToCartForm, ReplaceCartLineForm, ReplaceCartLineFormSet
from . import forms
from .forms import ReplaceCartLineForm, ReplaceCartLineFormSet
from ..product.models import (ProductVariant, StockedProduct, PhysicalProduct)

__all__ = ['CartTest', 'BigShipCartFormTest']


class BigShip(ProductVariant, StockedProduct, PhysicalProduct):
name = models.CharField(max_length=250)
Expand All @@ -24,161 +24,131 @@ def get_price_per_item(self, discounted=True, **kwargs):
def get_slug(self):
return 'bigship'

@property
def product(self):
return self


class ShipPhoto(ProductVariant, PhysicalProduct):
name = models.CharField(max_length=250)

def get_slug(self):
return 'bigship-photo'

@property
def product(self):
return self


class BigShipCartForm(AddToCartForm):
class AddToCartForm(forms.AddToCartForm):

def get_variant(self, cleaned_data):
return self.product


stock_product = BigShip(name='BigShip', stock=10,
price=Price(10, currency='USD'), weight=Decimal(123))
stock_product.product = stock_product
digital_product = ShipPhoto(price=Price(10, currency='USD'))
digital_product.product = digital_product


class CartTest(TestCase):

def test_check_quantity(self):
"""
Stock limit works
"""
cart = Cart(session_cart=MagicMock())

def illegal():
cart.add(stock_product, 100)

self.assertRaises(InsufficientStock, illegal)
self.assertFalse(cart)

def test_add_adds_to_session_cart(self):
cart = Cart(session_cart=SessionCart())
cart.add(stock_product, 10)
self.assertEqual(cart.session_cart.count(), 10)
self.assertTrue(cart.session_cart.modified)
self.assertEqual(cart.session_cart[0].product,
smart_text(stock_product))


class BigShipCartFormTest(TestCase):

def setUp(self):
self.cart = Cart(MagicMock())
self.post = {'quantity': 5}

def test_quantity(self):
"""
BigShipCartForm works with correct quantity value on empty cart
"""
form = BigShipCartForm(
self.post, cart=self.cart, product=stock_product)
self.assertTrue(form.is_valid())
self.assertFalse(self.cart)
form.save()
product_quantity = self.cart.get_line(stock_product).quantity
self.assertEqual(product_quantity, 5, 'Bad quantity')

def test_max_quantity(self):
"""
BigShipCartForm works with correct product stock value
"""
form = BigShipCartForm(
self.post, cart=self.cart, product=stock_product)
self.assertTrue(form.is_valid())
form.save()
form = BigShipCartForm(
self.post, cart=self.cart, product=stock_product)
self.assertTrue(form.is_valid())
form.save()
product_quantity = self.cart.get_line(stock_product).quantity
self.assertEqual(product_quantity, 10,
'%s is the bad quantity value' % (product_quantity,))

def test_too_big_quantity(self):
"""
BigShipCartForm works with not correct quantity value'
"""
form = BigShipCartForm({'quantity': 15}, cart=self.cart,
product=stock_product)
self.assertFalse(form.is_valid())
self.assertFalse(self.cart)

def test_clean_quantity_product(self):
"""
Is BigShipCartForm works with not stocked product
"""
cart = Cart(session_cart=MagicMock())
self.post['quantity'] = 999
form = BigShipCartForm(self.post, cart=cart, product=digital_product)
self.assertTrue(form.is_valid(), 'Form doesn\'t valitate')
self.assertFalse(cart, 'Cart isn\'t empty')
form.save()
self.assertTrue(cart, 'Cart is empty')


class ReplaceCartLineFormTest(TestCase):

def setUp(self):
self.cart = Cart(session_cart=MagicMock())

def test_quantity(self):
"""
ReplaceCartLineForm works with correct quantity value
"""
form = ReplaceCartLineForm({'quantity': 5}, cart=self.cart,
product=stock_product)
self.assertTrue(form.is_valid())
form.save()
form = ReplaceCartLineForm({'quantity': 5}, cart=self.cart,
product=stock_product)
self.assertTrue(form.is_valid())
form.save()
product_quantity = self.cart.get_line(stock_product).quantity
self.assertEqual(product_quantity, 5,
'%s is the bad quantity value' % (product_quantity,))

def test_too_big_quantity(self):
"""
Is ReplaceCartLineForm works with to big quantity value
"""
form = ReplaceCartLineForm({'quantity': 15}, cart=self.cart,
product=stock_product)
self.assertFalse(form.is_valid())


class ReplaceCartLineFormSetTest(TestCase):

def test_save(self):
post = {
'form-TOTAL_FORMS': 2,
'form-INITIAL_FORMS': 2,
'form-0-quantity': 5,
'form-1-quantity': 5}
cart = Cart(session_cart=MagicMock())
cart.add(stock_product, 5)
cart.add(digital_product, 100)
form = ReplaceCartLineFormSet(post, cart=cart)
self.assertTrue(form.is_valid())
form.save()
product_quantity = cart.get_line(stock_product).quantity
self.assertEqual(product_quantity, 5,
'%s is the bad quantity value' % (product_quantity,))


class SessionCartTest(TestCase):

def test_sessioncart_get_price_per_item(self):
cart = Cart(SessionCart())
cart.add(stock_product, quantity=10)
cart_price = cart[0].get_price_per_item()
sessioncart_price = cart.session_cart[0].get_price_per_item()
self.assertTrue(isinstance(sessioncart_price, Price))
self.assertEqual(cart_price, sessioncart_price)

non_stock_product = ShipPhoto(price=Price(10, currency='USD'))


def test_cart_checks_quantity():
cart = Cart(session_cart=MagicMock())
with pytest.raises(InsufficientStock):
cart.add(stock_product, 100)
assert not cart


def test_cart_add_adds_to_session_cart():
cart = Cart(session_cart=SessionCart())
cart.add(stock_product, 10)
assert cart.session_cart.count() == 10
assert cart.session_cart.modified
assert cart.session_cart[0].product == smart_text(stock_product)


def test_quantity_is_correctly_saved():
cart = Cart(session_cart=MagicMock())
data = {'quantity': 5}
form = AddToCartForm(data, cart=cart, product=stock_product)
assert form.is_valid()
assert not cart
form.save()
product_quantity = cart.get_line(stock_product).quantity
assert product_quantity == 5


def test_multiple_actions_result_in_combined_quantity():
cart = Cart(session_cart=MagicMock())
data = {'quantity': 5}
form = AddToCartForm(data, cart=cart, product=stock_product)
assert form.is_valid()
form.save()
form = AddToCartForm(data, cart=cart, product=stock_product)
assert form.is_valid()
form.save()
product_quantity = cart.get_line(stock_product).quantity
assert product_quantity == 10


def test_excessive_quantity_is_rejected():
cart = Cart(session_cart=MagicMock())
data = {'quantity': 15}
form = AddToCartForm(data, cart=cart, product=stock_product)
assert not form.is_valid()
assert not cart


def test_any_quantity_is_valid_for_non_stock_products():
cart = Cart(session_cart=MagicMock())
data = {'quantity': 999}
form = AddToCartForm(data, cart=cart, product=non_stock_product)
assert form.is_valid()
assert not cart
form.save()
assert cart


def test_replace_form_replaces_quantity():
cart = Cart(session_cart=MagicMock())
data = {'quantity': 5}
form = ReplaceCartLineForm(data, cart=cart, product=stock_product)
assert form.is_valid()
form.save()
product_quantity = cart.get_line(stock_product).quantity
assert product_quantity == 5
form = ReplaceCartLineForm(data, cart=cart, product=stock_product)
assert form.is_valid()
form.save()
product_quantity = cart.get_line(stock_product).quantity
assert product_quantity == 5


def test_replace_form_rejects_excessive_quantity():
cart = Cart(session_cart=MagicMock())
data = {'quantity': 15}
form = ReplaceCartLineForm(data, cart=cart, product=stock_product)
assert not form.is_valid()


def test_replace_formset_works():
cart = Cart(session_cart=MagicMock())
cart.add(stock_product, 5)
cart.add(non_stock_product, 100)
data = {
'form-TOTAL_FORMS': 2,
'form-INITIAL_FORMS': 2,
'form-0-quantity': 5,
'form-1-quantity': 5}
form = ReplaceCartLineFormSet(data, cart=cart)
assert form.is_valid()
form.save()
product_quantity = cart.get_line(stock_product).quantity
assert product_quantity == 5


def test_session_cart_returns_correct_prices():
cart = Cart(session_cart=SessionCart())
cart.add(stock_product, quantity=10)
cart_price = cart[0].get_price_per_item()
sessioncart_price = cart.session_cart[0].get_price_per_item()
assert cart_price == sessioncart_price

0 comments on commit f8ccb5f

Please sign in to comment.