Commit 812cd0c7 by jsa

Add payment processor list endpoint.

XCOM-211
parent 4de3881c
......@@ -26,6 +26,7 @@ from ecommerce.extensions.api.tests.test_authentication import AccessTokenMixin,
from ecommerce.extensions.api.views import OrdersThrottle, FulfillmentMixin, OrderListCreateAPIView
from ecommerce.extensions.fulfillment.status import LINE, ORDER
from ecommerce.extensions.order.utils import OrderNumberGenerator
from ecommerce.tests.mixins import UserMixin
Order = get_model('order', 'Order')
......@@ -41,21 +42,6 @@ class ThrottlingMixin(object):
cache.clear()
class UserMixin(object):
password = 'test'
def create_user(self, **kwargs):
return factories.UserFactory(password=self.password, **kwargs)
def generate_jwt_token_header(self, user, secret=None):
secret = secret or getattr(settings, 'JWT_AUTH')['JWT_SECRET_KEY']
payload = {
'username': user.username,
'email': user.email,
}
return "JWT {token}".format(token=jwt.encode(payload, secret))
@ddt.ddt
class RetrieveOrderViewTests(ThrottlingMixin, UserMixin, TestCase):
"""Test cases for getting existing orders. """
......
......@@ -3,6 +3,14 @@
from rest_framework import serializers
class ProcessorSerializer(serializers.Serializer):
""" Serializer to use with instances of processors.BasePaymentProcessor """
def to_representation(self, instance):
""" Serialize instances as a string instead of a mapping object. """
return instance.NAME
class TransactionSerializer(serializers.Serializer):
"""Serializes a transaction. """
txn_type = serializers.CharField(max_length=128)
......
""" Tests of the Payment Views. """
import json
from django.core.urlresolvers import reverse
from django.test import TestCase
from django.test.utils import override_settings
......@@ -8,6 +10,7 @@ from oscar.core.loading import get_model
from ecommerce.extensions.payment.constants import ProcessorConstants as PC
from ecommerce.extensions.payment.processors import BasePaymentProcessor
from ecommerce.extensions.fulfillment.status import ORDER
from ecommerce.tests.mixins import UserMixin
ShippingEventType = get_model('order', 'ShippingEventType')
......@@ -81,6 +84,34 @@ class DummySuccessProcessor(BasePaymentProcessor):
return {PC.SUCCESS: True, PC.ORDER_NUMBER: ORDER_NUMBER}
class ProcessorListViewTestCase(TestCase, UserMixin):
""" Ensures correct behavior of the payment processors list view."""
def setUp(self):
self.token = self.generate_jwt_token_header(self.create_user())
def assert_processor_list_matches(self, expected):
""" DRY helper. """
response = self.client.get(reverse('processor_list'), HTTP_AUTHORIZATION=self.token)
self.assertEqual(response.status_code, 200)
self.assertSetEqual(set(json.loads(response.content)), set(expected))
def test_permission(self):
"""Ensure authentication is required to access the view. """
response = self.client.get(reverse('processor_list'))
self.assertEqual(response.status_code, 401)
@override_settings(PAYMENT_PROCESSORS=[SUCCESS_PROCESSOR])
def test_get_one(self):
"""Ensure a single payment processor in settings is handled correctly."""
self.assert_processor_list_matches(['DummySuccessProcessor'])
@override_settings(PAYMENT_PROCESSORS=[SUCCESS_PROCESSOR, FAILURE_PROCESSOR])
def test_get_many(self):
"""Ensure multiple processors in settings are handled correctly."""
self.assert_processor_list_matches(['DummySuccessProcessor', 'DummyFailureProcessor'])
# Reuse the fake fulfillment module provided by the test_api tests
@override_settings(
FULFILLMENT_MODULES=['ecommerce.extensions.fulfillment.tests.test_api.FakeFulfillmentModule', ]
......
......@@ -5,5 +5,6 @@ from ecommerce.extensions.payment import views
urlpatterns = patterns(
'',
url(r'processors/$', views.ProcessorListView.as_view(), name='processor_list'),
url(r'/cybersource/callback/$', views.CybersourceResponseView.as_view(), name='cybersource_callback'),
)
......@@ -4,12 +4,26 @@ from django.http import HttpResponse
from django.views.generic import View
from oscar.apps.checkout.mixins import OrderPlacementMixin
from oscar.apps.payment.models import SourceType
from rest_framework.generics import ListAPIView
from rest_framework.permissions import IsAuthenticated
from ecommerce.extensions.order.models import Order
from ecommerce.extensions.fulfillment.status import ORDER
from ecommerce.extensions.fulfillment.mixins import FulfillmentMixin
from ecommerce.extensions.payment.constants import ProcessorConstants as PC
from ecommerce.extensions.payment.helpers import get_processor_class
from ecommerce.extensions.payment.serializers import ProcessorSerializer
class ProcessorListView(ListAPIView):
""" View that lists the available payment processors. """
pagination_class = None
permission_classes = (IsAuthenticated,)
serializer_class = ProcessorSerializer
def get_queryset(self):
""" Fetch the list of payment processor classes based on django settings."""
return [get_processor_class(path) for path in settings.PAYMENT_PROCESSORS]
class CybersourceResponseView(View, OrderPlacementMixin, FulfillmentMixin):
......
"""
Broadly-useful mixins for use in automated tests.
"""
from django.conf import settings
import jwt
from oscar.test import factories
class UserMixin(object):
""" Provides utility methods for creating and authenticating users in test cases. """
password = 'test'
def create_user(self, **kwargs):
""" Create a user, with overrideable defaults. """
return factories.UserFactory(password=self.password, **kwargs)
def generate_jwt_token_header(self, user, secret=None):
""" Generate a valid JWT token header for authenticated requests. """
secret = secret or getattr(settings, 'JWT_AUTH')['JWT_SECRET_KEY']
payload = {
'username': user.username,
'email': user.email,
}
return "JWT {token}".format(token=jwt.encode(payload, secret))
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment