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.

catalogue_tests.py 6.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. from django.test import TestCase
  2. from django.core.exceptions import ValidationError
  3. from oscar.apps.catalogue.models import Product, ProductClass, Category, \
  4. ProductAttribute
  5. from oscar.apps.catalogue.categories import create_from_breadcrumbs
  6. class TestProductClassModel(TestCase):
  7. def test_slug_is_auto_created(self):
  8. books = ProductClass.objects.create(
  9. name="Book",
  10. )
  11. self.assertEqual('book', books.slug)
  12. def test_has_attribute_for_whether_shipping_is_required(self):
  13. ""
  14. ProductClass.objects.create(
  15. name="Download",
  16. requires_shipping=False
  17. )
  18. class TestCategoryFactory(TestCase):
  19. def setUp(self):
  20. Category.objects.all().delete()
  21. def test_can_create_single_level_category(self):
  22. trail = 'Books'
  23. category = create_from_breadcrumbs(trail)
  24. self.assertIsNotNone(category)
  25. self.assertEquals(category.name, 'Books')
  26. self.assertEquals(category.slug, 'books')
  27. def test_can_create_parent_and_child_categories(self):
  28. trail = 'Books > Science-Fiction'
  29. category = create_from_breadcrumbs(trail)
  30. self.assertIsNotNone(category)
  31. self.assertEquals(category.name, 'Science-Fiction')
  32. self.assertEquals(category.get_depth(), 2)
  33. self.assertEquals(category.get_parent().name, 'Books')
  34. self.assertEquals(2, Category.objects.count())
  35. self.assertEquals(category.slug, 'books/science-fiction')
  36. def test_can_create_multiple_categories(self):
  37. trail = 'Books > Science-Fiction > Star Trek'
  38. create_from_breadcrumbs(trail)
  39. trail = 'Books > Factual > Popular Science'
  40. category = create_from_breadcrumbs(trail)
  41. self.assertIsNotNone(category)
  42. self.assertEquals(category.name, 'Popular Science')
  43. self.assertEquals(category.get_depth(), 3)
  44. self.assertEquals(category.get_parent().name, 'Factual')
  45. self.assertEquals(5, Category.objects.count())
  46. self.assertEquals(category.slug, 'books/factual/popular-science', )
  47. def test_can_use_alternative_separator(self):
  48. trail = 'Food|Cheese|Blue'
  49. create_from_breadcrumbs(trail, separator='|')
  50. self.assertEquals(3, len(Category.objects.all()))
  51. def test_updating_subtree_slugs_when_moving_category_to_new_parent(self):
  52. trail = 'A > B > C'
  53. create_from_breadcrumbs(trail)
  54. trail = 'A > B > D'
  55. create_from_breadcrumbs(trail)
  56. trail = 'A > E > F'
  57. create_from_breadcrumbs(trail)
  58. trail = 'A > E > G'
  59. create_from_breadcrumbs(trail)
  60. trail = 'T'
  61. target = create_from_breadcrumbs(trail)
  62. category = Category.objects.get(name='A')
  63. category.move(target, pos='first-child')
  64. c1 = Category.objects.get(name='A')
  65. self.assertEqual(c1.slug, 't/a')
  66. self.assertEqual(c1.full_name, 'T > A')
  67. child = Category.objects.get(name='F')
  68. self.assertEqual(child.slug, 't/a/e/f')
  69. self.assertEqual(child.full_name, 'T > A > E > F')
  70. child = Category.objects.get(name='D')
  71. self.assertEqual(child.slug, 't/a/b/d')
  72. self.assertEqual(child.full_name, 'T > A > B > D')
  73. def test_updating_subtree_when_moving_category_to_new_sibling(self):
  74. trail = 'A > B > C'
  75. create_from_breadcrumbs(trail)
  76. trail = 'A > B > D'
  77. create_from_breadcrumbs(trail)
  78. trail = 'A > E > F'
  79. create_from_breadcrumbs(trail)
  80. trail = 'A > E > G'
  81. create_from_breadcrumbs(trail)
  82. category = Category.objects.get(name='E')
  83. target = Category.objects.get(name='A')
  84. category.move(target, pos='right')
  85. child = Category.objects.get(name='E')
  86. self.assertEqual(child.slug, 'e')
  87. self.assertEqual(child.full_name, 'E')
  88. child = Category.objects.get(name='F')
  89. self.assertEqual(child.slug, 'e/f')
  90. self.assertEqual(child.full_name, 'E > F')
  91. class TestCategory(TestCase):
  92. def test_supports_has_children_method(self):
  93. """Supports has_children method"""
  94. root = Category.add_root(name="Products")
  95. self.assertFalse(root.has_children())
  96. root.add_child(name="Books")
  97. self.assertTrue(root.has_children())
  98. def test_enforces_slug_uniqueness(self):
  99. root = Category.add_root(name="Products")
  100. root.add_child(name="Books")
  101. with self.assertRaises(ValidationError):
  102. root.add_child(name="Books")
  103. class ProductTests(TestCase):
  104. def setUp(self):
  105. self.product_class,_ = ProductClass.objects.get_or_create(name='Clothing')
  106. class ProductCreationTests(ProductTests):
  107. def setUp(self):
  108. super(ProductCreationTests, self).setUp()
  109. ProductAttribute.objects.create(product_class=self.product_class,
  110. name='Number of pages',
  111. code='num_pages',
  112. type='integer')
  113. Product.ENABLE_ATTRIBUTE_BINDING = True
  114. def tearDown(self):
  115. Product.ENABLE_ATTRIBUTE_BINDING = False
  116. def test_create_products_with_attributes(self):
  117. product = Product(upc='1234',
  118. product_class=self.product_class,
  119. title='testing')
  120. product.attr.num_pages = 100
  121. product.save()
  122. class TopLevelProductTests(ProductTests):
  123. def test_top_level_products_must_have_titles(self):
  124. self.assertRaises(ValidationError, Product.objects.create, product_class=self.product_class)
  125. class VariantProductTests(ProductTests):
  126. def setUp(self):
  127. super(VariantProductTests, self).setUp()
  128. self.parent = Product.objects.create(title="Parent product", product_class=self.product_class)
  129. def test_variant_products_dont_need_titles(self):
  130. Product.objects.create(parent=self.parent, product_class=self.product_class)
  131. def test_variant_products_dont_need_a_product_class(self):
  132. Product.objects.create(parent=self.parent)
  133. def test_variant_products_inherit_parent_titles(self):
  134. p = Product.objects.create(parent=self.parent, product_class=self.product_class)
  135. self.assertEquals("Parent product", p.get_title())
  136. def test_variant_products_inherit_product_class(self):
  137. p = Product.objects.create(parent=self.parent)
  138. self.assertEquals("Clothing", p.get_product_class().name)