async def ds_with_route(): ds = Datasette() 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
async def ds_tiles(metadata=None): datasette = Datasette([], metadata=metadata or {}, memory=True) for db_name, tiles in ( ("world", [[2, 1, 1]]), ("country", [[2, 2, 1], [2, 2, 2]]), ("city1", [[2, 2, 1]]), ("city2", [[2, 3, 3]]), ): db = datasette.add_database(Database(datasette, memory_name=db_name)) # During test runs database tables may exist already if await db.table_exists("tiles"): continue await db.execute_write(CREATE_TILES_TABLE, block=True) await db.execute_write(CREATE_METADATA_TABLE, block=True) for pair in (("name", db_name), ("format", "png")): await db.execute_write( "insert into metadata (name, value) values (?, ?)", pair, block=True, ) for tile in tiles: await db.execute_write( "insert into tiles (zoom_level, tile_column, tile_row, tile_data) values (?, ?, ?, ?)", tile + ["tms:{}:{}".format(db_name, "/".join(map(str, tile)))], block=True, ) await datasette.invoke_startup() return datasette
async def test_detect_mtiles_databases(i, create_table, should_be_mtiles): datasette = Datasette([]) name = "db_{}".format(i) db = datasette.add_database(Database(datasette, memory_name=name)) if create_table: await db.execute_write(create_table, block=True) result = await detect_mtiles_databases(datasette) expected = [name] if should_be_mtiles else [] assert result == expected
async def test_num_sql_threads_zero(): ds = Datasette([], memory=True, settings={"num_sql_threads": 0}) db = ds.add_database(Database(ds, memory_name="test_num_sql_threads_zero")) await db.execute_write("create table t(id integer primary key)") await db.execute_write("insert into t (id) values (1)") response = await ds.client.get("/-/threads.json") assert response.json() == {"num_threads": 0, "threads": []} response2 = await ds.client.get( "/test_num_sql_threads_zero/t.json?_shape=array") assert response2.json() == [{"id": 1}]
async def test_facet_size(): ds = Datasette([], memory=True, settings={"max_returned_rows": 50}) db = ds.add_database(Database(ds, memory_name="test_facet_size")) await db.execute_write( "create table neighbourhoods(city text, neighbourhood text)", block=True ) for i in range(1, 51): for j in range(1, 4): await db.execute_write( "insert into neighbourhoods (city, neighbourhood) values (?, ?)", ["City {}".format(i), "Neighbourhood {}".format(j)], block=True, ) response = await ds.client.get("/test_facet_size/neighbourhoods.json") data = response.json() assert data["suggested_facets"] == [ { "name": "neighbourhood", "toggle_url": "http://localhost/test_facet_size/neighbourhoods.json?_facet=neighbourhood", } ] # Bump up _facet_size= to suggest city too response2 = await ds.client.get( "/test_facet_size/neighbourhoods.json?_facet_size=50" ) data2 = response2.json() assert sorted(data2["suggested_facets"], key=lambda f: f["name"]) == [ { "name": "city", "toggle_url": "http://localhost/test_facet_size/neighbourhoods.json?_facet_size=50&_facet=city", }, { "name": "neighbourhood", "toggle_url": "http://localhost/test_facet_size/neighbourhoods.json?_facet_size=50&_facet=neighbourhood", }, ] # Facet by city should return expected number of results response3 = await ds.client.get( "/test_facet_size/neighbourhoods.json?_facet_size=50&_facet=city" ) data3 = response3.json() assert len(data3["facet_results"]["city"]["results"]) == 50 # Reduce max_returned_rows and check that it's respected ds._settings["max_returned_rows"] = 20 response4 = await ds.client.get( "/test_facet_size/neighbourhoods.json?_facet_size=50&_facet=city" ) data4 = response4.json() assert len(data4["facet_results"]["city"]["results"]) == 20 # Test _facet_size=max response5 = await ds.client.get( "/test_facet_size/neighbourhoods.json?_facet_size=max&_facet=city" ) data5 = response5.json() assert len(data5["facet_results"]["city"]["results"]) == 20
async def test_array_facet_handle_duplicate_tags(): ds = Datasette([], memory=True) db = ds.add_database(Database(ds, memory_name="test_array_facet")) await db.execute_write("create table otters(name text, tags text)") for name, tags in ( ("Charles", ["friendly", "cunning", "friendly"]), ("Shaun", ["cunning", "empathetic", "friendly"]), ("Tracy", ["empathetic", "eager"]), ): await db.execute_write( "insert into otters (name, tags) values (?, ?)", [name, json.dumps(tags)] ) response = await ds.client.get("/test_array_facet/otters.json?_facet_array=tags") assert response.json()["facet_results"]["tags"] == { "name": "tags", "type": "array", "results": [ { "value": "cunning", "label": "cunning", "count": 2, "toggle_url": "http://localhost/test_array_facet/otters.json?_facet_array=tags&tags__arraycontains=cunning", "selected": False, }, { "value": "empathetic", "label": "empathetic", "count": 2, "toggle_url": "http://localhost/test_array_facet/otters.json?_facet_array=tags&tags__arraycontains=empathetic", "selected": False, }, { "value": "friendly", "label": "friendly", "count": 2, "toggle_url": "http://localhost/test_array_facet/otters.json?_facet_array=tags&tags__arraycontains=friendly", "selected": False, }, { "value": "eager", "label": "eager", "count": 1, "toggle_url": "http://localhost/test_array_facet/otters.json?_facet_array=tags&tags__arraycontains=eager", "selected": False, }, ], "hideable": True, "toggle_url": "/test_array_facet/otters.json", "truncated": False, }
async def test_json_array_with_blanks_and_nulls(): ds = Datasette([], memory=True) db = ds.add_database(Database(ds, memory_name="test_json_array")) await db.execute_write("create table foo(json_column text)") for value in ('["a", "b", "c"]', '["a", "b"]', "", None): await db.execute_write("insert into foo (json_column) values (?)", [value]) response = await ds.client.get("/test_json_array/foo.json") data = response.json() assert data["suggested_facets"] == [ { "name": "json_column", "type": "array", "toggle_url": "http://localhost/test_json_array/foo.json?_facet_array=json_column", } ]