тестовая полоса на борту django с макетом - PullRequest
0 голосов
/ 07 апреля 2020

У меня возникли проблемы при попытке имитировать тестирование процесса подключения полосы. Я только учусь, как использовать макет, и я борюсь с StripeAuthorizeCallbackView. процесс выглядит следующим образом: пользователь достигает StripeAuthorizeView, который отправляет их в API полосы для регистрации учетной записи. Как только они успешно регистрируют учетную запись, они перенаправляются обратно на мою платформу и полоса отправляет временный код, который я затем отправляю обратно полосе с моими ключами API. После того, как я отправил информацию обратно в полосу, они возвращают мне учетные данные для пользователя, являющегося stripe_user_id.

Вот два вопроса:


import urllib
import requests


class StripeAuthorizeView(LoginRequiredMixin, View):

    def get(self, request):

        url = 'https://connect.stripe.com/express/oauth/authorize?'
        user = self.request.user
        if user.account_type == 'Business':
            business_type = 'company'
        else:
            business_type = 'individual'
        params = {
            'response_type': 'code',
            'scope': 'read_write',
            'client_id': settings.STRIPE_CONNECT_CLIENT_ID,
            'redirect_uri': f'http://127.0.0.1:8000/accounts/stripe/oauth/callback',
            'stripe_user[email]' : user.email,
            'stripe_user[business_type]' : business_type,
            'stripe_user[url]' : 'http://127.0.0.1:8000/accounts/user/%s/' %user.pk,
        }
        url = f'{url}?{urllib.parse.urlencode(params)}'
        return redirect(url)

lass StripeAuthorizeCallbackView(LoginRequiredMixin, View):

    def get(self, request):
        code = request.GET.get('code')
        if code:
            data = {
                'client_secret': settings.STRIPE_SECRET_KEY,
                'grant_type': 'authorization_code',
                'client_id': settings.STRIPE_CONNECT_CLIENT_ID,
                'code': code
            }

            url = 'https://connect.stripe.com/oauth/token'
            resp = requests.post(url, params=data)


            stripe_user_id = resp.json()['stripe_user_id']
            stripe_access_token = resp.json()['access_token']
            stripe_refresh_token = resp.json()['refresh_token']
            user = self.request.user
            user.stripe_access_token = stripe_access_token
            user.stripe_user_id = stripe_user_id
            user.stripe_refresh_token = stripe_refresh_token
            user.save()
            notify.send(sender=user, recipient=user, 
            verb='You have succesfully linked a stripe account. You can now take payments for sales.',
            level='info')
            redirect_url = reverse('account', kwargs={'pk': user.pk}) 
            response = redirect(redirect_url)
            return response

        else:
            user = self.request.user
            notify.send(sender=user, recipient=user, 
            verb='Your attempt to link a stripe account failed. Please contact customer support.',
            level='warning')
            url = reverse('account', kwargs={'pk': user.pk}) 
            response = redirect(url)
            return response

Меня не очень беспокоит тестирование StripeAuthorizeView много. Я больше пытаюсь выяснить, как проверить StripeAuthorizeCallbackView. Все, что я могу понять, - это то, что мне нужно будет смоделировать оба возвращаемого кода, а затем смоделировать следующие запросы. Этот тест важен для подтверждения того, что моя платформа связывает учетные данные пользователей после процесса адаптации. Любая помощь по этому вопросу будет сильно оценена.

edit: Пока у меня есть следующее:


    @classmethod
    def setUpTestData(cls):
        cls.test_user = User.objects.create_user(
            password='test',
            full_name='test name',
            email='test@test.com',
            address='1 test st',
            suburb='test',
            state='NSW',
            post_code='2000',
            contact_number='0433335333' )

    @patch('requests.get')
    def test_authorizecallback_creates_stripe_details(self, get_mock):
        code = requests.get('code')
        user = self.test_user
        self.client.login(email='test@test.com', password='test')
        mocked = ({'stripe_user_id' : '4444','stripe_access_token' : '2222', 
        'stripe_refresh_token' : '1111' })

        with mock.patch('requests.post', mock.Mock(return_value=mocked)):
            response = self.client.get('/accounts/stripe/oauth/callback/', 
            {'code' : '1234'})
            self.assertEqual(user.stripe_access_token, '222')
            message = list(response.context.get('messages'))[0]

однако я продолжаю получать:

  File "C:\Users\typef\Desktop\Projects\python_env\fox-listed\Fox-Listed\fox-listed\user\views.py", line 142, in get
    stripe_user_id = resp.json()['stripe_user_id']
AttributeError: 'dict' object has no attribute 'json'

фактический ответ что StripeAuthorizeCallBackView дает это:

1015 * { 'access_token': 'sk_test_1KyTG74Ouw65KYTR1O03WjNA00viNjcIfO', 'livemode': false, 'refresh_token': 'rt_H3Vrhd0XbSH7zbmqfDyMNwolgt1Gd7r4ESBDBr5a4VkCzTRT', 'token_type': 'знаменосцем', 'stripe_publishable_key': «pk_test_ * ********* ',' stripe_user_id ':' acct_1GVOpAF7ag87i2I6 ',' scope ':' express '}

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Похоже, я понял, если здесь есть недостаток, дайте мне знать, но вот что у меня есть:

class TestStripeAuthorizeCallbackView:

    @patch('user.views.requests')
    def test_authorizecallback_creates_stripe_details(self, requests_mock):
        json = { 'stripe_user_id' : '4444', 'access_token' : '2222', 'refresh_token' : '1111'} 


        requests_mock.post.return_value.json.return_value = json
        user = mixer.blend('user.CustomUser', stripe_user_id=None, access_token=None, refresh_token=None)
        req = RequestFactory().get('/', data={'code' : '1234'})
        middleware = SessionMiddleware()
        middleware.process_request(req)
        req.session.save()
        messages = FallbackStorage(req)
        setattr(req, '_messages', messages)

        req.user = user
        resp = StripeAuthorizeCallbackView.as_view()(req)

        assert resp.status_code == 302 ,'should redirect to success url'
        assert user.stripe_user_id == '4444', 'should assign stripe_user_id to user'
        assert user.stripe_access_token == '2222', 'should assign an access_token'
        assert user.stripe_refresh_token == '1111', 'should assign a refresh_token'
0 голосов
/ 07 апреля 2020

То, что вы описываете, не столько издевательство, сколько комплексное тестирование, подключение реальных тестовых учетных записей , что вы можете сделать.

Пока вы Если вы используете test client_id, то, когда вы будете перенаправлены на Stripe для создания учетной записи, вы можете пропустить форму по ссылке и вернуться на ваш сайт с реальным ( тестовый режим) oauth code.

По сути, вы можете настроить это и фактически go через поток для создания и подключения новых одноразовых тестовых учетных записей Stripe.

...