kopia lustrzana https://github.com/simonw/datasette
				
				
				
			
		
			
				
	
	
		
			112 wiersze
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			112 wiersze
		
	
	
		
			3.4 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_class,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",
 | 
						|
            "TableView",
 | 
						|
            {"database": "foo", "table": "humbug", "format": None},
 | 
						|
        ),
 | 
						|
        (
 | 
						|
            "/foo/humbug.json",
 | 
						|
            "TableView",
 | 
						|
            {"database": "foo", "table": "humbug", "format": "json"},
 | 
						|
        ),
 | 
						|
        (
 | 
						|
            "/foo/humbug.blah",
 | 
						|
            "TableView",
 | 
						|
            {"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_class, expected_matches):
 | 
						|
    match, view = resolve_routes(routes, path)
 | 
						|
    if expected_class is None:
 | 
						|
        assert match is None
 | 
						|
    else:
 | 
						|
        assert view.view_class.__name__ == expected_class
 | 
						|
        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
 |