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.

product_tests.py 7.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. import datetime
  2. from django.core.urlresolvers import reverse
  3. from oscar.test import factories
  4. from oscar.test.testcases import WebTestCase
  5. from oscar.core.compat import get_user_model
  6. from oscar.apps.catalogue.models import Product, ProductAttribute
  7. from oscar.test.factories import (
  8. CategoryFactory, ProductFactory, ProductAttributeFactory,
  9. ProductClassFactory)
  10. User = get_user_model()
  11. class ProductWebTest(WebTestCase):
  12. is_staff = True
  13. def setUp(self):
  14. self.user = User.objects.create_user(username='testuser',
  15. email='test@email.com',
  16. password='somefancypassword')
  17. self.user.is_staff = self.is_staff
  18. self.user.save()
  19. def get(self, url, **kwargs):
  20. kwargs['user'] = self.user
  21. return self.app.get(url, **kwargs)
  22. class TestGatewayPage(ProductWebTest):
  23. is_staff = True
  24. def test_redirects_to_list_page_when_no_query_param(self):
  25. url = reverse('dashboard:catalogue-product-create')
  26. response = self.get(url)
  27. self.assertRedirects(response,
  28. reverse('dashboard:catalogue-product-list'))
  29. def test_redirects_to_list_page_when_invalid_query_param(self):
  30. url = reverse('dashboard:catalogue-product-create')
  31. response = self.get(url + '?product_class=bad')
  32. self.assertRedirects(response,
  33. reverse('dashboard:catalogue-product-list'))
  34. def test_redirects_to_form_page_when_valid_query_param(self):
  35. pclass = ProductClassFactory(name='Books', slug='books')
  36. url = reverse('dashboard:catalogue-product-create')
  37. response = self.get(url + '?product_class=%s' % pclass.pk)
  38. expected_url = reverse('dashboard:catalogue-product-create',
  39. kwargs={'product_class_slug': pclass.slug})
  40. self.assertRedirects(response, expected_url)
  41. class TestCreateParentProduct(ProductWebTest):
  42. is_staff = True
  43. def setUp(self):
  44. self.pclass = ProductClassFactory(name='Books', slug='books')
  45. super(TestCreateParentProduct, self).setUp()
  46. def submit(self, title=None, category=None, upc=None):
  47. url = reverse('dashboard:catalogue-product-create',
  48. kwargs={'product_class_slug': self.pclass.slug})
  49. product_form = self.get(url).form
  50. product_form['title'] = title
  51. product_form['upc'] = upc
  52. product_form['structure'] = 'parent'
  53. if category:
  54. product_form['productcategory_set-0-category'] = category.id
  55. return product_form.submit()
  56. def test_title_is_required(self):
  57. response = self.submit(title='')
  58. self.assertContains(response, "must have a title")
  59. self.assertEqual(Product.objects.count(), 0)
  60. def test_requires_a_category(self):
  61. response = self.submit(title="Nice T-Shirt")
  62. self.assertContains(response,
  63. "must have at least one category")
  64. self.assertEqual(Product.objects.count(), 0)
  65. def test_for_smoke(self):
  66. category = CategoryFactory()
  67. response = self.submit(title='testing', category=category)
  68. self.assertIsRedirect(response)
  69. self.assertEqual(Product.objects.count(), 1)
  70. def test_doesnt_allow_duplicate_upc(self):
  71. ProductFactory(parent=None, upc="12345")
  72. category = CategoryFactory()
  73. self.assertTrue(Product.objects.get(upc="12345"))
  74. response = self.submit(title="Nice T-Shirt", category=category,
  75. upc="12345")
  76. self.assertEqual(Product.objects.count(), 1)
  77. self.assertNotEqual(Product.objects.get(upc='12345').title,
  78. 'Nice T-Shirt')
  79. self.assertContains(response,
  80. "Product with this UPC already exists.")
  81. class TestCreateChildProduct(ProductWebTest):
  82. is_staff = True
  83. def setUp(self):
  84. self.pclass = ProductClassFactory(name='Books', slug='books')
  85. self.parent = ProductFactory(structure='parent', stockrecords=[])
  86. super(TestCreateChildProduct, self).setUp()
  87. def test_categories_are_not_required(self):
  88. url = reverse('dashboard:catalogue-product-create-child',
  89. kwargs={'parent_pk': self.parent.pk})
  90. page = self.get(url)
  91. product_form = page.form
  92. product_form['title'] = expected_title = 'Nice T-Shirt'
  93. product_form.submit()
  94. try:
  95. product = Product.objects.get(title=expected_title)
  96. except Product.DoesNotExist:
  97. self.fail('creating a child product did not work')
  98. self.assertEqual(product.parent, self.parent)
  99. class TestProductUpdate(ProductWebTest):
  100. def test_product_update_form(self):
  101. self.product = factories.ProductFactory()
  102. url = reverse('dashboard:catalogue-product',
  103. kwargs={'pk': self.product.id})
  104. page = self.get(url)
  105. product_form = page.form
  106. product_form['title'] = expected_title = 'Nice T-Shirt'
  107. page = product_form.submit()
  108. product = Product.objects.get(id=self.product.id)
  109. self.assertEqual(page.context['product'], self.product)
  110. self.assertEqual(product.title, expected_title)
  111. class TestProductClass(ProductWebTest):
  112. def setUp(self):
  113. super(TestProductClass, self).setUp()
  114. self.pclass = ProductClassFactory(name='T-Shirts', slug='tshirts')
  115. for attribute_type, __ in ProductAttribute.TYPE_CHOICES:
  116. values = {
  117. 'type': attribute_type, 'code': attribute_type,
  118. 'product_class': self.pclass, 'name': attribute_type,
  119. }
  120. if attribute_type == ProductAttribute.OPTION:
  121. option_group = factories.AttributeOptionGroupFactory()
  122. self.option = factories.AttributeOptionFactory(group=option_group)
  123. values['option_group'] = option_group
  124. ProductAttributeFactory(**values)
  125. self.product = factories.ProductFactory(product_class=self.pclass)
  126. self.url = reverse('dashboard:catalogue-product',
  127. kwargs={'pk': self.product.id})
  128. def test_product_update_attribute_values(self):
  129. page = self.get(self.url)
  130. product_form = page.form
  131. # Send string field values due to an error
  132. # in the Webtest during multipart form encode.
  133. product_form['attr_text'] = 'test1'
  134. product_form['attr_integer'] = '1'
  135. product_form['attr_float'] = '1.2'
  136. product_form['attr_boolean'] = 'yes'
  137. product_form['attr_richtext'] = 'longread'
  138. product_form['attr_date'] = '2016-10-12'
  139. product_form.submit()
  140. # Reloading model instance to re-initiate ProductAttributeContainer
  141. # with new attributes.
  142. self.product = Product.objects.get(pk=self.product.id)
  143. self.assertEquals(self.product.attr.text, 'test1')
  144. self.assertEquals(self.product.attr.integer, 1)
  145. self.assertEquals(self.product.attr.float, 1.2)
  146. self.assertTrue(self.product.attr.boolean)
  147. self.assertEquals(self.product.attr.richtext, 'longread')
  148. self.assertEquals(self.product.attr.date, datetime.date(2016, 10, 12))
  149. page = self.get(self.url)
  150. product_form = page.form
  151. product_form['attr_text'] = 'test2'
  152. product_form['attr_integer'] = '2'
  153. product_form['attr_float'] = '5.2'
  154. product_form['attr_boolean'] = ''
  155. product_form['attr_richtext'] = 'article'
  156. product_form['attr_date'] = '2016-10-10'
  157. product_form.submit()
  158. self.product = Product.objects.get(pk=self.product.id)
  159. self.assertEquals(self.product.attr.text, 'test2')
  160. self.assertEquals(self.product.attr.integer, 2)
  161. self.assertEquals(self.product.attr.float, 5.2)
  162. self.assertFalse(self.product.attr.boolean)
  163. self.assertEquals(self.product.attr.richtext, 'article')
  164. self.assertEquals(self.product.attr.date, datetime.date(2016, 10, 10))