datasette/tests/test_routes.py

114 wiersze
3.5 KiB
Python

from datasette.app import Datasette, Database
from datasette.utils import resolve_routes
import pytest
import pytest_asyncio
@pytest.fixture(scope="session")
def routes():
ds = Datasette()
return ds._routes()
@pytest.mark.parametrize(
"path,expected_name,expected_matches",
(
("/", "IndexView", {"format": None}),
("/foo", "DatabaseView", {"format": None, "database": "foo"}),
("/foo.csv", "DatabaseView", {"format": "csv", "database": "foo"}),
("/foo.json", "DatabaseView", {"format": "json", "database": "foo"}),
("/foo.humbug", "DatabaseView", {"format": "humbug", "database": "foo"}),
(
"/foo/humbug",
"table_view",
{"database": "foo", "table": "humbug", "format": None},
),
(
"/foo/humbug.json",
"table_view",
{"database": "foo", "table": "humbug", "format": "json"},
),
(
"/foo/humbug.blah",
"table_view",
{"database": "foo", "table": "humbug", "format": "blah"},
),
(
"/foo/humbug/1",
"RowView",
{"format": None, "database": "foo", "pks": "1", "table": "humbug"},
),
(
"/foo/humbug/1.json",
"RowView",
{"format": "json", "database": "foo", "pks": "1", "table": "humbug"},
),
("/-/metadata.json", "JsonDataView", {"format": "json"}),
("/-/metadata", "JsonDataView", {"format": None}),
),
)
def test_routes(routes, path, expected_name, expected_matches):
match, view = resolve_routes(routes, path)
if expected_name is None:
assert match is None
else:
assert (
view.__name__ == expected_name or view.view_class.__name__ == expected_name
)
assert match.groupdict() == expected_matches
@pytest_asyncio.fixture
async def ds_with_route():
ds = Datasette()
await ds.invoke_startup()
ds.remove_database("_memory")
db = Database(ds, is_memory=True, memory_name="route-name-db")
ds.add_database(db, name="original-name", route="custom-route-name")
await db.execute_write_script(
"""
create table if not exists t (id integer primary key);
insert or replace into t (id) values (1);
"""
)
return ds
@pytest.mark.asyncio
async def test_db_with_route_databases(ds_with_route):
response = await ds_with_route.client.get("/-/databases.json")
assert response.json()[0] == {
"name": "original-name",
"route": "custom-route-name",
"path": None,
"size": 0,
"is_mutable": True,
"is_memory": True,
"hash": None,
}
@pytest.mark.asyncio
@pytest.mark.parametrize(
"path,expected_status",
(
("/", 200),
("/original-name", 404),
("/original-name/t", 404),
("/original-name/t/1", 404),
("/custom-route-name", 200),
("/custom-route-name?sql=select+id+from+t", 200),
("/custom-route-name/t", 200),
("/custom-route-name/t/1", 200),
),
)
async def test_db_with_route_that_does_not_match_name(
ds_with_route, path, expected_status
):
response = await ds_with_route.client.get(path)
assert response.status_code == expected_status
# There should be links to custom-route-name but none to original-name
if response.status_code == 200:
assert "/custom-route-name" in response.text
assert "/original-name" not in response.text