Пример #1
0
 def setUp(self):
     self.api = SolitudeAPI(settings.SOLITUDE_URL, settings.SOLITUDE_OAUTH)
     self.api.slumber = mock.Mock()
     self.slumber = self.api.slumber
Пример #2
0
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)