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]

Reply via email to