Added some tests for subscription sign up, improved drone conf to cache pip packages

This commit is contained in:
Oliver Marks 2017-02-19 10:50:17 +00:00
parent eac0e88596
commit 5c58aff874
6 changed files with 145 additions and 7 deletions

View File

@ -7,12 +7,14 @@ pipeline:
image: python:3.5
environment:
- PYTHONUSERBASE=/drone/src/cache/packages
- POSTGRES_USER=mhackspace
- USE_DOCKER=yes
- DJANGO_SETTINGS_MODULE=config.settings.test
commands:
- 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
publish:

1
.gitignore vendored
View File

@ -5,3 +5,4 @@ node_modules
src
.env
staticfiles/*
cache/

View File

@ -200,7 +200,7 @@ LOGGING = {
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'handlers': ['mail_admins', 'logfile'],
'level': 'ERROR',
'propagate': True
},

View File

@ -124,6 +124,17 @@ class gocardless_provider:
name=name,
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:
form_remote = False
@ -154,6 +165,17 @@ class braintree_provider:
#'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):
for paying_member in braintree.Subscription.search(braintree.SubscriptionSearch.status == braintree.Subscription.Status.Active):
user=paying_member.user()
@ -246,7 +268,7 @@ class payment:
'amount': paying_member.amount}
def subscribe_confirm(self, args):
def confirm_subscription(self, args):
if self.provider == 'gocardless':
response = gocardless.client.confirm_resource(args)
subscription = gocardless.client.subscription(args.get('resource_id'))

View File

@ -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)

View File

@ -33,6 +33,7 @@ class MembershipCancelView(LoginRequiredMixin, RedirectView):
member.status = MEMBERSHIP_CANCELLED
member.save()
# remove user from group on success
group = Group.objects.get(name='members')
self.request.user.groups.remove(group)
@ -40,7 +41,6 @@ class MembershipCancelView(LoginRequiredMixin, RedirectView):
self.request,
messages.SUCCESS,
'Your membership has now been cancelled')
kwargs['username'] = self.request.user.get_username()
return super(MembershipCancelView, self).get_redirect_url(*args, **kwargs)
@ -79,7 +79,33 @@ class MembershipJoinSuccessView(LoginRequiredMixin, RedirectView):
pattern_name = 'users:detail'
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'])
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(
self.request,
messages.SUCCESS,
@ -89,6 +115,10 @@ class MembershipJoinSuccessView(LoginRequiredMixin, RedirectView):
# add user to group on success
group = Group.objects.get(name='members')
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)
@ -101,6 +131,6 @@ class MembershipJoinFailureView(LoginRequiredMixin, RedirectView):
messages.add_message(
self.request,
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()
return super(MembershipJoinFailureView, self).get_redirect_url(*args, **kwargs)