You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
2.5 KiB
Python
76 lines
2.5 KiB
Python
6 years ago
|
from datetime import timedelta
|
||
|
|
||
|
from django.test import TestCase, RequestFactory
|
||
|
from django.http import HttpResponseRedirect
|
||
|
from django.contrib.auth.models import User
|
||
|
|
||
|
from payments.models import Payment
|
||
|
from payments.backends import CoinGateBackend
|
||
|
|
||
|
|
||
|
class CoinGateBackendTest(TestCase):
|
||
|
def setUp(self):
|
||
|
self.user = User.objects.create_user('test', 'test_user@example.com', None)
|
||
|
|
||
|
self.backend_settings = dict(
|
||
|
API_TOKEN='test',
|
||
|
TITLE='Test Title',
|
||
|
CURRENCY='EUR',
|
||
|
)
|
||
|
|
||
|
def test_payment(self):
|
||
|
payment = Payment.objects.create(
|
||
|
user=self.user,
|
||
|
time=timedelta(days=30),
|
||
|
backend_id='coingate',
|
||
|
amount=300
|
||
|
)
|
||
|
|
||
|
def fake_post(_backend, *, data={}):
|
||
|
self.assertEqual(data['order_id'], '1')
|
||
|
self.assertEqual(data['price_amount'], 3.0)
|
||
|
self.assertEqual(data['price_currency'], 'EUR')
|
||
|
self.assertEqual(data['receive_currency'], 'EUR')
|
||
|
return {'id': 42, 'payment_url': 'http://testtoken/'}
|
||
|
|
||
|
with self.settings(ROOT_URL='root'):
|
||
|
backend = CoinGateBackend(self.backend_settings)
|
||
|
backend._post = fake_post
|
||
|
redirect = backend.new_payment(payment)
|
||
|
|
||
|
self.assertIsInstance(redirect, HttpResponseRedirect)
|
||
|
self.assertEqual(redirect.url, 'http://testtoken/')
|
||
|
self.assertEqual(payment.backend_data.get('coingate_id'), 42)
|
||
|
|
||
|
|
||
|
# Test a standard successful payment callback flow
|
||
|
|
||
|
def post_callback(status):
|
||
|
callback_data = {
|
||
|
'token': payment.backend_data['coingate_token'],
|
||
|
'order_id': str(payment.id),
|
||
|
'status': status,
|
||
|
}
|
||
|
ipn_url = '/payments/callback/coingate/%d' % payment.id
|
||
|
ipn_request = RequestFactory().post(
|
||
|
ipn_url,
|
||
|
data=callback_data)
|
||
|
return backend.callback(payment, ipn_request)
|
||
|
|
||
|
r = post_callback('pending')
|
||
|
self.assertTrue(r)
|
||
|
self.assertEqual(payment.status, 'new')
|
||
|
|
||
|
r = post_callback('confirming')
|
||
|
self.assertTrue(r)
|
||
|
self.assertEqual(payment.status, 'new')
|
||
|
|
||
|
r = post_callback('paid')
|
||
|
self.assertTrue(r)
|
||
|
self.assertEqual(payment.status, 'confirmed')
|
||
|
self.assertEqual(payment.paid_amount, 300)
|
||
|
|
||
|
time_left_s = self.user.vpnuser.time_left.total_seconds()
|
||
|
self.assertAlmostEqual(time_left_s, payment.time.total_seconds(), delta=60)
|
||
|
|