jenkins-bot has submitted this change. (
https://gerrit.wikimedia.org/r/c/pywikibot/core/+/1324210?usp=email )
Change subject: site: Reuse current user in TokenWallet
......................................................................
site: Reuse current user in TokenWallet
Read the current user once when retrieving a token and refresh it only after a
login attempt.
Use the resulting snapshot to invalidate cached tokens consistently.
Change-Id: Ia6948f728134f4dc7fee5d1f3a94daa49ec7a8cf
---
M pywikibot/site/_tokenwallet.py
M tests/token_tests.py
2 files changed, 42 insertions(+), 3 deletions(-)
Approvals:
Xqt: Looks good to me, approved
jenkins-bot: Verified
diff --git a/pywikibot/site/_tokenwallet.py b/pywikibot/site/_tokenwallet.py
index b5928ba..f4dd1ec 100644
--- a/pywikibot/site/_tokenwallet.py
+++ b/pywikibot/site/_tokenwallet.py
@@ -38,11 +38,13 @@
def __getitem__(self, key: str) -> str:
"""Get token value for the given key."""
- if self.site.user() is None and key != 'login':
+ current_user = self.site.user()
+ if current_user is None and key != 'login':
self.site.login()
+ current_user = self.site.user()
- if self.site.user() != self._currentuser:
- self._currentuser = self.site.user()
+ if current_user != self._currentuser:
+ self._currentuser = current_user
self.clear()
if not self._tokens:
diff --git a/tests/token_tests.py b/tests/token_tests.py
index ff5ba8c..5289eac 100755
--- a/tests/token_tests.py
+++ b/tests/token_tests.py
@@ -9,8 +9,10 @@
import unittest
from contextlib import suppress
+from unittest import mock
from pywikibot.exceptions import APIError, Error
+from pywikibot.site import TokenWallet
from tests.aspects import (
DefaultSiteTestCase,
DeprecationTestCase,
@@ -19,6 +21,41 @@
)
+class TestTokenWallet(TestCase):
+
+ """Test the TokenWallet container."""
+
+ net = False
+
+ def test_reuses_current_user(self) -> None:
+ """Test that a known current user is retrieved once."""
+ site = mock.Mock()
+ site.user.return_value = 'Alice'
+ site.get_tokens.return_value = {'csrf': 'token'}
+ wallet = TokenWallet(site)
+ site.user.reset_mock()
+
+ self.assertEqual(wallet['csrf'], 'token')
+
+ site.user.assert_called_once_with()
+ site.login.assert_not_called()
+
+ def test_refreshes_current_user_after_login(self) -> None:
+ """Test that the current user is refreshed after login."""
+ site = mock.Mock()
+ site.user.return_value = None
+ site.get_tokens.return_value = {'csrf': 'token'}
+ wallet = TokenWallet(site)
+ site.user.reset_mock()
+ site.user.side_effect = [None, 'Alice']
+
+ self.assertEqual(wallet['csrf'], 'token')
+
+ self.assertEqual(site.user.call_count, 2)
+ site.login.assert_called_once_with()
+ self.assertEqual(wallet._currentuser, 'Alice')
+
+
class TestSiteTokens(DeprecationTestCase, DefaultSiteTestCase):
"""Test cases for tokens in Site methods.
--
To view, visit
https://gerrit.wikimedia.org/r/c/pywikibot/core/+/1324210?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.wikimedia.org/r/settings?usp=email
Gerrit-MessageType: merged
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: Ia6948f728134f4dc7fee5d1f3a94daa49ec7a8cf
Gerrit-Change-Number: 1324210
Gerrit-PatchSet: 2
Gerrit-Owner: Mahveotm <[email protected]>
Gerrit-Reviewer: Xqt <[email protected]>
Gerrit-Reviewer: jenkins-bot
_______________________________________________
Pywikibot-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]