+
+ # No token = no agreement.
+ response = self.client.get('/paypal/return/')
+ self.assertEqual(response.status_code, 404)
+ self.assertEqual(BillingAgreement.objects.all().count(), 0)
+
+ response = self.client.get('/paypal/return/schedule-key/?token=secret-token')
+ self.assertEqual(response.status_code, 302)
+ self.assertEqual(BillingAgreement.objects.all().count(), 1)
+
+ # Repeated returns will not generate further agreements.
+ response = self.client.get('/paypal/return/schedule-key/?token=secret-token')
+ self.assertEqual(response.status_code, 302)
+ self.assertEqual(BillingAgreement.objects.all().count(), 1)
+
+ self.assertTrue(Membership.is_active_for(self.user))
+
+ @patch('paypalrestsdk.BillingAgreement', BillingAgreementMock)
+ def test_paypal_app_return(self):
+ self.client.login(username='test', password='test')
+ BillingPlan.objects.create(amount=100)
+ response = self.client.get('/paypal/app-return/schedule-key/?token=secret-token')
+ self.assertRedirects(
+ response, 'wolnelekturyapp://paypal_return',
+ fetch_redirect_response=False)
+
+ # Repeated returns will not generate further agreements.
+ response = self.client.get('/paypal/app-return/schedule-key/?token=secret-token')
+ self.assertRedirects(
+ response, 'wolnelekturyapp://paypal_return',
+ fetch_redirect_response=False)
+ self.assertEqual(BillingAgreement.objects.all().count(), 1)
+
+ self.assertTrue(Membership.is_active_for(self.user))
+
+ def test_paypal_return_error(self):
+ self.client.login(username='test', password='test')
+ BillingPlan.objects.create(amount=100)
+
+ # It can choke on BillingAgreement.execute()
+ with patch('paypalrestsdk.BillingAgreement', Mock(
+ execute=Mock(return_value=Mock(id=None)))):
+ self.client.get('/paypal/app-return/?token=secret-token')
+ response = self.client.get('/paypal/app-return/schedule-key/?token=secret-token')
+ self.assertRedirects(
+ response, 'wolnelekturyapp://paypal_error',
+ fetch_redirect_response=False)
+
+ # No agreement created in our DB if not executed successfully.
+ self.assertEqual(BillingAgreement.objects.all().count(), 0)
+
+ # It can execute all right, but just not be findable later.
+ with patch('paypalrestsdk.BillingAgreement', Mock(
+ execute=BillingAgreementMock.execute,
+ find=Mock(side_effect=ResourceNotFound(None)))):
+ response = self.client.get('/paypal/app-return/schedule-key/?token=secret-token')
+ self.assertRedirects(
+ response, 'wolnelekturyapp://paypal_return',
+ fetch_redirect_response=False)
+
+ # Now the agreement exists in our DB, but is not active.
+ self.assertEqual([b.active for b in BillingAgreement.objects.all()], [False])
+
+ with patch('paypalrestsdk.BillingAgreement', Mock(
+ find=Mock(return_value=Mock(state='Mocked')))):
+ self.assertFalse(Membership.is_active_for(self.user))