Source code for tests.oauth_tests
#!/usr/bin/env python3
"""Test OAuth functionality."""
#
# (C) Pywikibot team, 2015-2023
#
# Distributed under the terms of the MIT license.
#
from __future__ import annotations
import os
from contextlib import suppress
from pywikibot.login import OauthLoginManager
from tests.aspects import (
DefaultSiteTestCase,
TestCase,
require_modules,
unittest,
)
[docs]
@require_modules('mwoauth')
class OAuthSiteTestCase(TestCase):
"""Run tests related to OAuth authentication."""
oauth = True
@staticmethod
def _get_oauth_tokens():
"""Get valid OAuth tokens from environment variables."""
tokens = os.environ.get('PYWIKIBOT_TEST_OAUTH')
return tuple(tokens.split(':')) if tokens is not None else None
[docs]
def setUp(self):
"""Check if OAuth extension is installed and OAuth tokens are set."""
super().setUp()
self.site = self.get_site()
if not self.site.has_extension('OAuth'):
self.skipTest('OAuth extension not loaded on test site')
tokens = self._get_oauth_tokens()
if tokens is None:
self.skipTest('OAuth tokens not set')
self.assertLength(tokens, 4)
self.consumer_token = tokens[:2]
self.access_token = tokens[2:]
[docs]
class TestOauthLoginManger(DefaultSiteTestCase, OAuthSiteTestCase):
"""Test OAuth login manager."""
def _get_login_manager(self):
login_manager = OauthLoginManager(password=self.consumer_token[1],
site=self.site,
user=self.consumer_token[0])
# Set access token directly, discard user interaction token fetching
login_manager._access_token = self.access_token
return login_manager
[docs]
def test_login(self):
"""Test login."""
login_manager = self._get_login_manager()
login_manager.login()
self.assertEqual(login_manager.consumer_token, self.consumer_token)
self.assertEqual(login_manager.access_token, self.access_token)
[docs]
def test_identity(self):
"""Test identity."""
login_manager = self._get_login_manager()
self.assertIsNotNone(login_manager.access_token)
self.assertIsInstance(login_manager.identity, dict)
self.assertEqual(login_manager.identity['username'],
self.site.username())
if __name__ == '__main__':
with suppress(SystemExit):
unittest.main()