Skip to content
This repository has been archived by the owner on Jan 25, 2018. It is now read-only.

Commit

Permalink
make makepremium idempotent (bug 824751)
Browse files Browse the repository at this point in the history
  • Loading branch information
Andy McKay committed Dec 28, 2012
1 parent 79386a5 commit 854187f
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 7 deletions.
1 change: 1 addition & 0 deletions lib/bango/constants.py
@@ -1,6 +1,7 @@
import re import re


ACCESS_DENIED = 'ACCESS_DENIED' ACCESS_DENIED = 'ACCESS_DENIED'
BANGO_ALREADY_PREMIUM_ENABLED = 'BANGO_ALREADY_PREMIUM_ENABLED'
BANK_DETAILS_EXIST = 'BANK_DETAILS_EXIST' BANK_DETAILS_EXIST = 'BANK_DETAILS_EXIST'
INTERNAL_ERROR = 'INTERNAL_ERROR' INTERNAL_ERROR = 'INTERNAL_ERROR'
# There is one of these for every field. # There is one of these for every field.
Expand Down
2 changes: 1 addition & 1 deletion lib/bango/errors.py
@@ -1,6 +1,6 @@
class BangoError(Exception): class BangoError(Exception):
def __init__(self, id, message): def __init__(self, id, message):
self.id = type self.id = id
self.message = message self.message = message


def __str__(self): def __str__(self):
Expand Down
18 changes: 18 additions & 0 deletions lib/bango/resources/simple.py
@@ -1,5 +1,10 @@
from tastypie.exceptions import ImmediateHttpResponse
from tastypie.http import HttpNoContent

from cached import SimpleResource from cached import SimpleResource


from lib.bango.constants import BANGO_ALREADY_PREMIUM_ENABLED
from lib.bango.errors import BangoError
from lib.bango.forms import (CreateBankDetailsForm, MakePremiumForm, from lib.bango.forms import (CreateBankDetailsForm, MakePremiumForm,
UpdateRatingForm) UpdateRatingForm)


Expand All @@ -26,3 +31,16 @@ class Meta(SimpleResource.Meta):
resource_name = 'premium' resource_name = 'premium'
simple_form = MakePremiumForm simple_form = MakePremiumForm
simple_api = 'MakePremiumPerAccess' simple_api = 'MakePremiumPerAccess'

def obj_create(self, *args, **kwargs):
try:
res = super(MakePremiumResource, self).obj_create(*args, **kwargs)
except BangoError, exc:
# No need to fail if this is called twice, just catch and continue.
if exc.id == BANGO_ALREADY_PREMIUM_ENABLED:
# Normally this method will return a 201 created. I'm not sure
# what status code best represents this, but a 204 is still a
# success and allows you to distinguish it, should you want to.
raise ImmediateHttpResponse(response=HttpNoContent())
raise
return res
30 changes: 24 additions & 6 deletions lib/bango/tests/test_resources.py
Expand Up @@ -11,7 +11,9 @@
from lib.transactions.models import Transaction from lib.transactions.models import Transaction
from solitude.base import APITest from solitude.base import APITest


from ..constants import BANGO_ALREADY_PREMIUM_ENABLED
from ..client import ClientMock from ..client import ClientMock
from ..errors import BangoError
from ..resources.cached import SimpleResource from ..resources.cached import SimpleResource


import samples import samples
Expand Down Expand Up @@ -201,21 +203,37 @@ def setUp(self):
super(TestBangoMarkPremium, self).setUp() super(TestBangoMarkPremium, self).setUp()
self.list_url = self.get_list_url('premium') self.list_url = self.get_list_url('premium')


def test_mark(self): def create(self):
self.create() super(TestBangoMarkPremium, self).create()
data = samples.good_make_premium.copy() data = samples.good_make_premium.copy()
data['seller_product_bango'] = self.seller_product_bango_uri data['seller_product_bango'] = self.seller_product_bango_uri
res = self.client.post(self.list_url, data=data) return data

def test_mark(self):
res = self.client.post(self.list_url, data=self.create())
eq_(res.status_code, 201) eq_(res.status_code, 201)


def test_fail(self): def test_fail(self):
self.create() data = self.create()
data = samples.good_make_premium.copy()
data['currencyIso'] = 'FOO' data['currencyIso'] = 'FOO'
data['seller_product_bango'] = self.seller_product_bango_uri
res = self.client.post(self.list_url, data=data) res = self.client.post(self.list_url, data=data)
eq_(res.status_code, 400) eq_(res.status_code, 400)


@mock.patch.object(ClientMock, 'mock_results')
def test_other_error(self, mock_results):
data = self.create()
mock_results.return_value = {'responseCode': 'wat?'}
with self.assertRaises(BangoError):
self.client.post(self.list_url, data=data)

@mock.patch.object(ClientMock, 'mock_results')
def test_done_twice(self, mock_results):
data = self.create()
mock_results.return_value = {'responseCode':
BANGO_ALREADY_PREMIUM_ENABLED}
res = self.client.post(self.list_url, data=data)
eq_(res.status_code, 204)



@mock.patch.object(settings, 'BANGO_MOCK', True) @mock.patch.object(settings, 'BANGO_MOCK', True)
class TestBangoUpdateRating(SellerProductBangoBase): class TestBangoUpdateRating(SellerProductBangoBase):
Expand Down

0 comments on commit 854187f

Please sign in to comment.