diff --git a/app/path_params.py b/app/path_params.py index 2672d0c..16263ba 100644 --- a/app/path_params.py +++ b/app/path_params.py @@ -10,10 +10,11 @@ def issue_number_search_value(query: str) -> int | None: """Return a bounded GitHub issue number from a plain numeric search query.""" - if not query.isdigit(): + clean = query.removeprefix("#") + if not clean.isdigit(): return None try: - issue_number = int(query) + issue_number = int(clean) except ValueError: return None return issue_number if issue_number <= SQLITE_INTEGER_MAX else None diff --git a/tests/test_bounty_pages.py b/tests/test_bounty_pages.py index e696d6c..c34e5a4 100644 --- a/tests/test_bounty_pages.py +++ b/tests/test_bounty_pages.py @@ -172,6 +172,16 @@ def test_bounties_page_and_api_search_by_text_and_issue_number(sqlite_url: str) assert issue_search.status_code == 200 assert [row["issue_number"] for row in issue_search.json()] == [65] + hash_issue_search = client.get("/api/v1/bounties?q=%2365") + assert hash_issue_search.status_code == 200 + assert [row["issue_number"] for row in hash_issue_search.json()] == [65] + + hash_issue_page = client.get("/bounties?q=%2365") + assert hash_issue_page.status_code == 200 + assert "Showing matches for “#65”." in hash_issue_page.text + assert "Internal admin cleanup" in hash_issue_page.text + assert "Improve public bounty discovery" not in hash_issue_page.text + oversized_issue_search = client.get("/api/v1/bounties", params={"q": "9" * 40}) assert oversized_issue_search.status_code == 200 assert oversized_issue_search.json() == [] diff --git a/tests/test_path_params.py b/tests/test_path_params.py index 52f9c9b..4ca535e 100644 --- a/tests/test_path_params.py +++ b/tests/test_path_params.py @@ -20,12 +20,15 @@ def assert_bad_request(func, *args): def test_issue_number_search_value_accepts_bounded_numeric_query(): assert issue_number_search_value("340") == 340 + assert issue_number_search_value("#340") == 340 assert issue_number_search_value(str(SQLITE_INTEGER_MAX)) == SQLITE_INTEGER_MAX def test_issue_number_search_value_rejects_non_numeric_or_overflow_query(): assert issue_number_search_value("") is None + assert issue_number_search_value("#") is None assert issue_number_search_value(" 340") is None + assert issue_number_search_value(" #340") is None assert issue_number_search_value("340a") is None assert issue_number_search_value(str(SQLITE_INTEGER_MAX + 1)) is None