/marketing/tests.py

https://github.com/feuervogel/lfs · Python · 272 lines · 152 code · 59 blank · 61 comment · 0 complexity · 3571cfe2873a6efa06f885dc861a010c MD5 · raw file

  1. # python imports
  2. from datetime import datetime
  3. from datetime import timedelta
  4. # django imports
  5. from django.core.urlresolvers import reverse
  6. from django.test import TestCase
  7. # lfs import
  8. from lfs.catalog.models import Category
  9. from lfs.catalog.models import Product
  10. import lfs.marketing.utils
  11. from lfs.marketing.models import Topseller
  12. from lfs.order.models import Order
  13. from lfs.order.models import OrderItem
  14. from lfs.order.settings import CLOSED
  15. class RatingMailTestCase(TestCase):
  16. """
  17. """
  18. def setUp(self):
  19. """
  20. """
  21. self.p1 = Product.objects.create(name="Product 1", slug="product-1", active=True)
  22. self.c1 = Category.objects.create(name="Category 1", slug="category-1")
  23. self.c1.save()
  24. self.c1.products = (self.p1, )
  25. self.c1.save()
  26. self.o = Order.objects.create(invoice_country_id=1, shipping_country_id=1)
  27. self.oi1 = OrderItem.objects.create(order=self.o, product_amount=1, product=self.p1)
  28. def test_get_orders(self):
  29. """
  30. """
  31. # First there is no closed order
  32. orders = lfs.marketing.utils.get_orders()
  33. self.assertEqual(len(orders), 0)
  34. # Close order
  35. self.o.state = CLOSED
  36. self.o.save()
  37. # But order is closed within the limit, so there is still no order for
  38. # rating mails
  39. orders = lfs.marketing.utils.get_orders()
  40. self.assertEqual(len(orders), 0)
  41. # Set the state modified date before the limit
  42. self.o.state_modified = datetime.now() - timedelta(days=15)
  43. self.o.save()
  44. # Now there is a order for which there should a rating mail be sent
  45. orders = lfs.marketing.utils.get_orders()
  46. self.assertEqual(len(orders), 1)
  47. class TopsellerTestCase(TestCase):
  48. """Tests the Topseller model
  49. """
  50. def setUp(self):
  51. """
  52. """
  53. self.p1 = Product.objects.create(name="Product 1", slug="product-1", active=True)
  54. self.t1 = Topseller.objects.create(product = self.p1)
  55. def test_defaults(self):
  56. """
  57. """
  58. self.assertEqual(self.t1.position, 1)
  59. class UtilsTestCase(TestCase):
  60. """Tests the utils of the lfs.marketing
  61. """
  62. def setUp(self):
  63. """
  64. """
  65. self.p1 = Product.objects.create(name="Product 1", slug="product-1", active=True)
  66. self.p2 = Product.objects.create(name="Product 2", slug="product-2", active=True)
  67. self.p3 = Product.objects.create(name="Product 3", slug="product-3", active=True)
  68. self.p4 = Product.objects.create(name="Product 4", slug="product-4", active=True)
  69. self.c1 = Category.objects.create(name="Category 1", slug="category-1")
  70. self.c1.save()
  71. self.c11 = Category.objects.create(name="Category 11", slug="category-11", parent=self.c1)
  72. self.c11.products = (self.p1, self.p2)
  73. self.c11.save()
  74. self.c12 = Category.objects.create(name="Category 12", slug="category-12", parent=self.c1)
  75. self.c12.products = (self.p3, self.p4)
  76. self.c12.save()
  77. self.o = Order.objects.create(invoice_country_id=1, shipping_country_id=1)
  78. self.oi1 = OrderItem.objects.create(order=self.o, product_amount=1, product=self.p1)
  79. self.oi2 = OrderItem.objects.create(order=self.o, product_amount=2, product=self.p2)
  80. self.oi3 = OrderItem.objects.create(order=self.o, product_amount=3, product=self.p3)
  81. self.oi4 = OrderItem.objects.create(order=self.o, product_amount=4, product=self.p4)
  82. def test_topseller_1(self):
  83. """Tests general topsellers.
  84. """
  85. ts = lfs.marketing.utils.get_topseller(2)
  86. self.assertEqual(len(ts), 2)
  87. self.assertEqual(ts[0], self.p4)
  88. self.assertEqual(ts[1], self.p3)
  89. def test_topseller_2(self):
  90. """Tests general topseller with explicitly selected products.
  91. """
  92. # Explicit topseller
  93. self.p5 = Product.objects.create(name="Product 5", slug="product-5", active=True)
  94. t5 = Topseller.objects.create(product=self.p5, position=1)
  95. ts = lfs.marketing.utils.get_topseller(2)
  96. self.assertEqual(ts[0], self.p5)
  97. self.assertEqual(ts[1], self.p4)
  98. self.p6 = Product.objects.create(name="Product 6", slug="product-6", active=True)
  99. t6 = Topseller.objects.create(product=self.p6, position=2)
  100. ts = lfs.marketing.utils.get_topseller(2)
  101. self.assertEqual(ts[0], self.p5)
  102. self.assertEqual(ts[1], self.p6)
  103. # Exchange positions
  104. t5.position = 2
  105. t5.save()
  106. t6.position = 1
  107. t6.save()
  108. ts = lfs.marketing.utils.get_topseller(2)
  109. self.assertEqual(ts[0], self.p6)
  110. self.assertEqual(ts[1], self.p5)
  111. # Now the position is to greater than limit, so it shouldn't be within
  112. # topsellers at all
  113. t6.position = 3
  114. t6.save()
  115. ts = lfs.marketing.utils.get_topseller(2)
  116. self.assertEqual(ts[0], self.p4)
  117. self.assertEqual(ts[1], self.p5) # has to be on pasition 2
  118. def test_topseller_3(self):
  119. """Tests general topseller with explicitly assigned products which
  120. are also in calculated topsellers.
  121. """
  122. ts = lfs.marketing.utils.get_topseller(2)
  123. self.assertEqual(len(ts), 2)
  124. self.assertEqual(ts[0], self.p4)
  125. self.assertEqual(ts[1], self.p3)
  126. # Explicit topseller P4, which is already a topseller
  127. t = Topseller.objects.create(product=self.p4, position=1)
  128. # P4 should only displayed once
  129. ts = lfs.marketing.utils.get_topseller(2)
  130. self.assertEqual(ts[0], self.p4)
  131. self.assertEqual(ts[1], self.p3)
  132. def test_topseller_for_category_1(self):
  133. """Tests topseller for specific categories.
  134. """
  135. # Tests the top level category
  136. ts = lfs.marketing.utils.get_topseller_for_category(self.c1, limit=2)
  137. self.assertEqual(len(ts), 2)
  138. self.assertEqual(ts[0], self.p4)
  139. self.assertEqual(ts[1], self.p3)
  140. # Tests the direct categories
  141. ts = lfs.marketing.utils.get_topseller_for_category(self.c11, limit=1)
  142. self.assertEqual(len(ts), 1)
  143. self.assertEqual(ts[0], self.p2)
  144. ts = lfs.marketing.utils.get_topseller_for_category(self.c12, limit=1)
  145. self.assertEqual(len(ts), 1)
  146. self.assertEqual(ts[0], self.p4)
  147. def test_topseller_for_category_2(self):
  148. """Tests the top seller for specific categories. With explicitly
  149. selected products
  150. """
  151. # Explicit topseller for c1
  152. self.p5 = Product.objects.create(name="Product 5", slug="product-5", active=True)
  153. t5 = Topseller.objects.create(product=self.p5, position=1)
  154. self.c11.products = (self.p1, self.p2, self.p5)
  155. # Tests the top level category
  156. ts = lfs.marketing.utils.get_topseller_for_category(self.c1, limit=2)
  157. self.assertEqual(len(ts), 2)
  158. self.assertEqual(ts[0], self.p5)
  159. self.assertEqual(ts[1], self.p4)
  160. # Tests the direct categories
  161. ts = lfs.marketing.utils.get_topseller_for_category(self.c11, limit=2)
  162. self.assertEqual(len(ts), 2)
  163. self.assertEqual(ts[0], self.p5)
  164. self.assertEqual(ts[1], self.p2)
  165. # The explicit topseller with category 1 has no impact for topsellers of
  166. # c2
  167. ts = lfs.marketing.utils.get_topseller_for_category(self.c12, limit=2)
  168. self.assertEqual(len(ts), 2)
  169. self.assertEqual(ts[0], self.p4)
  170. self.assertEqual(ts[1], self.p3)
  171. # Now we add Product 5 also to c12
  172. self.c12.products = (self.p3, self.p4, self.p5)
  173. self.c12.save()
  174. # Now Product 5 is among the topseller
  175. ts = lfs.marketing.utils.get_topseller_for_category(self.c12, limit=2)
  176. self.assertEqual(len(ts), 2)
  177. self.assertEqual(ts[0], self.p5)
  178. self.assertEqual(ts[1], self.p4)
  179. # Change to position of p5 to 2
  180. t5.position = 2
  181. t5.save()
  182. ts = lfs.marketing.utils.get_topseller_for_category(self.c12, limit=2)
  183. self.assertEqual(len(ts), 2)
  184. self.assertEqual(ts[0], self.p4)
  185. self.assertEqual(ts[1], self.p5)
  186. # Change to position of p5 to 3. it isn't within topsellers anymore
  187. t5.position = 3
  188. t5.save()
  189. ts = lfs.marketing.utils.get_topseller_for_category(self.c12, limit=2)
  190. self.assertEqual(len(ts), 2)
  191. self.assertEqual(ts[0], self.p4)
  192. self.assertEqual(ts[1], self.p3)
  193. def test_topseller_for_category_3(self):
  194. """Tests the top seller for specific categories. With explicitly
  195. selected products and ca
  196. """
  197. # Tests the top level category
  198. ts = lfs.marketing.utils.get_topseller_for_category(self.c1, limit=2)
  199. self.assertEqual(len(ts), 2)
  200. self.assertEqual(ts[0], self.p4)
  201. self.assertEqual(ts[1], self.p3)
  202. # Explicit topseller P4 for c1, which is already a topseller
  203. t = Topseller.objects.create(product=self.p4, position=1)
  204. # Tests the top level category
  205. ts = lfs.marketing.utils.get_topseller_for_category(self.c1, limit=2)
  206. self.assertEqual(len(ts), 2)
  207. self.assertEqual(ts[0], self.p4)
  208. self.assertEqual(ts[1], self.p3)
  209. # Tests the direct categories
  210. ts = lfs.marketing.utils.get_topseller_for_category(self.c12, limit=2)
  211. self.assertEqual(len(ts), 2)
  212. self.assertEqual(ts[0], self.p4)
  213. self.assertEqual(ts[1], self.p3)