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.

helpers.py 5.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. from StringIO import StringIO
  2. from decimal import Decimal as D
  3. import random
  4. from django.test import TestCase
  5. from django.core.servers.basehttp import AdminMediaHandler
  6. from django.core.handlers.wsgi import WSGIHandler
  7. from django.core.urlresolvers import reverse
  8. from oscar.apps.basket.models import Basket
  9. from oscar.apps.catalogue.models import ProductClass, Product, ProductAttribute, ProductAttributeValue
  10. from oscar.apps.checkout.calculators import OrderTotalCalculator
  11. from oscar.apps.order.utils import OrderCreator
  12. from oscar.apps.partner.models import Partner, StockRecord
  13. from oscar.apps.shipping.methods import Free
  14. from oscar.apps.offer.models import Range, ConditionalOffer, Condition, Benefit
  15. def create_product(price=None, title="Dummy title", product_class="Dummy item class",
  16. partner="Dummy partner", partner_sku=None, upc=None, num_in_stock=10, attributes=None):
  17. """
  18. Helper method for creating products that are used in tests.
  19. """
  20. ic,_ = ProductClass._default_manager.get_or_create(name=product_class)
  21. item = Product._default_manager.create(title=title, product_class=ic, upc=upc)
  22. if price is not None or partner_sku or num_in_stock is not None:
  23. if not partner_sku:
  24. partner_sku = 'sku_%d_%d' % (item.id, random.randint(0, 10000))
  25. if not price:
  26. price = D('10.00')
  27. partner,_ = Partner._default_manager.get_or_create(name=partner)
  28. StockRecord._default_manager.create(product=item, partner=partner,
  29. partner_sku=partner_sku,
  30. price_excl_tax=price, num_in_stock=num_in_stock)
  31. if attributes:
  32. for key, value in attributes.items():
  33. attr,_ = ProductAttribute.objects.get_or_create(name=key, code=key)
  34. ProductAttributeValue.objects.create(product=item, attribute=attr, value=value)
  35. return item
  36. def create_order(number=None, basket=None, user=None, shipping_address=None, shipping_method=None,
  37. billing_address=None, total_incl_tax=None, total_excl_tax=None, **kwargs):
  38. """
  39. Helper method for creating an order for testing
  40. """
  41. if not basket:
  42. basket = Basket.objects.create()
  43. basket.add_product(create_product(price=D('10.00')))
  44. if not basket.id:
  45. basket.save()
  46. if shipping_method is None:
  47. shipping_method = Free()
  48. if total_incl_tax is None or total_excl_tax is None:
  49. calc = OrderTotalCalculator()
  50. total_incl_tax = calc.order_total_incl_tax(basket, shipping_method)
  51. total_excl_tax = calc.order_total_excl_tax(basket, shipping_method)
  52. order = OrderCreator().place_order(
  53. order_number=number,
  54. user=user,
  55. basket=basket,
  56. shipping_address=shipping_address,
  57. shipping_method=shipping_method,
  58. billing_address=billing_address,
  59. total_incl_tax=total_incl_tax,
  60. total_excl_tax=total_excl_tax,
  61. **kwargs
  62. )
  63. return order
  64. def create_offer():
  65. range = Range.objects.create(name="All products range", includes_all_products=True)
  66. condition = Condition.objects.create(range=range,
  67. type=Condition.COUNT,
  68. value=1)
  69. benefit = Benefit.objects.create(range=range,
  70. type=Benefit.PERCENTAGE,
  71. value=20)
  72. offer= ConditionalOffer.objects.create(
  73. name='Dummy offer',
  74. offer_type='Site',
  75. condition=condition,
  76. benefit=benefit
  77. )
  78. return offer
  79. class TwillTestCase(TestCase):
  80. """
  81. Simple wrapper around Twill to make writing TestCases easier.
  82. Commands availabel through self.command are:
  83. - go -> visit a URL
  84. - back -> back to previous URL
  85. - reload -> reload URL
  86. - follow -> follow a given link
  87. - code -> assert the HTTP response code
  88. - find -> assert page contains some string
  89. - notfind -> assert page does not contain
  90. - title -> assert page title
  91. """
  92. HOST = '127.0.0.1'
  93. PORT = 8080
  94. def setUp(self):
  95. app = AdminMediaHandler(WSGIHandler())
  96. twill.add_wsgi_intercept(self.HOST, self.PORT, lambda: app)
  97. twill.set_output(StringIO())
  98. self.command = twill.commands
  99. def tearDown(self):
  100. twill.remove_wsgi_intercept(self.HOST, self.PORT)
  101. def reverse(self, url_name, *args, **kwargs):
  102. """
  103. Custom 'reverse' function that includes the protocol and host
  104. """
  105. return 'http://%s:%d%s' % (self.HOST, self.PORT, reverse(url_name, *args, **kwargs))
  106. def visit(self, url_name, *args,**kwargs):
  107. self.command.go(self.reverse(url_name, *args, **kwargs))
  108. def assertResponseCodeIs(self, code):
  109. self.command.code(code)
  110. def assertPageContains(self, regexp):
  111. self.command.find(regexp)
  112. def assertPageDoesNotContain(self, regexp):
  113. self.command.notfind(regexp)
  114. def assertPageTitleMatches(self, regexp):
  115. self.command.title(regexp)