Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

helpers.py 4.9KB

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