You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

form_tests.py 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. from django.test import TestCase
  2. from django.conf import settings
  3. import mock
  4. from oscar.apps.basket import forms
  5. from oscar.test import factories
  6. class TestBasketLineForm(TestCase):
  7. def setUp(self):
  8. self.basket = factories.create_basket()
  9. self.line = self.basket.all_lines()[0]
  10. def mock_availability_return_value(self, is_available, reason=''):
  11. policy = self.line.purchase_info.availability
  12. policy.is_purchase_permitted = mock.MagicMock(
  13. return_value=(is_available, reason))
  14. def build_form(self, quantity=None):
  15. if quantity is None:
  16. quantity = self.line.quantity
  17. return forms.BasketLineForm(
  18. strategy=self.basket.strategy,
  19. data={'quantity': quantity},
  20. instance=self.line)
  21. def test_enforces_availability_policy_for_valid_quantities(self):
  22. self.mock_availability_return_value(True)
  23. form = self.build_form()
  24. self.assertTrue(form.is_valid())
  25. def test_enforces_availability_policy_for_invalid_quantities(self):
  26. self.mock_availability_return_value(False, "Some reason")
  27. form = self.build_form()
  28. self.assertFalse(form.is_valid())
  29. self.assertEqual(
  30. form.errors['quantity'], ['Some reason'])
  31. def test_skips_availability_policy_for_zero_quantities(self):
  32. self.mock_availability_return_value(True)
  33. form = self.build_form(quantity=0)
  34. self.assertTrue(form.is_valid())
  35. def test_enforces_max_line_quantity(self):
  36. invalid_qty = settings.OSCAR_MAX_BASKET_QUANTITY_THRESHOLD + 1
  37. form = self.build_form(quantity=invalid_qty)
  38. self.assertFalse(form.is_valid())
  39. class TestAddToBasketForm(TestCase):
  40. def test_allows_a_product_quantity_to_be_increased(self):
  41. basket = factories.create_basket()
  42. product = basket.all_lines()[0].product
  43. # Add more of the same product
  44. data = {'quantity': 1}
  45. form = forms.AddToBasketForm(
  46. basket=basket, product=product, data=data)
  47. self.assertTrue(form.is_valid())
  48. def test_checks_whether_passed_product_id_matches_a_real_product(self):
  49. basket = factories.create_basket()
  50. product = basket.all_lines()[0].product
  51. # Add more of the same product
  52. data = {'quantity': -1}
  53. form = forms.AddToBasketForm(
  54. basket=basket, product=product, data=data)
  55. self.assertFalse(form.is_valid())
  56. def test_checks_if_purchase_is_permitted(self):
  57. basket = factories.BasketFactory()
  58. product = factories.ProductFactory()
  59. # Build a 4-level mock monster so we can force the return value of
  60. # whether the product is available to buy. This is a serious code smell
  61. # and needs to be remedied.
  62. info = mock.Mock()
  63. info.availability = mock.Mock()
  64. info.availability.is_purchase_permitted = mock.Mock(
  65. return_value=(False, "Not on your nelly!"))
  66. basket.strategy.fetch_for_product = mock.Mock(
  67. return_value=info)
  68. data = {'quantity': 1}
  69. form = forms.AddToBasketForm(
  70. basket=basket, product=product, data=data)
  71. self.assertFalse(form.is_valid())
  72. self.assertEqual('Not on your nelly!', form.errors['__all__'][0])
  73. def test_mixed_currency_baskets_are_not_permitted(self):
  74. # Ensure basket is one currency
  75. basket = mock.Mock()
  76. basket.currency = 'GBP'
  77. basket.num_items = 1
  78. # Ensure new product has different currency
  79. info = mock.Mock()
  80. info.price.currency = 'EUR'
  81. basket.strategy.fetch_for_product = mock.Mock(
  82. return_value=info)
  83. product = factories.ProductFactory()
  84. data = {'quantity': 1}
  85. form = forms.AddToBasketForm(
  86. basket=basket, product=product, data=data)
  87. self.assertFalse(form.is_valid())