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

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)