Added some tests for subscription sign up, improved drone conf to cache pip packages
This commit is contained in:
parent
eac0e88596
commit
5c58aff874
|
@ -7,12 +7,14 @@ pipeline:
|
||||||
image: python:3.5
|
image: python:3.5
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
|
- PYTHONUSERBASE=/drone/src/cache/packages
|
||||||
- POSTGRES_USER=mhackspace
|
- POSTGRES_USER=mhackspace
|
||||||
- USE_DOCKER=yes
|
- USE_DOCKER=yes
|
||||||
- DJANGO_SETTINGS_MODULE=config.settings.test
|
- DJANGO_SETTINGS_MODULE=config.settings.test
|
||||||
commands:
|
commands:
|
||||||
- cp -n env.example .env
|
- cp -n env.example .env
|
||||||
- pip install -r ./requirements/test.txt
|
- mkdir -p ./cache/packages ./cache/pip
|
||||||
|
- pip install --user --cache-dir ./cache/pip -r ./requirements/test.txt
|
||||||
- python manage.py test mhackspace --verbosity 2
|
- python manage.py test mhackspace --verbosity 2
|
||||||
|
|
||||||
publish:
|
publish:
|
||||||
|
|
|
@ -5,3 +5,4 @@ node_modules
|
||||||
src
|
src
|
||||||
.env
|
.env
|
||||||
staticfiles/*
|
staticfiles/*
|
||||||
|
cache/
|
||||||
|
|
|
@ -200,7 +200,7 @@ LOGGING = {
|
||||||
},
|
},
|
||||||
'loggers': {
|
'loggers': {
|
||||||
'django.request': {
|
'django.request': {
|
||||||
'handlers': ['mail_admins'],
|
'handlers': ['mail_admins', 'logfile'],
|
||||||
'level': 'ERROR',
|
'level': 'ERROR',
|
||||||
'propagate': True
|
'propagate': True
|
||||||
},
|
},
|
||||||
|
|
|
@ -124,6 +124,17 @@ class gocardless_provider:
|
||||||
name=name,
|
name=name,
|
||||||
redirect_uri=redirect_success)
|
redirect_uri=redirect_success)
|
||||||
|
|
||||||
|
def confirm_subscription(self, provider_response):
|
||||||
|
response = gocardless.client.confirm_resource(provider_response)
|
||||||
|
subscription = gocardless.client.subscription(provider_response.get('resource_id'))
|
||||||
|
user = subscription.user()
|
||||||
|
return {
|
||||||
|
'amount': subscription.amount,
|
||||||
|
'email': user.email,
|
||||||
|
'start_date': subscription.created_at,
|
||||||
|
'reference': subscription.id,
|
||||||
|
'success': response.success
|
||||||
|
}
|
||||||
|
|
||||||
class braintree_provider:
|
class braintree_provider:
|
||||||
form_remote = False
|
form_remote = False
|
||||||
|
@ -154,6 +165,17 @@ class braintree_provider:
|
||||||
#'name': name
|
#'name': name
|
||||||
})
|
})
|
||||||
|
|
||||||
|
def confirm_subscription(self, args):
|
||||||
|
if self.provider == 'gocardless':
|
||||||
|
response = gocardless.client.confirm_resource(args)
|
||||||
|
subscription = gocardless.client.subscription(args.get('resource_id'))
|
||||||
|
return {
|
||||||
|
'amount': subscription.amount,
|
||||||
|
'start_date': subscription.created_at,
|
||||||
|
'reference': subscription.id
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
def fetch_subscriptions(self):
|
def fetch_subscriptions(self):
|
||||||
for paying_member in braintree.Subscription.search(braintree.SubscriptionSearch.status == braintree.Subscription.Status.Active):
|
for paying_member in braintree.Subscription.search(braintree.SubscriptionSearch.status == braintree.Subscription.Status.Active):
|
||||||
user=paying_member.user()
|
user=paying_member.user()
|
||||||
|
@ -246,7 +268,7 @@ class payment:
|
||||||
'amount': paying_member.amount}
|
'amount': paying_member.amount}
|
||||||
|
|
||||||
|
|
||||||
def subscribe_confirm(self, args):
|
def confirm_subscription(self, args):
|
||||||
if self.provider == 'gocardless':
|
if self.provider == 'gocardless':
|
||||||
response = gocardless.client.confirm_resource(args)
|
response = gocardless.client.confirm_resource(args)
|
||||||
subscription = gocardless.client.subscription(args.get('resource_id'))
|
subscription = gocardless.client.subscription(args.get('resource_id'))
|
||||||
|
|
|
@ -0,0 +1,83 @@
|
||||||
|
from django.contrib.messages.storage.fallback import FallbackStorage
|
||||||
|
# from django.contrib.auth.models import Group
|
||||||
|
from django.test import RequestFactory
|
||||||
|
from django.core.urlresolvers import reverse
|
||||||
|
from test_plus.test import TestCase
|
||||||
|
from mock import patch, Mock
|
||||||
|
from mhackspace.users.models import Membership
|
||||||
|
from mhackspace.users.models import Membership
|
||||||
|
|
||||||
|
from ..views import (
|
||||||
|
MembershipCancelView,
|
||||||
|
MembershipJoinView,
|
||||||
|
MembershipJoinSuccessView,
|
||||||
|
MembershipJoinFailureView
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class BaseUserTestCase(TestCase):
|
||||||
|
fixtures = ['groups']
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.user = self.make_user()
|
||||||
|
self.factory = RequestFactory()
|
||||||
|
|
||||||
|
|
||||||
|
class TestSubscriptionSuccessRedirectView(BaseUserTestCase):
|
||||||
|
@patch('mhackspace.subscriptions.payments.gocardless_provider', autospec=True)
|
||||||
|
@patch('mhackspace.subscriptions.views.select_provider', autospec=True)
|
||||||
|
def test_success_redirect_url(self, mock_subscription, mock_provider):
|
||||||
|
mock_subscription.return_value = mock_provider
|
||||||
|
mock_provider.confirm_subscription.return_value = {
|
||||||
|
'amount': 20.00,
|
||||||
|
'start_date': '2017-01-01T17:07:09Z',
|
||||||
|
'reference': 'MH0001',
|
||||||
|
'email': 'user@test.com',
|
||||||
|
'success': True
|
||||||
|
}
|
||||||
|
|
||||||
|
request = self.factory.post(
|
||||||
|
reverse('join_hackspace_success', kwargs={'provider': 'gocardless'}),
|
||||||
|
{'signature': 'test_signature'}
|
||||||
|
)
|
||||||
|
|
||||||
|
setattr(request, 'session', 'session')
|
||||||
|
messages = FallbackStorage(request)
|
||||||
|
setattr(request, '_messages', messages)
|
||||||
|
request.user = self.user
|
||||||
|
|
||||||
|
view = MembershipJoinSuccessView()
|
||||||
|
view.request = request
|
||||||
|
self.assertEqual(
|
||||||
|
view.get_redirect_url(provider ='gocardless'),
|
||||||
|
reverse('users:detail', kwargs={'username': self.user.username})
|
||||||
|
)
|
||||||
|
|
||||||
|
members = Membership.objects.all()
|
||||||
|
self.assertEqual(members.count(), 1)
|
||||||
|
|
||||||
|
@patch('mhackspace.subscriptions.payments.gocardless.client.subscription', autospec=True)
|
||||||
|
def test_failure_redirect_url(self, mock_obj):
|
||||||
|
# Instantiate the view directly. Never do this outside a test!
|
||||||
|
# Generate a fake request
|
||||||
|
request = self.factory.post(
|
||||||
|
reverse('join_hackspace_failure', kwargs={'provider': 'gocardless'}),
|
||||||
|
data={'signature': 'test_signature'}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
setattr(request, 'session', 'session')
|
||||||
|
messages = FallbackStorage(request)
|
||||||
|
setattr(request, '_messages', messages)
|
||||||
|
request.user = self.user
|
||||||
|
|
||||||
|
view = MembershipJoinFailureView()
|
||||||
|
view.request = request
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
view.get_redirect_url(provider='gocardless'),
|
||||||
|
reverse('users:detail', kwargs={'username': self.user.username})
|
||||||
|
)
|
||||||
|
|
||||||
|
members = Membership.objects.all()
|
||||||
|
self.assertEqual(len(members), 0)
|
|
@ -33,6 +33,7 @@ class MembershipCancelView(LoginRequiredMixin, RedirectView):
|
||||||
member.status = MEMBERSHIP_CANCELLED
|
member.status = MEMBERSHIP_CANCELLED
|
||||||
member.save()
|
member.save()
|
||||||
|
|
||||||
|
|
||||||
# remove user from group on success
|
# remove user from group on success
|
||||||
group = Group.objects.get(name='members')
|
group = Group.objects.get(name='members')
|
||||||
self.request.user.groups.remove(group)
|
self.request.user.groups.remove(group)
|
||||||
|
@ -40,7 +41,6 @@ class MembershipCancelView(LoginRequiredMixin, RedirectView):
|
||||||
self.request,
|
self.request,
|
||||||
messages.SUCCESS,
|
messages.SUCCESS,
|
||||||
'Your membership has now been cancelled')
|
'Your membership has now been cancelled')
|
||||||
|
|
||||||
kwargs['username'] = self.request.user.get_username()
|
kwargs['username'] = self.request.user.get_username()
|
||||||
return super(MembershipCancelView, self).get_redirect_url(*args, **kwargs)
|
return super(MembershipCancelView, self).get_redirect_url(*args, **kwargs)
|
||||||
|
|
||||||
|
@ -79,7 +79,33 @@ class MembershipJoinSuccessView(LoginRequiredMixin, RedirectView):
|
||||||
pattern_name = 'users:detail'
|
pattern_name = 'users:detail'
|
||||||
|
|
||||||
def get_redirect_url(self, *args, **kwargs):
|
def get_redirect_url(self, *args, **kwargs):
|
||||||
|
payment_provider = 'gocardless'
|
||||||
|
provider = select_provider(payment_provider)
|
||||||
|
result = provider.confirm_subscription(
|
||||||
|
provider_response=kwargs
|
||||||
|
)
|
||||||
|
|
||||||
|
#if something went wrong return to profile with an error
|
||||||
|
if result.get('success') is False:
|
||||||
|
messages.add_message(
|
||||||
|
self.request,
|
||||||
|
messages.ERROR,
|
||||||
|
'Failure something went wrong activating your membership please contact us.')
|
||||||
|
return super(MembershipJoinSuccessView, self).get_redirect_url(*args, **kwargs)
|
||||||
|
|
||||||
del(kwargs['provider'])
|
del(kwargs['provider'])
|
||||||
|
try:
|
||||||
|
member = Membership.objects.get(user=self.request.user)
|
||||||
|
except Membership.DoesNotExist:
|
||||||
|
member = Membership()
|
||||||
|
|
||||||
|
member.user = self.request.user
|
||||||
|
member.email = result.get('email')
|
||||||
|
member.reference = result.get('reference')
|
||||||
|
member.payment = result.get('amount')
|
||||||
|
member.date = result.get('start_date')
|
||||||
|
member.status = Membership.lookup_status(name=result.get('status'))
|
||||||
|
member.save()
|
||||||
messages.add_message(
|
messages.add_message(
|
||||||
self.request,
|
self.request,
|
||||||
messages.SUCCESS,
|
messages.SUCCESS,
|
||||||
|
@ -89,6 +115,10 @@ class MembershipJoinSuccessView(LoginRequiredMixin, RedirectView):
|
||||||
# add user to group on success
|
# add user to group on success
|
||||||
group = Group.objects.get(name='members')
|
group = Group.objects.get(name='members')
|
||||||
self.request.user.groups.add(group)
|
self.request.user.groups.add(group)
|
||||||
|
messages.add_message(
|
||||||
|
self.request,
|
||||||
|
messages.SUCCESS,
|
||||||
|
'Success your membership should now be active')
|
||||||
return super(MembershipJoinSuccessView, self).get_redirect_url(*args, **kwargs)
|
return super(MembershipJoinSuccessView, self).get_redirect_url(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
@ -101,6 +131,6 @@ class MembershipJoinFailureView(LoginRequiredMixin, RedirectView):
|
||||||
messages.add_message(
|
messages.add_message(
|
||||||
self.request,
|
self.request,
|
||||||
messages.ERROR,
|
messages.ERROR,
|
||||||
'Failed to sign up something went wrong with your payment, please contact us at %s' % EMAIL_SUPPORT)
|
'Failed to sign up something went wrong with your payment, please contact us at %s' % settings.EMAIL_SUPPORT)
|
||||||
kwargs['username'] = self.request.user.get_username()
|
kwargs['username'] = self.request.user.get_username()
|
||||||
return super(MembershipJoinFailureView, self).get_redirect_url(*args, **kwargs)
|
return super(MembershipJoinFailureView, self).get_redirect_url(*args, **kwargs)
|
||||||
|
|
Loading…
Reference in New Issue