Django - jak testować widok wykorzystujący oAuth (Twitter)

0

Mam w aplikacji Django widok, który służy do połączenia z aplikacją na Twitterze i pobrania tokenów od użytkownika.

def twitter(request):
    # kod weryfikujacy jesli jest w url to uzytkownik autoryzowal aplikacji, jesli nie to trzeba go przekierowac na strone autoryzacji
    verifier = request.GET.get('oauth_verifier', False)

    if not verifier:
        # ... tworzenie linku do autoryzacji na Twitter, uzytkownik trafia na adres w domenie twitter.com
        return redirect(authorization_url)

    # zamieniam tymczasowe tokeny na access token i secret
    access_token_url = 'https://api.twitter.com/oauth/access_token'

    oauth = OAuth1Session()
    oauth_tokens = oauth.fetch_access_token(access_token_url)

    url = u'https://api.twitter.com/1.1/account/verify_credentials.json'

    header_oauth = OAuth1(client_key, client_secret, resource_owner_key, resource_owner_secret)
    # wykonuje żadanie do Twitter REST API
    r = requests.get(url, auth=header_oauth)

    # tutaj jeszcze zapisuję dane do bazy danych w stylu TwitterUser.objects.create()
    return HttpResponse('<h1>OK</h1>')

Kod działa dobrze natomiast nie wiem jak napisać testy do takiego widoku

class TwitterTest(TestCase):
    # sprawdzam czy w przypadku braku parametru oauth_verifier użytkownik jest przenoszony na stronę Twittera
    def test_twitter_redirect_to_auth_page(self):
        response = self.client.get('/aplikacja/twitter/')
        self.assertIn('https://api.twitter.com/oauth/authenticate', response.url)

Natomiast tak naprawdę chciałbym przetestować taki przypadek:
Użytkownik trafia na ten widok, przechodzi pomyślnie autoryzacje na Twitterze, w bazie danych tworzony jest dla niego profil wraz z tokenami dostępowymi

Czy poniższy kierunek to w ogóle dobre myślenie, w sensie mockować widok?

from mock import patch
@patch('my_app.views.twitter')
0

Sam odpowiem na to pytanie - idealnie nadaje się do tego

from unittest.mock import patch

Trzeba jeszcze pamiętać o ważnej zasadzie: Where to patch - https://docs.python.org/3/library/unittest.mock.html#where-to-patch

Dzięki temu w teście mogę zrobić:

class TwitterTest(TestCase):
    @patch.object(my_app.views.OAuth1Session, 'fetch_access_token')
    def test_twitter_valid_authentication_create_new_channel(self, mock_oauth):
        
        mock_oauth.fetch_access_token.return_value = {
            'oauth_token': 'twitter_token',
            'oauth_token_secret': 'twitter_secret'
        }

        response = self.client.get('/aplikacja/twitter/?oauth_verifier=111111')
        self.assertEqual(Channel.objects.count(), 1)

Jeśli chodzi o samo odpytanie Twittera to można to rozwiązać za pomocą:

requests.Response.json = Mock(return_value={'key': 'value'})

1 użytkowników online, w tym zalogowanych: 0, gości: 1