def setUp(self): self.api = SolitudeAPI(settings.SOLITUDE_URL, settings.SOLITUDE_OAUTH) self.api.slumber = mock.Mock() self.slumber = self.api.slumber
class TestConfigureRefTrans(TestCase): def setUp(self): self.api = SolitudeAPI(settings.SOLITUDE_URL, settings.SOLITUDE_OAUTH) self.api.slumber = mock.Mock() self.slumber = self.api.slumber def configure(self, trans_uuid='trans-xyz', seller_uuid='seller-xyz', product_uuid='product-xyz', product_name='Shiny App', success_redirect='/todo/postback', error_redirect='/todo/chargeback', prices=[{'price': 1, 'currency': 'EUR'}], icon_url='/todo/icons', user_uuid='user-xyz', app_size=1024 * 5, provider='reference'): return self.api.configure_product_for_billing( trans_uuid, seller_uuid, product_uuid, product_name, prices, icon_url, user_uuid, app_size, provider=provider, ) def set_mocks(self, returns={}, keys=('generic.seller', 'generic.product', 'generic.buyer', 'provider.reference.products', 'provider.reference.transactions',)): """ Set mock object returns, for example: self.set_mocks({ 'provider.reference.transactions': { 'method': 'post', 'return': { 'token': 'the-token', } } }) That will do the same thing as: self.slumber.provider.reference.transactions.post.return_value = { 'token': 'the-token', } By default, get_object_or_404 will be mocked with a resource_pk and resource_uri """ keys = set(list(keys) + returns.keys()) for k in keys: attr_path = k.split('.') api = self.slumber while True: try: api = getattr(api, attr_path.pop(0)) except IndexError: break conf = returns.get(k, {}) method = conf.get('method', 'get_object_or_404') api = getattr(api, method) if conf.get('side_effect'): api.side_effect = conf['side_effect'] else: api.return_value = conf.get('return', { 'resource_pk': 1, 'resource_uri': '/something/1', }) def test_with_existing_prod(self): seller_uuid = 'seller-xyz' self.set_mocks({ 'generic.seller': { 'return': { 'resource_pk': seller_uuid, 'resource_uri': '/seller/' + seller_uuid, } }, 'provider.reference.transactions': { 'method': 'post', 'return': { 'token': 'zippy-trans-token', } }, }) product_uuid = 'app-xyz' result = self.configure(seller_uuid=seller_uuid, product_uuid=product_uuid) eq_(result[0], 'zippy-trans-token') eq_(result[1], seller_uuid) kw = self.slumber.provider.reference.products\ .get_object_or_404.call_args[1] eq_(kw['external_id'], product_uuid) eq_(kw['seller_id'], seller_uuid) def test_with_new_prod(self): new_product_id = 66 product_uuid = 'app-xyz' seller_uuid = 'seller-xyz' self.set_mocks({ 'generic.seller': { 'return': { 'resource_pk': seller_uuid, 'resource_uri': '/seller/' + seller_uuid, } }, 'provider.reference.transactions': { 'method': 'post', 'return': { 'token': 'zippy-trans-token', } }, 'provider.reference.products': { 'side_effect': ObjectDoesNotExist, }, 'provider.reference.sellers': { 'return': { 'resource_pk': seller_uuid, } }, }) self.slumber.provider.reference.products.post.return_value = { 'resource_pk': new_product_id, } result = self.configure(seller_uuid=seller_uuid, product_uuid=product_uuid) eq_(result[0], 'zippy-trans-token') kw = self.slumber.provider.reference.products.post.call_args[0][0] eq_(kw['external_id'], product_uuid) eq_(kw['seller_id'], seller_uuid) kw = self.slumber.provider.reference.transactions.post.call_args[0][0] eq_(kw['product_id'], new_product_id) eq_(kw['product_image_url'], '/todo/icons') assert kw['success_url'].endswith('/provider/reference/success'), ( 'Unexpected: {0}'.format(kw['success_url'])) assert kw['error_url'].endswith('/provider/reference/error'), ( 'Unexpected: {0}'.format(kw['error_url'])) def test_callback_validation_success(self): self.set_mocks({ 'provider.reference.notices': { 'method': 'post', 'return': { 'result': 'OK', } }, 'provider.reference.transactions': { 'method': 'post', 'return': { 'token': 'zippy-trans-token', } }, }) self.configure(seller_uuid='seller-xyz', product_uuid='app-xyz') is_valid = self.api.is_callback_token_valid({'foo': 'bar'}) eq_(is_valid, True) eq_(self.slumber.provider.reference.notices.post.call_args[0][0], {'qs': {'foo': 'bar'}}) def test_callback_validation_failure(self): self.set_mocks({ 'provider.reference.notices': { 'method': 'post', 'return': { 'result': 'FAIL', 'reason': 'signature mismatch', } }, 'provider.reference.transactions': { 'method': 'post', 'return': { 'token': 'zippy-trans-token', } }, }) self.configure(seller_uuid='seller-xyz', product_uuid='app-xyz') is_valid = self.api.is_callback_token_valid({'foo': 'bar'}) eq_(is_valid, False)