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 4.1KB

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