diff --git a/mhackspace/base/tests.py b/mhackspace/base/tests.py index 3793b3d..7cc6140 100644 --- a/mhackspace/base/tests.py +++ b/mhackspace/base/tests.py @@ -1,3 +1,4 @@ +import mock from test_plus.test import TestCase from mhackspace.users.models import Membership from mhackspace.users.models import User @@ -5,23 +6,34 @@ from django.contrib.auth.models import Group from mhackspace.subscriptions.management.commands.update_membership_status import update_subscriptions +from mhackspace.subscriptions.tests.mocks import gocardlessMocks + # this needs mocking -class TestTasks(TestCase): +class TestTasks(gocardlessMocks): def setUp(self): - self.user1 = self.make_user('u1') + super().setUp() self.user2 = self.make_user('u2') + self.user3 = self.make_user('u3') self.group = Group(name='members') self.group.save() - def test_refresh_subscriptions(self): + @mock.patch('mhackspace.subscriptions.payments.select_provider') + def test_refresh_subscriptions(self, mock_select_provider): + self.mock_success_responses() + self.mock_mandate_success_responses() + self.mock_customer_success_responses() + mock_select_provider.return_value = self.provider + membership_count = Membership.objects.all().delete() user_count = User.objects.all().count() membership_count = Membership.objects.all().count() self.assertEquals(0, membership_count) - self.assertEquals(2, user_count) + self.assertEquals(3, user_count) update_subscriptions(provider_name='gocardless') + self.mock_success_responses() + membership_count = Membership.objects.all().count() self.assertEquals(2, membership_count) self.assertEquals(2, user_count) diff --git a/mhackspace/subscriptions/management/commands/update_membership_status.py b/mhackspace/subscriptions/management/commands/update_membership_status.py index b39dad4..ec41261 100644 --- a/mhackspace/subscriptions/management/commands/update_membership_status.py +++ b/mhackspace/subscriptions/management/commands/update_membership_status.py @@ -13,6 +13,7 @@ from mhackspace.subscriptions.helper import create_or_update_membership def update_subscriptions(provider_name): provider = select_provider('gocardless') + print(provider) Membership.objects.all().delete() for sub in provider.fetch_subscriptions(): try: diff --git a/mhackspace/subscriptions/payments.py b/mhackspace/subscriptions/payments.py index 0e892fd..d632163 100644 --- a/mhackspace/subscriptions/payments.py +++ b/mhackspace/subscriptions/payments.py @@ -52,6 +52,9 @@ class gocardless_provider: def fetch_subscriptions(self): # for paying_member in self.client.mandates.list().records: + print('#############') + print(self.client.subscriptions.list()) + print(self.client.subscriptions.list().records) for paying_member in self.client.subscriptions.list().records: mandate = self.client.mandates.get(paying_member.links.mandate) user = self.client.customers.get(mandate.links.customer) diff --git a/mhackspace/subscriptions/tests/mocks.py b/mhackspace/subscriptions/tests/mocks.py index c382c9b..5893498 100644 --- a/mhackspace/subscriptions/tests/mocks.py +++ b/mhackspace/subscriptions/tests/mocks.py @@ -11,12 +11,12 @@ class gocardlessMocks(TestCase): def setUp(self): self.date_now = django.utils.timezone.now() - self.user = self.make_user() + self.user1 = self.make_user() self.auth_gocardless() def create_membership_record(self): member = Membership() - member.user = self.user + member.user = self.user1 member.payment = '20.00' member.date = self.date_now member.save() @@ -34,8 +34,7 @@ class gocardlessMocks(TestCase): return self.provider - def mock_success_responses(self, responses=None): - if responses == None: + def mock_success_responses_old(self, responses=None): subscription_properties = Mock( id='02', status='active', @@ -63,31 +62,76 @@ class gocardlessMocks(TestCase): self.provider.client.subscriptions.cancel = PropertyMock( return_value={'status_code': '200'}) + def mock_customer_success_responses(self): + ApiCustomersGet = namedtuple('ApiCustomersGet', 'email') + self.provider.client.customers.get = Mock( + return_value=ApiCustomersGet( + email='test@test.com') + ) - def mock_success_responses2(self, responses=None): - if responses == None: - responses = [Mock( + def mock_mandate_success_responses(self): + ApiSubscriptionMandateLink = namedtuple('ApiSubscriptionMandateLink', 'customer') + # ApiMandateGet = namedtuple('ApiMandateGet', '') + self.provider.client.mandates.get = Mock() + + def mock_success_responses(self, responses=None): + if responses is None: + responses = Mock( id='02', status='active', amount=20.00, created_at='date' - )] + ) - mock_list = MagicMock() - mock_list_records = MagicMock(side_effect=[subscription_properties]) - mock_list.records.return_value = mock_list_records + ApiRecords = namedtuple('ApiRecords', 'records') + ApiMandateLink = namedtuple('ApiMandateLink', 'mandate') + ApiResponseSubscriptionList = namedtuple('ApiResponseSubscriptionList', 'id, created_at, status, amount, links') + self.provider.client.subscriptions.list = Mock( + return_value=ApiRecords( + records=[ + ApiResponseSubscriptionList( + id='02', + status='active', + created_at=self.date_now, + amount=2000, + links=ApiMandateLink( + mandate='mid01' + ) + )] + ) + ) - self.provider.client.subscriptions.list = mock_list - ApiResponse = namedtuple('ApiResponse', 'api_response, created_at') + ApiResponseGet = namedtuple('ApiResponseGet', 'api_response, id, status, amount, created_at') + ApiResponseCreate = namedtuple('ApiResponseCreate', 'api_response, id, status, created_at') + ApiResponseCancelled = namedtuple('ApiResponseCancelled', 'api_response, status') ApiResponseStatus = namedtuple('ApiResponseStatus', 'status_code') self.provider.client.subscriptions.create = Mock( - return_value=ApiResponse( + return_value=ApiResponseCreate( + id='02', + status='active', created_at=self.date_now, api_response=ApiResponseStatus(status_code='200')) ) - self.provider.client.subscriptions.get.side_effects = responses - self.provider.client.subscriptions.cancel = PropertyMock( - return_value={'status_code': '200'}) + self.provider.client.subscriptions.get = Mock( + return_value=ApiResponseGet( + id='02', + created_at=self.date_now, + amount=20.00, + status='active', + api_response=ApiResponseStatus(status_code='200')) + ) + + + self.provider.client.subscriptions.cancel = Mock( + + return_value=ApiResponseCancelled( + api_response=ApiResponseStatus(status_code='200'), + status='cancelled')) + + + # self.provider.client.subscriptions.cancel = PropertyMock( + # return_value={'status_code': '200'}) + diff --git a/mhackspace/subscriptions/tests/test_payment_gateways.py b/mhackspace/subscriptions/tests/test_payment_gateways.py index c35d102..df9a22e 100644 --- a/mhackspace/subscriptions/tests/test_payment_gateways.py +++ b/mhackspace/subscriptions/tests/test_payment_gateways.py @@ -16,22 +16,9 @@ class TestPaymentGatewaysGocardless(gocardlessMocks): super().setUp() def test_unsubscribe(self): - responses = [ - Mock( - id='02', - status='active', - amount=20.00, - created_at='date' - ), Mock( - id='03', - status='active2', - amount=40.00, - created_at='date' - ), - ] - self.mock_success_responses2(responses) + self.mock_success_responses() - result = self.provider.cancel_subscription(user=self.user, reference='M01') + result = self.provider.cancel_subscription(user=self.user1, reference='M01') self.assertEqual(result.get('amount'), 20.00) self.assertEqual(result.get('reference'), '02') @@ -40,17 +27,6 @@ class TestPaymentGatewaysGocardless(gocardlessMocks): def test_confirm_subscription_callback(self): self.mock_success_responses() membership = self.create_membership_record() - - request_params = { - 'resource_uri': 'http://gocardless/resource/url/01', - 'resource_id': '01', - 'resource_type': 'subscription', - 'signature': 'sig', - 'state': 'inactive' - } - - - # membership = Membership.objects.get(user=self.user) result = self.provider.confirm_subscription( membership=membership, session=None, @@ -63,9 +39,10 @@ class TestPaymentGatewaysGocardless(gocardlessMocks): def test_fetch_subscription_gocardless(self): self.mock_success_responses() + self.mock_mandate_success_responses() + self.mock_customer_success_responses() for item in self.provider.fetch_subscriptions(): self.assertEqual(item.get('status'), 'active') self.assertEqual(item.get('email'), 'test@test.com') self.assertEqual(item.get('reference'), '02') self.assertEqual(item.get('amount'), 20.00) - diff --git a/mhackspace/subscriptions/tests/test_views.py b/mhackspace/subscriptions/tests/test_views.py index ebe2756..fe344a0 100644 --- a/mhackspace/subscriptions/tests/test_views.py +++ b/mhackspace/subscriptions/tests/test_views.py @@ -24,13 +24,11 @@ class BaseUserTestCase(gocardlessMocks): def setUp(self): super().setUp() - # self.user = self.make_user() - # self.user.save() self.factory = RequestFactory() self.client = Client() self.client.login( - username=self.user.username, - password=self.user.password) + username=self.user1.username, + password=self.user1.password) class TestSubscriptionSuccessRedirectView(BaseUserTestCase): @@ -96,14 +94,14 @@ class TestSubscriptionSuccessRedirectView(BaseUserTestCase): setattr(request, 'session', 'session') messages = FallbackStorage(request) setattr(request, '_messages', messages) - request.user = self.user + request.user = self.user1 view = MembershipJoinFailureView() view.request = request self.assertEqual( view.get_redirect_url(provider='gocardless'), - reverse('users:detail', kwargs={'username': self.user.username}) + reverse('users:detail', kwargs={'username': self.user1.username}) ) members = Membership.objects.all()