您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

product_tests.py 7.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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, "must have at least one category")
  63. self.assertEqual(Product.objects.count(), 0)
  64. def test_for_smoke(self):
  65. category = CategoryFactory()
  66. response = self.submit(title='testing', category=category)
  67. self.assertIsRedirect(response)
  68. self.assertEqual(Product.objects.count(), 1)
  69. def test_doesnt_allow_duplicate_upc(self):
  70. ProductFactory(parent=None, upc="12345")
  71. category = CategoryFactory()
  72. self.assertTrue(Product.objects.get(upc="12345"))
  73. response = self.submit(title="Nice T-Shirt", category=category,
  74. upc="12345")
  75. self.assertEqual(Product.objects.count(), 1)
  76. self.assertNotEqual(Product.objects.get(upc='12345').title,
  77. 'Nice T-Shirt')
  78. self.assertContains(response,
  79. "Product with this UPC already exists.")
  80. class TestCreateChildProduct(ProductWebTest):
  81. is_staff = True
  82. def setUp(self):
  83. self.pclass = ProductClassFactory(name='Books', slug='books')
  84. self.parent = ProductFactory(structure='parent', stockrecords=[])
  85. super(TestCreateChildProduct, self).setUp()
  86. def test_categories_are_not_required(self):
  87. url = reverse('dashboard:catalogue-product-create-child',
  88. kwargs={'parent_pk': self.parent.pk})
  89. page = self.get(url)
  90. product_form = page.form
  91. product_form['title'] = expected_title = 'Nice T-Shirt'
  92. product_form.submit()
  93. try:
  94. product = Product.objects.get(title=expected_title)
  95. except Product.DoesNotExist:
  96. self.fail('creating a child product did not work')
  97. self.assertEqual(product.parent, self.parent)
  98. class TestProductUpdate(ProductWebTest):
  99. def test_product_update_form(self):
  100. self.product = factories.ProductFactory()
  101. url = reverse('dashboard:catalogue-product',
  102. kwargs={'pk': self.product.id})
  103. page = self.get(url)
  104. product_form = page.form
  105. product_form['title'] = expected_title = 'Nice T-Shirt'
  106. page = product_form.submit()
  107. product = Product.objects.get(id=self.product.id)
  108. self.assertEqual(page.context['product'], self.product)
  109. self.assertEqual(product.title, expected_title)
  110. class TestProductClass(ProductWebTest):
  111. def setUp(self):
  112. super(TestProductClass, self).setUp()
  113. self.pclass = ProductClassFactory(name='T-Shirts', slug='tshirts')
  114. for attribute_type, __ in ProductAttribute.TYPE_CHOICES:
  115. values = {
  116. 'type': attribute_type, 'code': attribute_type,
  117. 'product_class': self.pclass, 'name': attribute_type,
  118. }
  119. if attribute_type == ProductAttribute.OPTION:
  120. option_group = factories.AttributeOptionGroupFactory()
  121. self.option = factories.AttributeOptionFactory(group=option_group)
  122. values['option_group'] = option_group
  123. ProductAttributeFactory(**values)
  124. self.product = factories.ProductFactory(product_class=self.pclass)
  125. self.url = reverse('dashboard:catalogue-product',
  126. kwargs={'pk': self.product.id})
  127. def test_product_update_attribute_values(self):
  128. page = self.get(self.url)
  129. product_form = page.form
  130. # Send string field values due to an error
  131. # in the Webtest during multipart form encode.
  132. product_form['attr_text'] = 'test1'
  133. product_form['attr_integer'] = '1'
  134. product_form['attr_float'] = '1.2'
  135. product_form['attr_boolean'] = 'yes'
  136. product_form['attr_richtext'] = 'longread'
  137. product_form['attr_date'] = '2016-10-12'
  138. product_form.submit()
  139. # Reloading model instance to re-initiate ProductAttributeContainer
  140. # with new attributes.
  141. self.product = Product.objects.get(pk=self.product.id)
  142. self.assertEquals(self.product.attr.text, 'test1')
  143. self.assertEquals(self.product.attr.integer, 1)
  144. self.assertEquals(self.product.attr.float, 1.2)
  145. self.assertTrue(self.product.attr.boolean)
  146. self.assertEquals(self.product.attr.richtext, 'longread')
  147. self.assertEquals(self.product.attr.date, datetime.date(2016, 10, 12))
  148. page = self.get(self.url)
  149. product_form = page.form
  150. product_form['attr_text'] = 'test2'
  151. product_form['attr_integer'] = '2'
  152. product_form['attr_float'] = '5.2'
  153. product_form['attr_boolean'] = ''
  154. product_form['attr_richtext'] = 'article'
  155. product_form['attr_date'] = '2016-10-10'
  156. product_form.submit()
  157. self.product = Product.objects.get(pk=self.product.id)
  158. self.assertEquals(self.product.attr.text, 'test2')
  159. self.assertEquals(self.product.attr.integer, 2)
  160. self.assertEquals(self.product.attr.float, 5.2)
  161. self.assertFalse(self.product.attr.boolean)
  162. self.assertEquals(self.product.attr.richtext, 'article')
  163. self.assertEquals(self.product.attr.date, datetime.date(2016, 10, 10))