Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

datacash.py 6.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. import mock
  2. from decimal import Decimal as D
  3. from xml.dom.minidom import parseString
  4. from django.test import TestCase
  5. from oscar.apps.payment.datacash.utils import Gateway
  6. class TransactionMixin(object):
  7. def init_gateway(self):
  8. self.gateway = Gateway(client="DUMMY", password="123456")
  9. self.transport = mock.Mock()
  10. self.gateway.do_request = self.transport
  11. def assertXmlTagValue(self, tag_name, value):
  12. request_xml = self.transport.call_args[0][0]
  13. doc = parseString(request_xml)
  14. try:
  15. tag = doc.getElementsByTagName(tag_name)[0]
  16. self.assertEquals(value, tag.firstChild.data)
  17. except IndexError:
  18. self.fail("Tag '%s' not found\n%s" % (tag_name, request_xml))
  19. def make_request(self, **kwargs):
  20. """
  21. Needs to be implemented by subclass.
  22. """
  23. pass
  24. def assertXmlTagAttributeValue(self, tag_name, attribute, value):
  25. request_xml = self.transport.call_args[0][0]
  26. doc = parseString(request_xml)
  27. try:
  28. tag = doc.getElementsByTagName(tag_name)[0]
  29. self.assertEquals(value, tag.attributes[attribute].value)
  30. except IndexError:
  31. self.fail("Tag '%s' not found\n%s" % (tagName, request_xml))
  32. def test_request_includes_credentials(self):
  33. self.make_request()
  34. self.assertTrue(self.transport.called)
  35. self.assertXmlTagValue('client', 'DUMMY')
  36. self.assertXmlTagValue('password', '123456')
  37. class InitialTransactionMixin(TransactionMixin):
  38. def test_request_includes_merchant_reference(self):
  39. self.make_request()
  40. self.assertXmlTagValue('merchantreference', '123123')
  41. def test_request_includes_amount_and_currency(self):
  42. self.make_request()
  43. self.assertXmlTagValue('amount', '12.99')
  44. self.assertXmlTagAttributeValue('amount', 'currency', 'GBP')
  45. def test_request_can_include_authcode(self):
  46. self.make_request(auth_code='334455')
  47. self.assertXmlTagValue('authcode', '334455')
  48. def test_request_includes_card_details(self):
  49. self.make_request(start_date='01/10')
  50. self.assertXmlTagValue('pan', '1000010000000007')
  51. self.assertXmlTagValue('startdate', '01/10')
  52. self.assertXmlTagValue('expirydate', '01/12')
  53. def test_request_can_include_issue_number(self):
  54. self.make_request(issue_number='03')
  55. self.assertXmlTagValue('issuenumber', '03')
  56. def test_request_can_include_authcode(self):
  57. self.make_request(auth_code='334455')
  58. self.assertXmlTagValue('authcode', '334455')
  59. class AuthTransactionTests(TestCase, InitialTransactionMixin):
  60. def setUp(self):
  61. self.init_gateway()
  62. def make_request(self, **kwargs):
  63. self.gateway.auth(card_number='1000010000000007',
  64. expiry_date='01/12',
  65. merchant_reference='123123',
  66. currency='GBP',
  67. amount=D('12.99'),
  68. **kwargs)
  69. def test_request_includes_method(self):
  70. self.make_request()
  71. self.assertXmlTagValue('method', 'auth')
  72. class PreTransactionTests(TestCase, InitialTransactionMixin):
  73. def setUp(self):
  74. self.init_gateway()
  75. def make_request(self, **kwargs):
  76. self.gateway.pre(card_number='1000010000000007',
  77. expiry_date='01/12',
  78. merchant_reference='123123',
  79. currency='GBP',
  80. amount=D('12.99'),
  81. **kwargs)
  82. def test_request_includes_method(self):
  83. self.make_request()
  84. self.assertXmlTagValue('method', 'pre')
  85. class RefundTransactionTests(TestCase, InitialTransactionMixin):
  86. def setUp(self):
  87. self.init_gateway()
  88. def make_request(self, **kwargs):
  89. self.gateway.refund(card_number='1000010000000007',
  90. expiry_date='01/12',
  91. merchant_reference='123123',
  92. currency='GBP',
  93. amount=D('12.99'),
  94. **kwargs)
  95. def test_request_includes_method(self):
  96. self.make_request()
  97. self.assertXmlTagValue('method', 'refund')
  98. class ErpTransactionTests(TestCase, InitialTransactionMixin):
  99. def setUp(self):
  100. self.init_gateway()
  101. def make_request(self, **kwargs):
  102. self.gateway.erp(card_number='1000010000000007',
  103. expiry_date='01/12',
  104. merchant_reference='123123',
  105. currency='GBP',
  106. amount=D('12.99'),
  107. **kwargs)
  108. def test_request_includes_method(self):
  109. self.make_request()
  110. self.assertXmlTagValue('method', 'erp')
  111. class CancelTransactionTests(TestCase, TransactionMixin):
  112. def setUp(self):
  113. self.init_gateway()
  114. def make_request(self, **kwargs):
  115. self.gateway.cancel(txn_reference='12312333444')
  116. def test_request_includes_method(self):
  117. self.make_request()
  118. self.assertXmlTagValue('method', 'cancel')
  119. def test_request_includes_reference(self):
  120. self.make_request()
  121. self.assertXmlTagValue('reference', '12312333444')
  122. class FulfilTransactionTests(TestCase, TransactionMixin):
  123. def setUp(self):
  124. self.init_gateway()
  125. def make_request(self, **kwargs):
  126. self.gateway.fulfil(currency='GBP',
  127. amount=D('12.99'),
  128. txn_reference='12312333444',
  129. auth_code='123444')
  130. def test_request_includes_method(self):
  131. self.make_request()
  132. self.assertXmlTagValue('method', 'fulfil')
  133. def test_request_includes_reference(self):
  134. self.make_request()
  135. self.assertXmlTagValue('reference', '12312333444')
  136. def test_request_includes_authcode(self):
  137. self.make_request()
  138. self.assertXmlTagValue('authcode', '123444')
  139. class TxnRefundTransactionTests(TestCase, TransactionMixin):
  140. def setUp(self):
  141. self.init_gateway()
  142. def make_request(self, **kwargs):
  143. self.gateway.txn_refund(currency='GBP',
  144. amount=D('12.99'),
  145. txn_reference='12312333444')
  146. def test_request_includes_method(self):
  147. self.make_request()
  148. self.assertXmlTagValue('method', 'txn_refund')
  149. def test_request_includes_reference(self):
  150. self.make_request()
  151. self.assertXmlTagValue('reference', '12312333444')