Don't 500 on ?_facets=x

Tighten up code that extracts `?_facet=` or `?_facet_type=` parameters.
This commit is contained in:
pengboyu-dev 2026-09-25 02:34:45 +08:00 • committed by GitHub
commit d9f9ed5027
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 36 additions and 2 deletions

View file

@ -39,7 +39,7 @@ def load_facet_configs(request, table_config):
)
qs_pairs = urllib.parse.parse_qs(request.query_string, keep_blank_values=True)
for key, values in qs_pairs.items():
if key.startswith("_facet"):
if key == "_facet" or key.startswith("_facet_"):
# Figure out the facet type
if key == "_facet":
type = "column"

View file

@ -5,13 +5,47 @@ import pytest
from datasette.app import Datasette
from datasette.database import Database
from datasette.facets import ArrayFacet, ColumnFacet, DateFacet, Facet
from datasette.facets import (
ArrayFacet,
ColumnFacet,
DateFacet,
Facet,
load_facet_configs,
)
from datasette.utils import detect_json1
from datasette.utils.asgi import Request
from .fixtures import make_app_client
@pytest.mark.parametrize(
"query_string",
("_facets=ignored", "_facet=state&_facets=ignored", "_facets=ignored&_facet=state"),
)
@pytest.mark.parametrize("table_config", ({}, {"facets": ["state"]}))
def test_facet_configs_ignore_unrelated_prefixes(query_string, table_config):
expected = load_facet_configs(
Request.fake("/?_facet=state" if "_facet=" in query_string else "/"),
table_config,
)
assert (
load_facet_configs(Request.fake("/?" + query_string), table_config) == expected
)
@pytest.mark.asyncio
@pytest.mark.parametrize(
"query_string",
("_facet=state&_facets=ignored", "_facets=ignored&_facet=state"),
)
async def test_facet_ignores_unrelated_prefixes(ds_client, query_string):
response = await ds_client.get("/fixtures/facetable.json?" + query_string)
assert response.status_code == 200
facets = response.json()["facet_results"]["results"]
assert set(facets) == {"state"}
assert facets["state"]["results"]
@pytest.mark.asyncio
async def test_column_facet_suggest(ds_client):
facet = ColumnFacet(