diff --git a/datasette/templates/query.html b/datasette/templates/query.html index 8dd1037f..91bd7a2a 100644 --- a/datasette/templates/query.html +++ b/datasette/templates/query.html @@ -37,7 +37,7 @@ {% block description_source_license %}{% include "_description_source_license.html" %}{% endblock %} -
+

Custom SQL query{% if display_rows %} returning {% if truncated %}more than {% endif %}{{ "{:,}".format(display_rows|length) }} row{% if display_rows|length == 1 %}{% else %}s{% endif %}{% endif %}{% if not query_error %} ({{ show_hide_text }}) {% endif %}

diff --git a/tests/test_query_form_action.py b/tests/test_query_form_action.py new file mode 100644 index 00000000..8f419d55 --- /dev/null +++ b/tests/test_query_form_action.py @@ -0,0 +1,53 @@ +import pytest +from bs4 import BeautifulSoup as Soup + + +@pytest.mark.asyncio +async def test_ad_hoc_query_form_targets_query_route(ds_client): + response = await ds_client.get("/fixtures/-/query?sql=select+1") + assert response.status_code == 200 + + form = Soup(response.text, "html.parser").select_one("form.sql.core") + assert form is not None + assert form["action"] == "/fixtures/-/query" + + +def test_ad_hoc_query_form_action_preserves_base_url(app_client_base_url_prefix): + response = app_client_base_url_prefix.get("/prefix/fixtures/-/query?sql=select+1") + assert response.status_code == 200 + + form = Soup(response.text, "html.parser").select_one("form.sql.core") + assert form is not None + assert form["action"] == "/prefix/fixtures/-/query" + + +@pytest.mark.asyncio +async def test_stored_query_form_action_encodes_query_name(ds_client): + query_name = "query with spaces" + await ds_client.ds.update_query("fixtures", query_name, sql="select 1") + query_url = ds_client.ds.urls.query("fixtures", query_name) + + response = await ds_client.get(query_url) + assert response.status_code == 200 + + form = Soup(response.text, "html.parser").select_one("form.sql.core") + assert form is not None + assert form["action"] == query_url + + +@pytest.mark.asyncio +async def test_stored_query_form_action_preserves_base_url( + app_client_base_url_prefix, +): + query_name = "query with spaces" + await app_client_base_url_prefix.ds.update_query( + "fixtures", query_name, sql="select 1" + ) + query_url = app_client_base_url_prefix.ds.urls.query("fixtures", query_name) + + response = app_client_base_url_prefix.get(query_url) + assert response.status_code == 200 + + form = Soup(response.text, "html.parser").select_one("form.sql.core") + assert form is not None + assert form["action"] == query_url