PageRenderTime 73ms CodeModel.GetById 36ms RepoModel.GetById 1ms app.codeStats 0ms

/satchless/cart/tests/__init__.py

https://github.com/trashgenerator/satchless
Python | 234 lines | 211 code | 20 blank | 3 comment | 10 complexity | d90c39711a3b8f3120cfa106093a5a1b MD5 | raw file
  1. # -*- coding: utf-8 -*-
  2. from decimal import Decimal
  3. from django.conf import settings
  4. from django.contrib.auth.models import User
  5. from django.core.urlresolvers import reverse
  6. from django.test import TestCase, Client
  7. from django import forms
  8. import os
  9. from ...product import handler
  10. from ...product.tests import (DeadParrot, ZombieParrot, DeadParrotVariantForm)
  11. from ...category.models import Category
  12. from .. import models
  13. from .. import signals
  14. class ParrotTest(TestCase):
  15. def _setup_settings(self, custom_settings):
  16. original_settings = {}
  17. for setting_name, value in custom_settings.items():
  18. if hasattr(settings, setting_name):
  19. original_settings[setting_name] = getattr(settings,
  20. setting_name)
  21. setattr(settings, setting_name, value)
  22. return original_settings
  23. def _teardown_settings(self, original_settings, custom_settings=None):
  24. custom_settings = custom_settings or {}
  25. for setting_name, value in custom_settings.items():
  26. if setting_name in original_settings:
  27. setattr(settings, setting_name, value)
  28. else:
  29. delattr(settings, setting_name)
  30. def setUp(self):
  31. self.ORIGINAL_TEMPLATE_DIRS = settings.TEMPLATE_DIRS
  32. settings.TEMPLATE_DIRS = [os.path.join(os.path.dirname(__file__),
  33. 'templates')]
  34. self.category_birds = Category.objects.create(name='birds', slug='birds')
  35. self.macaw = DeadParrot.objects.create(slug='macaw',
  36. species='Hyacinth Macaw')
  37. self.cockatoo = DeadParrot.objects.create(slug='cockatoo',
  38. species='White Cockatoo')
  39. self.category_birds.products.add(self.macaw)
  40. self.category_birds.products.add(self.cockatoo)
  41. self.macaw_blue = self.macaw.variants.create(color='blue', sku='M-BL-D',
  42. looks_alive=False)
  43. self.macaw_blue_fake = self.macaw.variants.create(color='blue',
  44. sku='M-BL-A',
  45. looks_alive=True)
  46. self.cockatoo_white_a = self.cockatoo.variants.create(color='white',
  47. sku='C-WH-A',
  48. looks_alive=True)
  49. self.cockatoo_white_d = self.cockatoo.variants.create(color='white',
  50. sku='C-WH-D',
  51. looks_alive=False)
  52. self.cockatoo_blue_a = self.cockatoo.variants.create(color='blue',
  53. sku='C-BL-A',
  54. looks_alive=True)
  55. self.cockatoo_blue_d = self.cockatoo.variants.create(color='blue',
  56. sku='C-BL-D',
  57. looks_alive=False)
  58. # only staff users can view uncategorized products
  59. self.user1 = User.objects.create(username="testuser", is_staff=True,
  60. is_superuser=True)
  61. self.user1.set_password(u"pasło")
  62. self.category_birds.products.add(self.macaw)
  63. self.user1.save()
  64. self.custom_settings = {
  65. 'SATCHLESS_PRODUCT_VIEW_HANDLERS': ('satchless.cart.add_to_cart_handler',),
  66. }
  67. self.original_settings = self._setup_settings(self.custom_settings)
  68. handler.init_queue()
  69. def tearDown(self):
  70. settings.TEMPLATE_DIRS = self.ORIGINAL_TEMPLATE_DIRS
  71. self._teardown_settings(self.original_settings, self.custom_settings)
  72. handler.init_queue()
  73. def _test_status(self, url, method='get', *args, **kwargs):
  74. status_code = kwargs.pop('status_code', 200)
  75. client = kwargs.pop('client_instance', Client())
  76. data = kwargs.pop('data', {})
  77. response = getattr(client, method)(url, data=data)
  78. self.assertEqual(response.status_code, status_code,
  79. 'Incorrect status code for: %s, (%s, %s)!'
  80. ' Expected: %s, received: %s. HTML:\n\n%s' %
  81. (url.decode('utf-8'), args, kwargs, status_code,
  82. response.status_code,
  83. response.content.decode('utf-8')))
  84. return response
  85. def test_basic_cart_ops(self):
  86. cart = models.Cart.objects.create(typ='satchless.test_cart')
  87. cart.set_quantity(self.macaw_blue, 1)
  88. cart.set_quantity(self.macaw_blue_fake, Decimal('2.45'))
  89. cart.set_quantity(self.cockatoo_white_a, Decimal('2.45'))
  90. cart.set_quantity(self.cockatoo_white_d, '4.11')
  91. cart.set_quantity(self.cockatoo_blue_a, 6)
  92. cart.set_quantity(self.cockatoo_blue_d, Decimal('2'))
  93. # remove three items
  94. cart.set_quantity(self.cockatoo_white_d, 0)
  95. cart.set_quantity(self.cockatoo_blue_a, Decimal('0'))
  96. cart.set_quantity(self.cockatoo_white_a, '0.0')
  97. self.assertEqual(cart.get_quantity(self.macaw_blue), Decimal('1'))
  98. self.assertEqual(cart.get_quantity(self.macaw_blue_fake), Decimal('2'))
  99. self.assertEqual(cart.get_quantity(self.cockatoo_white_a), 0)
  100. self.assertRaises(models.CartItem.DoesNotExist, cart.items.get,
  101. variant=self.cockatoo_white_a)
  102. self.assertEqual(cart.get_quantity(self.cockatoo_white_d), Decimal('0'))
  103. self.assertRaises(models.CartItem.DoesNotExist, cart.items.get,
  104. variant=self.cockatoo_white_d)
  105. self.assertEqual(cart.get_quantity(self.cockatoo_blue_a), Decimal('0.0'))
  106. self.assertRaises(models.CartItem.DoesNotExist, cart.items.get,
  107. variant=self.cockatoo_blue_a)
  108. self.assertEqual(cart.get_quantity(self.cockatoo_blue_d), Decimal('2'))
  109. cart.add_quantity(self.macaw_blue, 100)
  110. cart.add_quantity(self.macaw_blue_fake, 100)
  111. cart.add_quantity(self.cockatoo_white_a, 100)
  112. cart.add_quantity(self.cockatoo_white_d, 100)
  113. cart.add_quantity(self.cockatoo_blue_a, 100)
  114. cart.add_quantity(self.cockatoo_blue_d, 100)
  115. self.assertEqual(cart.get_quantity(self.macaw_blue), Decimal('101'))
  116. self.assertEqual(cart.get_quantity(self.macaw_blue_fake), Decimal('102'))
  117. self.assertEqual(cart.get_quantity(self.cockatoo_white_a), Decimal('100'))
  118. self.assertEqual(cart.get_quantity(self.cockatoo_white_d), Decimal('100'))
  119. self.assertEqual(cart.get_quantity(self.cockatoo_blue_a), Decimal('100'))
  120. self.assertEqual(cart.get_quantity(self.cockatoo_blue_d), Decimal('102'))
  121. def _get_or_create_cart_for_client(self, client=None, typ='satchless_cart'):
  122. client = client or self.client
  123. self._test_status(reverse('satchless-cart-view'), client_instance=client)
  124. return models.Cart.objects.get(pk=client.session[models.CART_SESSION_KEY % typ],
  125. typ=typ)
  126. def test_add_to_cart_form_on_product_view(self):
  127. response = self._test_status(self.macaw.get_absolute_url(),
  128. method='get', status_code=200)
  129. self.assertTrue(isinstance(response.context['product'].cart_form,
  130. DeadParrotVariantForm))
  131. zombie = ZombieParrot.objects.create(slug='zombie-parrot',
  132. species='Zombie Parrot')
  133. self.category_birds.products.add(zombie)
  134. response = self._test_status(zombie.get_absolute_url(),
  135. method='get', status_code=200)
  136. self.assertTrue(isinstance(response.context['product'].cart_form,
  137. DeadParrotVariantForm))
  138. def _test_add_by_view(self, client):
  139. cart = self._get_or_create_cart_for_client(client)
  140. self._test_status(reverse('satchless-cart-view',
  141. kwargs={'typ': 'satchless_cart'}),
  142. client_instance=client, status_code=200)
  143. self._test_status(reverse('satchless-product-details',
  144. args=(self.macaw.pk, self.macaw.slug)),
  145. method='post',
  146. data={'typ': 'satchless_cart',
  147. 'color': self.macaw_blue_fake.color,
  148. 'looks_alive': self.macaw_blue_fake.looks_alive,
  149. 'quantity': 2},
  150. client_instance=client,
  151. status_code=302)
  152. self.assertTrue(cart.items.count(), 1)
  153. cart_item = cart.items.get()
  154. self.assertTrue(cart_item.quantity, 2)
  155. self.assertEqual(self.macaw_blue_fake, cart_item.variant.get_subtype_instance())
  156. def test_add_by_view_for_anonymous(self):
  157. cli_anon = Client()
  158. self._test_add_by_view(cli_anon)
  159. def test_add_by_view(self):
  160. cli_user1 = Client()
  161. self.assertTrue(cli_user1.login(username="testuser", password=u"pasło"))
  162. self._test_add_by_view(cli_user1)
  163. def test_add_to_cart_form_handles_incorrect_data(self):
  164. cli_anon = Client()
  165. response = self._test_status(reverse('satchless-product-details',
  166. args=(self.macaw.pk,
  167. self.macaw.slug)),
  168. method='post',
  169. data={'typ': 'satchless_cart',
  170. 'color': 'blue',
  171. 'looks_alive': 1,
  172. 'quantity': 'alkjl'},
  173. client_instance=cli_anon,
  174. status_code=200)
  175. errors = response.context['product'].cart_form.errors
  176. self.assertTrue('quantity' in errors)
  177. def test_signals(self):
  178. def modify_qty(sender, instance=None, variant=None, old_quantity=None,
  179. new_quantity=None, result=None, **kwargs):
  180. if instance.typ != 'satchless.test_cart_with_signals':
  181. return
  182. if variant.product == self.macaw:
  183. result.append((Decimal('0'), u"Out of stock"))
  184. elif not variant.looks_alive:
  185. result.append((Decimal('1'), u"Parrots don't rest in groups"))
  186. cart = models.Cart.objects.create(typ='satchless.test_cart_with_signals')
  187. signals.cart_quantity_change_check.connect(modify_qty)
  188. result = cart.set_quantity(self.macaw_blue, 10, dry_run=True)
  189. self.assertEqual((result.new_quantity, result.reason),
  190. (0, u"Out of stock"))
  191. self.assertEqual(0, cart.get_quantity(self.macaw_blue))
  192. result = cart.set_quantity(self.macaw_blue, 10)
  193. self.assertEqual((result.new_quantity, result.reason),
  194. (0, u"Out of stock"))
  195. self.assertEqual(0, cart.get_quantity(self.macaw_blue))
  196. result = cart.add_quantity(self.macaw_blue, 10)
  197. self.assertEqual((result.new_quantity, result.quantity_delta,
  198. result.reason),
  199. (0, 0, u"Out of stock"))
  200. self.assertEqual(0, cart.get_quantity(self.macaw_blue))
  201. result = cart.set_quantity(self.cockatoo_white_d, 10, dry_run=True)
  202. self.assertEqual((result.new_quantity, result.reason),
  203. (1, u"Parrots don't rest in groups"))
  204. self.assertEqual(0, cart.get_quantity(self.cockatoo_white_d))
  205. result = cart.set_quantity(self.cockatoo_white_d, 10)
  206. self.assertEqual((result.new_quantity, result.reason),
  207. (1, u"Parrots don't rest in groups"))
  208. self.assertEqual(1, cart.get_quantity(self.cockatoo_white_d))
  209. result = cart.add_quantity(self.cockatoo_white_d, 10)
  210. self.assertEqual((result.new_quantity,
  211. result.quantity_delta,
  212. result.reason),
  213. (1, 0, u"Parrots don't rest in groups"))
  214. self.assertEqual(1, cart.get_quantity(self.cockatoo_white_d))