Use OAuth sessions for web API requests

This commit is contained in:
Edward Betts 2026-07-22 10:58:10 +01:00
parent e022872767
commit 118ec9fc9b
4 changed files with 125 additions and 7 deletions

View file

@ -37,6 +37,8 @@ class ArticlePageSkipTests(unittest.TestCase):
}
with (
patch("web_view.mediawiki_oauth.get_username", return_value="Test user"),
patch("web_view.mediawiki_oauth.get_oauth_session", return_value=object()),
patch("web_view.api.get_wiki_info", return_value=None),
patch("web_view.search_count", return_value=3),
patch("web_view.search_count_with_link", return_value=0),
@ -62,6 +64,8 @@ class ArticlePageSkipTests(unittest.TestCase):
]
with (
patch("web_view.mediawiki_oauth.get_username", return_value="Test user"),
patch("web_view.mediawiki_oauth.get_oauth_session", return_value=object()),
patch("web_view.api.get_wiki_info", return_value="Documentary film"),
patch("web_view.search_count", return_value=2),
patch("web_view.search_count_with_link", return_value=0),
@ -78,6 +82,8 @@ class ArticlePageSkipTests(unittest.TestCase):
hits = [hit("documentary film")]
with (
patch("web_view.mediawiki_oauth.get_username", return_value="Test user"),
patch("web_view.mediawiki_oauth.get_oauth_session", return_value=object()),
patch("web_view.api.get_wiki_info", return_value="Documentary film"),
patch("web_view.search_count", return_value=1),
patch("web_view.search_count_with_link", return_value=0),
@ -96,7 +102,11 @@ class ValidHitTests(unittest.TestCase):
self.client = web_view.app.test_client()
def test_redirect_target_is_not_valid_hit(self) -> None:
with patch("web_view.get_diff") as get_diff:
with (
patch("web_view.mediawiki_oauth.get_username", return_value="Test user"),
patch("web_view.mediawiki_oauth.get_oauth_session", return_value=object()),
patch("web_view.get_diff") as get_diff,
):
response = self.client.get(
"/api/1/valid_hit",
query_string={
@ -111,6 +121,53 @@ class ValidHitTests(unittest.TestCase):
get_diff.assert_not_called()
class LoginRequiredTests(unittest.TestCase):
def setUp(self) -> None:
web_view.app.config["TESTING"] = True
self.client = web_view.app.test_client()
def test_article_page_redirects_to_login_before_api_calls(self) -> None:
with (
patch("web_view.mediawiki_oauth.get_username", return_value=None),
patch("web_view.mediawiki_oauth.get_oauth_session", return_value=None),
patch("web_view.api.get_wiki_info") as get_wiki_info,
):
response = self.client.get("/link/DVD_documentary")
self.assertEqual(response.status_code, 302)
self.assertIn("/oauth/start", response.location)
get_wiki_info.assert_not_called()
def test_valid_hit_requires_login_before_diff_call(self) -> None:
with (
patch("web_view.mediawiki_oauth.get_username", return_value=None),
patch("web_view.mediawiki_oauth.get_oauth_session", return_value=None),
patch("web_view.get_diff") as get_diff,
):
response = self.client.get(
"/api/1/valid_hit",
query_string={"link_to": "Target", "link_from": "Candidate"},
)
self.assertEqual(response.status_code, 401)
self.assertEqual(response.get_json(), {"error": "login required"})
get_diff.assert_not_called()
def test_hits_api_requires_login_before_search(self) -> None:
with (
patch("web_view.mediawiki_oauth.get_username", return_value=None),
patch("web_view.mediawiki_oauth.get_oauth_session", return_value=None),
patch("web_view.core.do_search") as do_search,
):
response = self.client.get(
"/api/1/hits", query_string={"title": "Target"}
)
self.assertEqual(response.status_code, 401)
self.assertEqual(response.get_json(), {"error": "login required"})
do_search.assert_not_called()
class ProtectedCandidateTests(unittest.TestCase):
def test_edit_protected_hits_are_filtered_out(self) -> None:
hits = [hit("Editable"), hit("Protected")]