-
-
Save simonw/df0a52cd7d820b776dc3dfc50e7cb778 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(datasette) simon@Simons-MacBook-Pro datasette % pytest tests/test_table_html.py | |
================================================================================= test session starts ================================================================================= | |
platform darwin -- Python 3.10.9, pytest-7.2.1, pluggy-1.0.0 | |
SQLite: 3.40.1 | |
rootdir: /Users/simon/Dropbox/Development/datasette, configfile: pytest.ini | |
plugins: asyncio-0.20.3, xdist-3.1.0, timeout-2.1.0, anyio-3.6.2 | |
asyncio: mode=strict | |
collected 68 items | |
tests/test_table_html.py FFFFFFFFFFFFF.FFFFF.FFFF.FFFFFFFF..FFFF...FFF......FFFF....F...FF... [100%] | |
====================================================================================== FAILURES ======================================================================================= | |
____________________________ test_table_definition_sql[/fixtures/facet_cities-CREATE TABLE facet_cities (\n id integer primary key,\n name text\n);] ____________________________ | |
path = '/fixtures/facet_cities', expected_definition_sql = 'CREATE TABLE facet_cities (\n id integer primary key,\n name text\n);' | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340> | |
@pytest.mark.asyncio | |
@pytest.mark.parametrize( | |
"path,expected_definition_sql", | |
[ | |
( | |
"/fixtures/facet_cities", | |
""" | |
CREATE TABLE facet_cities ( | |
id integer primary key, | |
name text | |
); | |
""".strip(), | |
), | |
( | |
"/fixtures/compound_three_primary_keys", | |
""" | |
CREATE TABLE compound_three_primary_keys ( | |
pk1 varchar(30), | |
pk2 varchar(30), | |
pk3 varchar(30), | |
content text, | |
PRIMARY KEY (pk1, pk2, pk3) | |
); | |
CREATE INDEX idx_compound_three_primary_keys_content ON compound_three_primary_keys(content); | |
""".strip(), | |
), | |
], | |
) | |
async def test_table_definition_sql(path, expected_definition_sql, ds_client): | |
response = await ds_client.get(path) | |
pre = Soup(response.text, "html.parser").select_one("pre.wrapped-sql") | |
> assert expected_definition_sql == pre.string | |
E AttributeError: 'NoneType' object has no attribute 'string' | |
tests/test_table_html.py:44: AttributeError | |
_ test_table_definition_sql[/fixtures/compound_three_primary_keys-CREATE TABLE compound_three_primary_keys (\n pk1 varchar(30),\n pk2 varchar(30),\n pk3 varchar(30),\n content text,\n PRIMARY KEY (pk1, pk2, pk3)\n);\nCREATE INDEX idx_compound_three_primary_keys_content ON compound_three_primary_keys(content);] _ | |
path = '/fixtures/compound_three_primary_keys' | |
expected_definition_sql = 'CREATE TABLE compound_three_primary_keys (\n pk1 varchar(30),\n pk2 varchar(30),\n pk3 varchar(30),\n content tex...KEY (pk1, pk2, pk3)\n);\nCREATE INDEX idx_compound_three_primary_keys_content ON compound_three_primary_keys(content);' | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340> | |
@pytest.mark.asyncio | |
@pytest.mark.parametrize( | |
"path,expected_definition_sql", | |
[ | |
( | |
"/fixtures/facet_cities", | |
""" | |
CREATE TABLE facet_cities ( | |
id integer primary key, | |
name text | |
); | |
""".strip(), | |
), | |
( | |
"/fixtures/compound_three_primary_keys", | |
""" | |
CREATE TABLE compound_three_primary_keys ( | |
pk1 varchar(30), | |
pk2 varchar(30), | |
pk3 varchar(30), | |
content text, | |
PRIMARY KEY (pk1, pk2, pk3) | |
); | |
CREATE INDEX idx_compound_three_primary_keys_content ON compound_three_primary_keys(content); | |
""".strip(), | |
), | |
], | |
) | |
async def test_table_definition_sql(path, expected_definition_sql, ds_client): | |
response = await ds_client.get(path) | |
pre = Soup(response.text, "html.parser").select_one("pre.wrapped-sql") | |
> assert expected_definition_sql == pre.string | |
E AttributeError: 'NoneType' object has no attribute 'string' | |
tests/test_table_html.py:44: AttributeError | |
_____________________________________________________________________________ test_table_cell_truncation ______________________________________________________________________________ | |
def test_table_cell_truncation(): | |
with make_app_client(settings={"truncate_cells_html": 5}) as client: | |
response = client.get("/fixtures/facetable") | |
assert response.status == 200 | |
table = Soup(response.body, "html.parser").find("table") | |
assert table["class"] == ["rows-and-columns"] | |
> assert [ | |
"Missi…", | |
"Dogpa…", | |
"SOMA", | |
"Tende…", | |
"Berna…", | |
"Hayes…", | |
"Holly…", | |
"Downt…", | |
"Los F…", | |
"Korea…", | |
"Downt…", | |
"Greek…", | |
"Corkt…", | |
"Mexic…", | |
"Arcad…", | |
] == [ | |
td.string | |
for td in table.findAll("td", {"class": "col-neighborhood-b352a7"}) | |
] | |
E AssertionError: assert ['Missi…', 'D...'Hayes…', ...] == ['Mission', '... Valley', ...] | |
E At index 0 diff: 'Missi…' != 'Mission' | |
E Use -v to get more diff | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:53: AssertionError | |
______________________________________________________________________________ test_add_filter_redirects ______________________________________________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340> | |
@pytest.mark.asyncio | |
async def test_add_filter_redirects(ds_client): | |
filter_args = urllib.parse.urlencode( | |
{"_filter_column": "content", "_filter_op": "startswith", "_filter_value": "x"} | |
) | |
path_base = "/fixtures/simple_primary_key" | |
path = path_base + "?" + filter_args | |
response = await ds_client.get(path) | |
> assert response.status_code == 302 | |
E assert 500 == 302 | |
E + where 500 = <Response [500 Internal Server Error]>.status_code | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:94: AssertionError | |
-------------------------------------------------------------------------------- Captured stderr call --------------------------------------------------------------------------------- | |
Traceback (most recent call last): | |
File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 1527, in route_path | |
response = await view(request, send) | |
File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 1673, in async_view_fn | |
response = await async_call_with_supported_arguments( | |
File "/Users/simon/Dropbox/Development/datasette/datasette/utils/__init__.py", line 1005, in async_call_with_supported_arguments | |
return await fn(*call_with) | |
File "/Users/simon/Dropbox/Development/datasette/datasette/views/table.py", line 1487, in table_view | |
return await table_view_traced(datasette, request) | |
File "/Users/simon/Dropbox/Development/datasette/datasette/views/table.py", line 1519, in table_view_traced | |
dict( | |
TypeError: 'Response' object is not iterable | |
___________________________________________________________________________ test_existing_filter_redirects ____________________________________________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340> | |
@pytest.mark.asyncio | |
async def test_existing_filter_redirects(ds_client): | |
filter_args = { | |
"_filter_column_1": "name", | |
"_filter_op_1": "contains", | |
"_filter_value_1": "hello", | |
"_filter_column_2": "age", | |
"_filter_op_2": "gte", | |
"_filter_value_2": "22", | |
"_filter_column_3": "age", | |
"_filter_op_3": "lt", | |
"_filter_value_3": "30", | |
"_filter_column_4": "name", | |
"_filter_op_4": "contains", | |
"_filter_value_4": "world", | |
} | |
path_base = "/fixtures/simple_primary_key" | |
path = path_base + "?" + urllib.parse.urlencode(filter_args) | |
response = await ds_client.get(path) | |
> assert response.status_code == 302 | |
E assert 500 == 302 | |
E + where 500 = <Response [500 Internal Server Error]>.status_code | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:139: AssertionError | |
-------------------------------------------------------------------------------- Captured stderr call --------------------------------------------------------------------------------- | |
Traceback (most recent call last): | |
File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 1527, in route_path | |
response = await view(request, send) | |
File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 1673, in async_view_fn | |
response = await async_call_with_supported_arguments( | |
File "/Users/simon/Dropbox/Development/datasette/datasette/utils/__init__.py", line 1005, in async_call_with_supported_arguments | |
return await fn(*call_with) | |
File "/Users/simon/Dropbox/Development/datasette/datasette/views/table.py", line 1487, in table_view | |
return await table_view_traced(datasette, request) | |
File "/Users/simon/Dropbox/Development/datasette/datasette/views/table.py", line 1519, in table_view_traced | |
dict( | |
TypeError: 'Response' object is not iterable | |
______________________________________________________ test_reflected_hidden_form_fields[_facet=_neighborhood-expected_hidden0] _______________________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340>, qs = '_facet=_neighborhood', expected_hidden = {'_facet': '_neighborhood'} | |
@pytest.mark.asyncio | |
@pytest.mark.parametrize( | |
"qs,expected_hidden", | |
( | |
# Things that should be reflected in hidden form fields: | |
("_facet=_neighborhood", {"_facet": "_neighborhood"}), | |
("_where=1+=+1&_col=_city_id", {"_where": "1 = 1", "_col": "_city_id"}), | |
# Things that should NOT be reflected in hidden form fields: | |
( | |
"_facet=_neighborhood&_neighborhood__exact=Downtown", | |
{"_facet": "_neighborhood"}, | |
), | |
("_facet=_neighborhood&_city_id__gt=1", {"_facet": "_neighborhood"}), | |
), | |
) | |
async def test_reflected_hidden_form_fields(ds_client, qs, expected_hidden): | |
# https://github.com/simonw/datasette/issues/1527 | |
response = await ds_client.get("/fixtures/facetable?{}".format(qs)) | |
# In this case we should NOT have a hidden _neighborhood__exact=Downtown field | |
form = Soup(response.text, "html.parser").find("form") | |
hidden_inputs = { | |
input["name"]: input["value"] for input in form.select("input[type=hidden]") | |
} | |
> assert hidden_inputs == expected_hidden | |
E AssertionError: assert {} == {'_facet': '_neighborhood'} | |
E Right contains 1 more item: | |
E {'_facet': '_neighborhood'} | |
E Use -v to get more diff | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:184: AssertionError | |
___________________________________________________ test_reflected_hidden_form_fields[_where=1+=+1&_col=_city_id-expected_hidden1] ____________________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340>, qs = '_where=1+=+1&_col=_city_id', expected_hidden = {'_col': '_city_id', '_where': '1 = 1'} | |
@pytest.mark.asyncio | |
@pytest.mark.parametrize( | |
"qs,expected_hidden", | |
( | |
# Things that should be reflected in hidden form fields: | |
("_facet=_neighborhood", {"_facet": "_neighborhood"}), | |
("_where=1+=+1&_col=_city_id", {"_where": "1 = 1", "_col": "_city_id"}), | |
# Things that should NOT be reflected in hidden form fields: | |
( | |
"_facet=_neighborhood&_neighborhood__exact=Downtown", | |
{"_facet": "_neighborhood"}, | |
), | |
("_facet=_neighborhood&_city_id__gt=1", {"_facet": "_neighborhood"}), | |
), | |
) | |
async def test_reflected_hidden_form_fields(ds_client, qs, expected_hidden): | |
# https://github.com/simonw/datasette/issues/1527 | |
response = await ds_client.get("/fixtures/facetable?{}".format(qs)) | |
# In this case we should NOT have a hidden _neighborhood__exact=Downtown field | |
form = Soup(response.text, "html.parser").find("form") | |
hidden_inputs = { | |
input["name"]: input["value"] for input in form.select("input[type=hidden]") | |
} | |
> assert hidden_inputs == expected_hidden | |
E AssertionError: assert {} == {'_col': '_ci...ere': '1 = 1'} | |
E Right contains 2 more items: | |
E {'_col': '_city_id', '_where': '1 = 1'} | |
E Use -v to get more diff | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:184: AssertionError | |
_______________________________________ test_reflected_hidden_form_fields[_facet=_neighborhood&_neighborhood__exact=Downtown-expected_hidden2] ________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340>, qs = '_facet=_neighborhood&_neighborhood__exact=Downtown', expected_hidden = {'_facet': '_neighborhood'} | |
@pytest.mark.asyncio | |
@pytest.mark.parametrize( | |
"qs,expected_hidden", | |
( | |
# Things that should be reflected in hidden form fields: | |
("_facet=_neighborhood", {"_facet": "_neighborhood"}), | |
("_where=1+=+1&_col=_city_id", {"_where": "1 = 1", "_col": "_city_id"}), | |
# Things that should NOT be reflected in hidden form fields: | |
( | |
"_facet=_neighborhood&_neighborhood__exact=Downtown", | |
{"_facet": "_neighborhood"}, | |
), | |
("_facet=_neighborhood&_city_id__gt=1", {"_facet": "_neighborhood"}), | |
), | |
) | |
async def test_reflected_hidden_form_fields(ds_client, qs, expected_hidden): | |
# https://github.com/simonw/datasette/issues/1527 | |
response = await ds_client.get("/fixtures/facetable?{}".format(qs)) | |
# In this case we should NOT have a hidden _neighborhood__exact=Downtown field | |
form = Soup(response.text, "html.parser").find("form") | |
hidden_inputs = { | |
input["name"]: input["value"] for input in form.select("input[type=hidden]") | |
} | |
> assert hidden_inputs == expected_hidden | |
E AssertionError: assert {} == {'_facet': '_neighborhood'} | |
E Right contains 1 more item: | |
E {'_facet': '_neighborhood'} | |
E Use -v to get more diff | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:184: AssertionError | |
_______________________________________________ test_reflected_hidden_form_fields[_facet=_neighborhood&_city_id__gt=1-expected_hidden3] _______________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340>, qs = '_facet=_neighborhood&_city_id__gt=1', expected_hidden = {'_facet': '_neighborhood'} | |
@pytest.mark.asyncio | |
@pytest.mark.parametrize( | |
"qs,expected_hidden", | |
( | |
# Things that should be reflected in hidden form fields: | |
("_facet=_neighborhood", {"_facet": "_neighborhood"}), | |
("_where=1+=+1&_col=_city_id", {"_where": "1 = 1", "_col": "_city_id"}), | |
# Things that should NOT be reflected in hidden form fields: | |
( | |
"_facet=_neighborhood&_neighborhood__exact=Downtown", | |
{"_facet": "_neighborhood"}, | |
), | |
("_facet=_neighborhood&_city_id__gt=1", {"_facet": "_neighborhood"}), | |
), | |
) | |
async def test_reflected_hidden_form_fields(ds_client, qs, expected_hidden): | |
# https://github.com/simonw/datasette/issues/1527 | |
response = await ds_client.get("/fixtures/facetable?{}".format(qs)) | |
# In this case we should NOT have a hidden _neighborhood__exact=Downtown field | |
form = Soup(response.text, "html.parser").find("form") | |
hidden_inputs = { | |
input["name"]: input["value"] for input in form.select("input[type=hidden]") | |
} | |
> assert hidden_inputs == expected_hidden | |
E AssertionError: assert {} == {'_facet': '_neighborhood'} | |
E Right contains 1 more item: | |
E {'_facet': '_neighborhood'} | |
E Use -v to get more diff | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:184: AssertionError | |
______________________________________________________________________ test_empty_search_parameter_gets_removed _______________________________________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340> | |
@pytest.mark.asyncio | |
async def test_empty_search_parameter_gets_removed(ds_client): | |
path_base = "/fixtures/simple_primary_key" | |
path = ( | |
path_base | |
+ "?" | |
+ urllib.parse.urlencode( | |
{ | |
"_search": "", | |
"_filter_column": "name", | |
"_filter_op": "exact", | |
"_filter_value": "chidi", | |
} | |
) | |
) | |
response = await ds_client.get(path) | |
> assert response.status_code == 302 | |
E assert 500 == 302 | |
E + where 500 = <Response [500 Internal Server Error]>.status_code | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:203: AssertionError | |
-------------------------------------------------------------------------------- Captured stderr call --------------------------------------------------------------------------------- | |
Traceback (most recent call last): | |
File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 1527, in route_path | |
response = await view(request, send) | |
File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 1673, in async_view_fn | |
response = await async_call_with_supported_arguments( | |
File "/Users/simon/Dropbox/Development/datasette/datasette/utils/__init__.py", line 1005, in async_call_with_supported_arguments | |
return await fn(*call_with) | |
File "/Users/simon/Dropbox/Development/datasette/datasette/views/table.py", line 1487, in table_view | |
return await table_view_traced(datasette, request) | |
File "/Users/simon/Dropbox/Development/datasette/datasette/views/table.py", line 1519, in table_view_traced | |
dict( | |
TypeError: 'Response' object is not iterable | |
_______________________________________________________________________ test_searchable_view_persists_fts_table _______________________________________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340> | |
@pytest.mark.asyncio | |
async def test_searchable_view_persists_fts_table(ds_client): | |
# The search form should persist ?_fts_table as a hidden field | |
response = await ds_client.get( | |
"/fixtures/searchable_view?_fts_table=searchable_fts&_fts_pk=pk" | |
) | |
inputs = Soup(response.text, "html.parser").find("form").findAll("input") | |
hiddens = [i for i in inputs if i["type"] == "hidden"] | |
> assert [("_fts_table", "searchable_fts"), ("_fts_pk", "pk")] == [ | |
(hidden["name"], hidden["value"]) for hidden in hiddens | |
] | |
E AssertionError: assert [('_fts_table...ts_pk', 'pk')] == [] | |
E Left contains 2 more items, first extra item: ('_fts_table', 'searchable_fts') | |
E Use -v to get more diff | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:215: AssertionError | |
_____________________________________________________________________________ test_sort_by_desc_redirects _____________________________________________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340> | |
@pytest.mark.asyncio | |
async def test_sort_by_desc_redirects(ds_client): | |
path_base = "/fixtures/sortable" | |
path = ( | |
path_base | |
+ "?" | |
+ urllib.parse.urlencode({"_sort": "sortable", "_sort_by_desc": "1"}) | |
) | |
response = await ds_client.get(path) | |
> assert response.status_code == 302 | |
E assert 500 == 302 | |
E + where 500 = <Response [500 Internal Server Error]>.status_code | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:229: AssertionError | |
-------------------------------------------------------------------------------- Captured stderr call --------------------------------------------------------------------------------- | |
Traceback (most recent call last): | |
File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 1527, in route_path | |
response = await view(request, send) | |
File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 1673, in async_view_fn | |
response = await async_call_with_supported_arguments( | |
File "/Users/simon/Dropbox/Development/datasette/datasette/utils/__init__.py", line 1005, in async_call_with_supported_arguments | |
return await fn(*call_with) | |
File "/Users/simon/Dropbox/Development/datasette/datasette/views/table.py", line 1487, in table_view | |
return await table_view_traced(datasette, request) | |
File "/Users/simon/Dropbox/Development/datasette/datasette/views/table.py", line 1519, in table_view_traced | |
dict( | |
TypeError: 'Response' object is not iterable | |
___________________________________________________________________________________ test_sort_links ___________________________________________________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340> | |
@pytest.mark.asyncio | |
async def test_sort_links(ds_client): | |
response = await ds_client.get("/fixtures/sortable?_sort=sortable") | |
assert response.status_code == 200 | |
ths = Soup(response.text, "html.parser").findAll("th") | |
attrs_and_link_attrs = [ | |
{ | |
"attrs": th.attrs, | |
"a_href": (th.find("a")["href"] if th.find("a") else None), | |
} | |
for th in ths | |
] | |
> assert attrs_and_link_attrs == [ | |
{ | |
"attrs": { | |
"class": ["col-Link"], | |
"scope": "col", | |
"data-column": "Link", | |
"data-column-type": "", | |
"data-column-not-null": "0", | |
"data-is-pk": "0", | |
}, | |
"a_href": None, | |
}, | |
{ | |
"attrs": { | |
"class": ["col-pk1"], | |
"scope": "col", | |
"data-column": "pk1", | |
"data-column-type": "varchar(30)", | |
"data-column-not-null": "0", | |
"data-is-pk": "1", | |
}, | |
"a_href": None, | |
}, | |
{ | |
"attrs": { | |
"class": ["col-pk2"], | |
"scope": "col", | |
"data-column": "pk2", | |
"data-column-type": "varchar(30)", | |
"data-column-not-null": "0", | |
"data-is-pk": "1", | |
}, | |
"a_href": None, | |
}, | |
{ | |
"attrs": { | |
"class": ["col-content"], | |
"scope": "col", | |
"data-column": "content", | |
"data-column-type": "text", | |
"data-column-not-null": "0", | |
"data-is-pk": "0", | |
}, | |
"a_href": None, | |
}, | |
{ | |
"attrs": { | |
"class": ["col-sortable"], | |
"scope": "col", | |
"data-column": "sortable", | |
"data-column-type": "integer", | |
"data-column-not-null": "0", | |
"data-is-pk": "0", | |
}, | |
"a_href": "/fixtures/sortable?_sort_desc=sortable", | |
}, | |
{ | |
"attrs": { | |
"class": ["col-sortable_with_nulls"], | |
"scope": "col", | |
"data-column": "sortable_with_nulls", | |
"data-column-type": "real", | |
"data-column-not-null": "0", | |
"data-is-pk": "0", | |
}, | |
"a_href": "/fixtures/sortable?_sort=sortable_with_nulls", | |
}, | |
{ | |
"attrs": { | |
"class": ["col-sortable_with_nulls_2"], | |
"scope": "col", | |
"data-column": "sortable_with_nulls_2", | |
"data-column-type": "real", | |
"data-column-not-null": "0", | |
"data-is-pk": "0", | |
}, | |
"a_href": "/fixtures/sortable?_sort=sortable_with_nulls_2", | |
}, | |
{ | |
"attrs": { | |
"class": ["col-text"], | |
"scope": "col", | |
"data-column": "text", | |
"data-column-type": "text", | |
"data-column-not-null": "0", | |
"data-is-pk": "0", | |
}, | |
"a_href": "/fixtures/sortable?_sort=text", | |
}, | |
] | |
E AssertionError: assert [{'a_href': N...', ...}}, ...] == [{'a_href': N...', ...}}, ...] | |
E At index 0 diff: {'attrs': {'class': ['col-pk1'], 'scope': 'col', 'data-column': 'pk1', 'data-column-type': 'varchar(30)', 'data-column-not-null': '0', 'data-is-pk': '1'}, 'a_href': None} != {'attrs': {'class': ['col-Link'], 'scope': 'col', 'data-column': 'Link', 'data-column-type': '', 'data-column-not-null': '0', 'data-is-pk': '0'}, 'a_href': None} | |
E Right contains one more item: {'a_href': '/fixtures/sortable?_sort=text', 'attrs': {'class': ['col-text'], 'data-column': 'text', 'data-column-not-null': '0', 'data-column-type': 'text', ...}} | |
E Use -v to get more diff | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:245: AssertionError | |
_______________________________________________________________________ test_facets_persist_through_filter_form _______________________________________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340> | |
@pytest.mark.asyncio | |
async def test_facets_persist_through_filter_form(ds_client): | |
response = await ds_client.get( | |
"/fixtures/facetable?_facet=planet_int&_facet=_city_id&_facet_array=tags" | |
) | |
assert response.status_code == 200 | |
inputs = Soup(response.text, "html.parser").find("form").findAll("input") | |
hiddens = [i for i in inputs if i["type"] == "hidden"] | |
> assert [(hidden["name"], hidden["value"]) for hidden in hiddens] == [ | |
("_facet", "planet_int"), | |
("_facet", "_city_id"), | |
("_facet_array", "tags"), | |
] | |
E AssertionError: assert [] == [('_facet', '...ray', 'tags')] | |
E Right contains 3 more items, first extra item: ('_facet', 'planet_int') | |
E Use -v to get more diff | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:427: AssertionError | |
_____________________________________________________________________ test_next_does_not_persist_in_hidden_field ______________________________________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340> | |
@pytest.mark.asyncio | |
async def test_next_does_not_persist_in_hidden_field(ds_client): | |
response = await ds_client.get("/fixtures/searchable?_size=1&_next=1") | |
assert response.status_code == 200 | |
inputs = Soup(response.text, "html.parser").find("form").findAll("input") | |
hiddens = [i for i in inputs if i["type"] == "hidden"] | |
> assert [(hidden["name"], hidden["value"]) for hidden in hiddens] == [ | |
("_size", "1"), | |
] | |
E AssertionError: assert [] == [('_size', '1')] | |
E Right contains one more item: ('_size', '1') | |
E Use -v to get more diff | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:440: AssertionError | |
_________________________________________________________________________ test_table_html_simple_primary_key __________________________________________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340> | |
@pytest.mark.asyncio | |
async def test_table_html_simple_primary_key(ds_client): | |
response = await ds_client.get("/fixtures/simple_primary_key?_size=3") | |
assert response.status_code == 200 | |
table = Soup(response.text, "html.parser").find("table") | |
assert table["class"] == ["rows-and-columns"] | |
ths = table.findAll("th") | |
> assert "id\xa0▼" == ths[0].find("a").string.strip() | |
E AttributeError: 'NoneType' object has no attribute 'string' | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:452: AttributeError | |
________________________________________________________________________ test_table_csv_json_export_interface _________________________________________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340> | |
@pytest.mark.asyncio | |
async def test_table_csv_json_export_interface(ds_client): | |
response = await ds_client.get("/fixtures/simple_primary_key?id__gt=2") | |
assert response.status_code == 200 | |
# The links at the top of the page | |
links = ( | |
Soup(response.text, "html.parser") | |
.find("p", {"class": "export-links"}) | |
.findAll("a") | |
) | |
actual = [l["href"] for l in links] | |
expected = [ | |
"/fixtures/simple_primary_key.json?id__gt=2", | |
"/fixtures/simple_primary_key.testall?id__gt=2", | |
"/fixtures/simple_primary_key.testnone?id__gt=2", | |
"/fixtures/simple_primary_key.testresponse?id__gt=2", | |
"/fixtures/simple_primary_key.csv?id__gt=2&_size=max", | |
"#export", | |
] | |
> assert expected == actual | |
E AssertionError: assert ['/fixtures/s...x', '#export'] == ['', '#export'] | |
E At index 0 diff: '/fixtures/simple_primary_key.json?id__gt=2' != '' | |
E Left contains 4 more items, first extra item: '/fixtures/simple_primary_key.testnone?id__gt=2' | |
E Use -v to get more diff | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:493: AssertionError | |
______________________________________________________________ test_csv_json_export_links_include_labels_if_foreign_keys ______________________________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340> | |
@pytest.mark.asyncio | |
async def test_csv_json_export_links_include_labels_if_foreign_keys(ds_client): | |
response = await ds_client.get("/fixtures/facetable") | |
assert response.status_code == 200 | |
links = ( | |
Soup(response.text, "html.parser") | |
.find("p", {"class": "export-links"}) | |
.findAll("a") | |
) | |
actual = [l["href"] for l in links] | |
expected = [ | |
"/fixtures/facetable.json?_labels=on", | |
"/fixtures/facetable.testall?_labels=on", | |
"/fixtures/facetable.testnone?_labels=on", | |
"/fixtures/facetable.testresponse?_labels=on", | |
"/fixtures/facetable.csv?_labels=on&_size=max", | |
"#export", | |
] | |
> assert expected == actual | |
E AssertionError: assert ['/fixtures/f...x', '#export'] == ['', '#export'] | |
E At index 0 diff: '/fixtures/facetable.json?_labels=on' != '' | |
E Left contains 4 more items, first extra item: '/fixtures/facetable.testnone?_labels=on' | |
E Use -v to get more diff | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:533: AssertionError | |
___________________________________________________________________________ test_table_html_no_primary_key ____________________________________________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340> | |
@pytest.mark.asyncio | |
async def test_table_html_no_primary_key(ds_client): | |
response = await ds_client.get("/fixtures/no_primary_key") | |
assert response.status_code == 200 | |
table = Soup(response.text, "html.parser").find("table") | |
# We have disabled sorting for this table using metadata.json | |
> assert ["content", "a", "b", "c"] == [ | |
th.string.strip() for th in table.select("thead th")[2:] | |
] | |
E AssertionError: assert ['content', 'a', 'b', 'c'] == ['a', 'b', 'c'] | |
E At index 0 diff: 'content' != 'a' | |
E Left contains one more item: 'c' | |
E Use -v to get more diff | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:547: AssertionError | |
_________________________________________________________________________ test_rowid_sortable_no_primary_key __________________________________________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340> | |
@pytest.mark.asyncio | |
async def test_rowid_sortable_no_primary_key(ds_client): | |
response = await ds_client.get("/fixtures/no_primary_key") | |
assert response.status_code == 200 | |
table = Soup(response.text, "html.parser").find("table") | |
assert table["class"] == ["rows-and-columns"] | |
ths = table.findAll("th") | |
> assert "rowid\xa0▼" == ths[1].find("a").string.strip() | |
E AttributeError: 'NoneType' object has no attribute 'string' | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:575: AttributeError | |
________________________________________________________________________ test_table_html_compound_primary_key _________________________________________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340> | |
@pytest.mark.asyncio | |
async def test_table_html_compound_primary_key(ds_client): | |
response = await ds_client.get("/fixtures/compound_primary_key") | |
assert response.status_code == 200 | |
table = Soup(response.text, "html.parser").find("table") | |
ths = table.findAll("th") | |
> assert "Link" == ths[0].string.strip() | |
E AssertionError: assert 'Link' == 'pk1' | |
E - pk1 | |
E + Link | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:584: AssertionError | |
__________________________________________________________________________ test_table_html_foreign_key_links __________________________________________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340> | |
@pytest.mark.asyncio | |
async def test_table_html_foreign_key_links(ds_client): | |
response = await ds_client.get("/fixtures/foreign_key_references") | |
assert response.status_code == 200 | |
table = Soup(response.text, "html.parser").find("table") | |
actual = [[str(td) for td in tr.select("td")] for tr in table.select("tbody tr")] | |
> assert actual == [ | |
[ | |
'<td class="col-pk type-pk"><a href="/fixtures/foreign_key_references/1">1</a></td>', | |
'<td class="col-foreign_key_with_label type-str"><a href="/fixtures/simple_primary_key/1">hello</a>\xa0<em>1</em></td>', | |
'<td class="col-foreign_key_with_blank_label type-str"><a href="/fixtures/simple_primary_key/3">-</a>\xa0<em>3</em></td>', | |
'<td class="col-foreign_key_with_no_label type-str"><a href="/fixtures/primary_key_multiple_columns/1">1</a></td>', | |
'<td class="col-foreign_key_compound_pk1 type-str">a</td>', | |
'<td class="col-foreign_key_compound_pk2 type-str">b</td>', | |
], | |
[ | |
'<td class="col-pk type-pk"><a href="/fixtures/foreign_key_references/2">2</a></td>', | |
'<td class="col-foreign_key_with_label type-none">\xa0</td>', | |
'<td class="col-foreign_key_with_blank_label type-none">\xa0</td>', | |
'<td class="col-foreign_key_with_no_label type-none">\xa0</td>', | |
'<td class="col-foreign_key_compound_pk1 type-none">\xa0</td>', | |
'<td class="col-foreign_key_compound_pk2 type-none">\xa0</td>', | |
], | |
] | |
E assert [['<td class=...">\xa0</td>']] == [['<td class=...">\xa0</td>']] | |
E At index 0 diff: ['<td class="col-pk type-str">1</td>', '<td class="col-foreign_key_with_label type-str">1</td>', '<td class="col-foreign_key_with_blank_label type-str">3</td>', '<td class="col-foreign_key_with_no_label type-str">1</td>', '<td class="col-foreign_key_compound_pk1 type-str">a</td>', '<td class="col-foreign_key_compound_pk2 type-str">b</td>'] != ['<td class="col-pk type-pk"><a href="/fixtures/foreign_key_references/1">1</a></td>', '<td class="col-foreign_key_with_label type-str"><a href="/fixtures/simple_primary_key/1">hello</a>\xa0<em>1</em></td>', '<td c... | |
E | |
E ...Full output truncated (2 lines hidden), use '-vv' to show | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:615: AssertionError | |
________________________________________________________________ test_table_html_disable_foreign_key_links_with_labels ________________________________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340> | |
@pytest.mark.asyncio | |
async def test_table_html_disable_foreign_key_links_with_labels(ds_client): | |
response = await ds_client.get( | |
"/fixtures/foreign_key_references?_labels=off&_size=1" | |
) | |
assert response.status_code == 200 | |
table = Soup(response.text, "html.parser").find("table") | |
actual = [[str(td) for td in tr.select("td")] for tr in table.select("tbody tr")] | |
> assert actual == [ | |
[ | |
'<td class="col-pk type-pk"><a href="/fixtures/foreign_key_references/1">1</a></td>', | |
'<td class="col-foreign_key_with_label type-str">1</td>', | |
'<td class="col-foreign_key_with_blank_label type-str">3</td>', | |
'<td class="col-foreign_key_with_no_label type-str">1</td>', | |
'<td class="col-foreign_key_compound_pk1 type-str">a</td>', | |
'<td class="col-foreign_key_compound_pk2 type-str">b</td>', | |
] | |
] | |
E assert [['<td class=...str">b</td>']] == [['<td class=...str">b</td>']] | |
E At index 0 diff: ['<td class="col-pk type-str">1</td>', '<td class="col-foreign_key_with_label type-str">1</td>', '<td class="col-foreign_key_with_blank_label type-str">3</td>', '<td class="col-foreign_key_with_no_label type-str">1</td>', '<td class="col-foreign_key_compound_pk1 type-str">a</td>', '<td class="col-foreign_key_compound_pk2 type-str">b</td>'] != ['<td class="col-pk type-pk"><a href="/fixtures/foreign_key_references/1">1</a></td>', '<td class="col-foreign_key_with_label type-str">1</td>', '<td class="col-foreign_key_with_blank_label type-str">3</td>', '<td ... | |
E | |
E ...Full output truncated (2 lines hidden), use '-vv' to show | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:655: AssertionError | |
___________________________________________________________________ test_table_html_foreign_key_custom_label_column ___________________________________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340> | |
@pytest.mark.asyncio | |
async def test_table_html_foreign_key_custom_label_column(ds_client): | |
response = await ds_client.get("/fixtures/custom_foreign_key_label") | |
assert response.status_code == 200 | |
table = Soup(response.text, "html.parser").find("table") | |
expected = [ | |
[ | |
'<td class="col-pk type-pk"><a href="/fixtures/custom_foreign_key_label/1">1</a></td>', | |
'<td class="col-foreign_key_with_custom_label type-str"><a href="/fixtures/primary_key_multiple_columns_explicit_label/1">world2</a>\xa0<em>1</em></td>', | |
] | |
] | |
> assert expected == [ | |
[str(td) for td in tr.select("td")] for tr in table.select("tbody tr") | |
] | |
E assert [['<td class=...1</em></td>']] == [['<td class=...str">1</td>']] | |
E At index 0 diff: ['<td class="col-pk type-pk"><a href="/fixtures/custom_foreign_key_label/1">1</a></td>', '<td class="col-foreign_key_with_custom_label type-str"><a href="/fixtures/primary_key_multiple_columns_explicit_label/1">world2</a>\xa0<em>1</em></td>'] != ['<td class="col-pk type-str">1</td>', '<td class="col-foreign_key_with_custom_label type-str">1</td>'] | |
E Use -v to get more diff | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:678: AssertionError | |
_______________________________________________ test_table_html_filter_form_column_options[/fixtures/infinity-expected_column_options0] _______________________________________________ | |
path = '/fixtures/infinity', expected_column_options = ['- column -', 'rowid', 'value'], ds_client = <datasette.app.DatasetteClient object at 0x1077a8340> | |
@pytest.mark.asyncio | |
@pytest.mark.parametrize( | |
"path,expected_column_options", | |
[ | |
("/fixtures/infinity", ["- column -", "rowid", "value"]), | |
( | |
"/fixtures/primary_key_multiple_columns", | |
["- column -", "id", "content", "content2"], | |
), | |
("/fixtures/compound_primary_key", ["- column -", "pk1", "pk2", "content"]), | |
], | |
) | |
async def test_table_html_filter_form_column_options( | |
path, expected_column_options, ds_client | |
): | |
response = await ds_client.get(path) | |
assert response.status_code == 200 | |
form = Soup(response.text, "html.parser").find("form") | |
column_options = [ | |
o.attrs.get("value") or o.string | |
for o in form.select("select[name=_filter_column] option") | |
] | |
> assert expected_column_options == column_options | |
E AssertionError: assert ['- column -'...wid', 'value'] == ['- column -'] | |
E Left contains 2 more items, first extra item: 'rowid' | |
E Use -v to get more diff | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:705: AssertionError | |
_____________________________________ test_table_html_filter_form_column_options[/fixtures/primary_key_multiple_columns-expected_column_options1] _____________________________________ | |
path = '/fixtures/primary_key_multiple_columns', expected_column_options = ['- column -', 'id', 'content', 'content2'] | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340> | |
@pytest.mark.asyncio | |
@pytest.mark.parametrize( | |
"path,expected_column_options", | |
[ | |
("/fixtures/infinity", ["- column -", "rowid", "value"]), | |
( | |
"/fixtures/primary_key_multiple_columns", | |
["- column -", "id", "content", "content2"], | |
), | |
("/fixtures/compound_primary_key", ["- column -", "pk1", "pk2", "content"]), | |
], | |
) | |
async def test_table_html_filter_form_column_options( | |
path, expected_column_options, ds_client | |
): | |
response = await ds_client.get(path) | |
assert response.status_code == 200 | |
form = Soup(response.text, "html.parser").find("form") | |
column_options = [ | |
o.attrs.get("value") or o.string | |
for o in form.select("select[name=_filter_column] option") | |
] | |
> assert expected_column_options == column_options | |
E AssertionError: assert ['- column -'...', 'content2'] == ['- column -'] | |
E Left contains 3 more items, first extra item: 'id' | |
E Use -v to get more diff | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:705: AssertionError | |
_________________________________________ test_table_html_filter_form_column_options[/fixtures/compound_primary_key-expected_column_options2] _________________________________________ | |
path = '/fixtures/compound_primary_key', expected_column_options = ['- column -', 'pk1', 'pk2', 'content'], ds_client = <datasette.app.DatasetteClient object at 0x1077a8340> | |
@pytest.mark.asyncio | |
@pytest.mark.parametrize( | |
"path,expected_column_options", | |
[ | |
("/fixtures/infinity", ["- column -", "rowid", "value"]), | |
( | |
"/fixtures/primary_key_multiple_columns", | |
["- column -", "id", "content", "content2"], | |
), | |
("/fixtures/compound_primary_key", ["- column -", "pk1", "pk2", "content"]), | |
], | |
) | |
async def test_table_html_filter_form_column_options( | |
path, expected_column_options, ds_client | |
): | |
response = await ds_client.get(path) | |
assert response.status_code == 200 | |
form = Soup(response.text, "html.parser").find("form") | |
column_options = [ | |
o.attrs.get("value") or o.string | |
for o in form.select("select[name=_filter_column] option") | |
] | |
> assert expected_column_options == column_options | |
E AssertionError: assert ['- column -'...2', 'content'] == ['- column -'] | |
E Left contains 3 more items, first extra item: 'pk1' | |
E Use -v to get more diff | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:705: AssertionError | |
________________________________________________________________ test_table_html_filter_form_still_shows_nocol_columns ________________________________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340> | |
@pytest.mark.asyncio | |
async def test_table_html_filter_form_still_shows_nocol_columns(ds_client): | |
# https://github.com/simonw/datasette/issues/1503 | |
response = await ds_client.get("/fixtures/sortable?_nocol=sortable") | |
assert response.status_code == 200 | |
form = Soup(response.text, "html.parser").find("form") | |
> assert [ | |
o.string | |
for o in form.select("select[name='_filter_column']")[0].select("option") | |
] == [ | |
"- column -", | |
"pk1", | |
"pk2", | |
"content", | |
"sortable_with_nulls", | |
"sortable_with_nulls_2", | |
"text", | |
# Moved to the end because it is no longer returned by the query: | |
"sortable", | |
] | |
E AssertionError: assert ['- column -'] == ['- column -'...nulls_2', ...] | |
E Right contains 7 more items, first extra item: 'pk1' | |
E Use -v to get more diff | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:714: AssertionError | |
________________________________________________________________ test_compound_primary_key_with_foreign_key_references ________________________________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340> | |
@pytest.mark.asyncio | |
async def test_compound_primary_key_with_foreign_key_references(ds_client): | |
# e.g. a many-to-many table with a compound primary key on the two columns | |
response = await ds_client.get("/fixtures/searchable_tags") | |
assert response.status_code == 200 | |
table = Soup(response.text, "html.parser").find("table") | |
expected = [ | |
[ | |
'<td class="col-Link type-pk"><a href="/fixtures/searchable_tags/1,feline">1,feline</a></td>', | |
'<td class="col-searchable_id type-int"><a href="/fixtures/searchable/1">1</a>\xa0<em>1</em></td>', | |
'<td class="col-tag type-str"><a href="/fixtures/tags/feline">feline</a></td>', | |
], | |
[ | |
'<td class="col-Link type-pk"><a href="/fixtures/searchable_tags/2,canine">2,canine</a></td>', | |
'<td class="col-searchable_id type-int"><a href="/fixtures/searchable/2">2</a>\xa0<em>2</em></td>', | |
'<td class="col-tag type-str"><a href="/fixtures/tags/canine">canine</a></td>', | |
], | |
] | |
> assert expected == [ | |
[str(td) for td in tr.select("td")] for tr in table.select("tbody tr") | |
] | |
E assert [['<td class=...ne</a></td>']] == [['<td class=...canine</td>']] | |
E At index 0 diff: ['<td class="col-Link type-pk"><a href="/fixtures/searchable_tags/1,feline">1,feline</a></td>', '<td class="col-searchable_id type-int"><a href="/fixtures/searchable/1">1</a>\xa0<em>1</em></td>', '<td class="col-tag type-str"><a href="/fixtures/tags/feline">feline</a></td>'] != ['<td class="col-searchable_id type-int">1</td>', '<td class="col-tag type-str">feline</td>'] | |
E Use -v to get more diff | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:748: AssertionError | |
___________________________________________________________________________________ test_view_html ____________________________________________________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340> | |
@pytest.mark.asyncio | |
async def test_view_html(ds_client): | |
response = await ds_client.get("/fixtures/simple_view?_size=3") | |
assert response.status_code == 200 | |
table = Soup(response.text, "html.parser").find("table") | |
ths = table.select("thead th") | |
assert 2 == len(ths) | |
> assert ths[0].find("a") is not None | |
E assert None is not None | |
E + where None = <bound method Tag.find of <th class="col-content" data-column="content" data-column-not-null="0" data-column-type="tex..."col">\n \n content\n \n </th>>('a') | |
E + where <bound method Tag.find of <th class="col-content" data-column="content" data-column-not-null="0" data-column-type="tex..."col">\n \n content\n \n </th>> = <th class="col-content" data-column="content" data-column-not-null="0" data-column-type="text" data-is-pk="0" scope="col">\n \n content\n \n </th>.find | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:760: AssertionError | |
______________________________________________________ test_advanced_export_box[/fixtures/complex_foreign_keys-True-False-True] _______________________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340>, path = '/fixtures/complex_foreign_keys', has_object = True, has_stream = False, has_expand = True | |
@pytest.mark.asyncio | |
@pytest.mark.parametrize( | |
"path,has_object,has_stream,has_expand", | |
[ | |
("/fixtures/no_primary_key", False, True, False), | |
("/fixtures/complex_foreign_keys", True, False, True), | |
], | |
) | |
async def test_advanced_export_box(ds_client, path, has_object, has_stream, has_expand): | |
response = await ds_client.get(path) | |
assert response.status_code == 200 | |
soup = Soup(response.text, "html.parser") | |
# JSON shape options | |
expected_json_shapes = ["default", "array", "newline-delimited"] | |
if has_object: | |
expected_json_shapes.append("object") | |
div = soup.find("div", {"class": "advanced-export"}) | |
> assert expected_json_shapes == [a.text for a in div.find("p").findAll("a")] | |
E AssertionError: assert ['default', '...ed', 'object'] == ['default', '...ne-delimited'] | |
E Left contains one more item: 'object' | |
E Use -v to get more diff | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:816: AssertionError | |
______________________________________________________________________________ test_extra_where_clauses _______________________________________________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340> | |
@pytest.mark.asyncio | |
async def test_extra_where_clauses(ds_client): | |
response = await ds_client.get( | |
"/fixtures/facetable?_where=_neighborhood='Dogpatch'&_where=_city_id=1" | |
) | |
soup = Soup(response.text, "html.parser") | |
> div = soup.select(".extra-wheres")[0] | |
E IndexError: list index out of range | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:831: IndexError | |
____________________________________________________ test_other_hidden_form_fields[/fixtures/facetable?_size=10-expected_hidden0] _____________________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340>, path = '/fixtures/facetable?_size=10', expected_hidden = [('_size', '10')] | |
@pytest.mark.asyncio | |
@pytest.mark.parametrize( | |
"path,expected_hidden", | |
[ | |
("/fixtures/facetable?_size=10", [("_size", "10")]), | |
( | |
"/fixtures/facetable?_size=10&_ignore=1&_ignore=2", | |
[ | |
("_size", "10"), | |
("_ignore", "1"), | |
("_ignore", "2"), | |
], | |
), | |
], | |
) | |
async def test_other_hidden_form_fields(ds_client, path, expected_hidden): | |
response = await ds_client.get(path) | |
soup = Soup(response.text, "html.parser") | |
inputs = soup.find("form").findAll("input") | |
hiddens = [i for i in inputs if i["type"] == "hidden"] | |
> assert [(hidden["name"], hidden["value"]) for hidden in hiddens] == expected_hidden | |
E AssertionError: assert [] == [('_size', '10')] | |
E Right contains one more item: ('_size', '10') | |
E Use -v to get more diff | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:866: AssertionError | |
__________________________________________ test_other_hidden_form_fields[/fixtures/facetable?_size=10&_ignore=1&_ignore=2-expected_hidden1] ___________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340>, path = '/fixtures/facetable?_size=10&_ignore=1&_ignore=2' | |
expected_hidden = [('_size', '10'), ('_ignore', '1'), ('_ignore', '2')] | |
@pytest.mark.asyncio | |
@pytest.mark.parametrize( | |
"path,expected_hidden", | |
[ | |
("/fixtures/facetable?_size=10", [("_size", "10")]), | |
( | |
"/fixtures/facetable?_size=10&_ignore=1&_ignore=2", | |
[ | |
("_size", "10"), | |
("_ignore", "1"), | |
("_ignore", "2"), | |
], | |
), | |
], | |
) | |
async def test_other_hidden_form_fields(ds_client, path, expected_hidden): | |
response = await ds_client.get(path) | |
soup = Soup(response.text, "html.parser") | |
inputs = soup.find("form").findAll("input") | |
hiddens = [i for i in inputs if i["type"] == "hidden"] | |
> assert [(hidden["name"], hidden["value"]) for hidden in hiddens] == expected_hidden | |
E AssertionError: assert [] == [('_size', '1...ignore', '2')] | |
E Right contains 3 more items, first extra item: ('_size', '10') | |
E Use -v to get more diff | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:866: AssertionError | |
_______________________________________ test_search_and_sort_fields_not_duplicated[/fixtures/searchable?_sort=text2&_where=1-expected_hidden3] ________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340>, path = '/fixtures/searchable?_sort=text2&_where=1', expected_hidden = [('_where', '1')] | |
@pytest.mark.asyncio | |
@pytest.mark.parametrize( | |
"path,expected_hidden", | |
[ | |
("/fixtures/searchable?_search=terry", []), | |
("/fixtures/searchable?_sort=text2", []), | |
("/fixtures/searchable?_sort_desc=text2", []), | |
("/fixtures/searchable?_sort=text2&_where=1", [("_where", "1")]), | |
], | |
) | |
async def test_search_and_sort_fields_not_duplicated(ds_client, path, expected_hidden): | |
# https://github.com/simonw/datasette/issues/1214 | |
response = await ds_client.get(path) | |
soup = Soup(response.text, "html.parser") | |
inputs = soup.find("form").findAll("input") | |
hiddens = [i for i in inputs if i["type"] == "hidden"] | |
> assert [(hidden["name"], hidden["value"]) for hidden in hiddens] == expected_hidden | |
E AssertionError: assert [] == [('_where', '1')] | |
E Right contains one more item: ('_where', '1') | |
E Use -v to get more diff | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:885: AssertionError | |
__________________________________________________________________________ test_binary_data_display_in_table __________________________________________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340> | |
@pytest.mark.asyncio | |
async def test_binary_data_display_in_table(ds_client): | |
response = await ds_client.get("/fixtures/binary_data") | |
assert response.status_code == 200 | |
table = Soup(response.text, "html.parser").find("table") | |
expected_tds = [ | |
[ | |
'<td class="col-Link type-pk"><a href="/fixtures/binary_data/1">1</a></td>', | |
'<td class="col-rowid type-int">1</td>', | |
'<td class="col-data type-bytes"><a class="blob-download" href="/fixtures/binary_data/1.blob?_blob_column=data"><Binary:\xa07\xa0bytes></a></td>', | |
], | |
[ | |
'<td class="col-Link type-pk"><a href="/fixtures/binary_data/2">2</a></td>', | |
'<td class="col-rowid type-int">2</td>', | |
'<td class="col-data type-bytes"><a class="blob-download" href="/fixtures/binary_data/2.blob?_blob_column=data"><Binary:\xa07\xa0bytes></a></td>', | |
], | |
[ | |
'<td class="col-Link type-pk"><a href="/fixtures/binary_data/3">3</a></td>', | |
'<td class="col-rowid type-int">3</td>', | |
'<td class="col-data type-none">\xa0</td>', | |
], | |
] | |
> assert expected_tds == [ | |
[str(td) for td in tr.select("td")] for tr in table.select("tbody tr") | |
] | |
E assert [['<td class=...">\xa0</td>']] == [['<td class=...">\xa0</td>']] | |
E At index 0 diff: ['<td class="col-Link type-pk"><a href="/fixtures/binary_data/1">1</a></td>', '<td class="col-rowid type-int">1</td>', '<td class="col-data type-bytes"><a class="blob-download" href="/fixtures/binary_data/1.blob?_blob_column=data"><Binary:\xa07\xa0bytes></a></td>'] != ['<td class="col-rowid type-int">1</td>', '<td class="col-data type-bytes"><a class="blob-download" href="/fixtures/binary_data/1.blob?_blob_column=data"><Binary:\xa07\xa0bytes></a></td>'] | |
E Use -v to get more diff | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:910: AssertionError | |
______________________________________________________________________________ test_custom_table_include ______________________________________________________________________________ | |
def test_custom_table_include(): | |
with make_app_client( | |
template_dir=str(pathlib.Path(__file__).parent / "test_templates") | |
) as client: | |
response = client.get("/fixtures/complex_foreign_keys") | |
assert response.status == 200 | |
> assert ( | |
'<div class="custom-table-row">' | |
'1 - 2 - <a href="/fixtures/simple_primary_key/1">hello</a> <em>1</em>' | |
"</div>" | |
) == str(Soup(response.text, "html.parser").select_one("div.custom-table-row")) | |
E assert '<div class="...>1</em></div>' == '<div class="...- 2 - 1</div>' | |
E - <div class="custom-table-row">1 - 2 - 1</div> | |
E + <div class="custom-table-row">1 - 2 - <a href="/fixtures/simple_primary_key/1">hello</a> <em>1</em></div> | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:921: AssertionError | |
_________________________________________________________________________________ test_metadata_sort __________________________________________________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340> | |
@pytest.mark.asyncio | |
async def test_metadata_sort(ds_client): | |
response = await ds_client.get("/fixtures/facet_cities") | |
assert response.status_code == 200 | |
table = Soup(response.text, "html.parser").find("table") | |
assert table["class"] == ["rows-and-columns"] | |
ths = table.findAll("th") | |
> assert ["id", "name\xa0▼"] == [th.find("a").string.strip() for th in ths] | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:966: | |
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
.0 = <list_iterator object at 0x1079983a0> | |
> assert ["id", "name\xa0▼"] == [th.find("a").string.strip() for th in ths] | |
E AttributeError: 'NoneType' object has no attribute 'string' | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:966: AttributeError | |
_______________________________________________________________________________ test_metadata_sort_desc _______________________________________________________________________________ | |
ds_client = <datasette.app.DatasetteClient object at 0x1077a8340> | |
@pytest.mark.asyncio | |
async def test_metadata_sort_desc(ds_client): | |
response = await ds_client.get("/fixtures/attraction_characteristic") | |
assert response.status_code == 200 | |
table = Soup(response.text, "html.parser").find("table") | |
assert table["class"] == ["rows-and-columns"] | |
ths = table.findAll("th") | |
> assert ["pk\xa0▲", "name"] == [th.find("a").string.strip() for th in ths] | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:1002: | |
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
.0 = <list_iterator object at 0x1078f2530> | |
> assert ["pk\xa0▲", "name"] == [th.find("a").string.strip() for th in ths] | |
E AttributeError: 'NoneType' object has no attribute 'string' | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:1002: AttributeError | |
__________________________ test_facet_more_links[5-/fixtures/facetable?_facet=_neighborhood-2-True-/fixtures/facetable?_facet=_neighborhood&_facet_size=max] __________________________ | |
max_returned_rows = 5, path = '/fixtures/facetable?_facet=_neighborhood', expected_num_facets = 2, expected_ellipses = True | |
expected_ellipses_url = '/fixtures/facetable?_facet=_neighborhood&_facet_size=max' | |
@pytest.mark.parametrize( | |
"max_returned_rows,path,expected_num_facets,expected_ellipses,expected_ellipses_url", | |
( | |
( | |
5, | |
# Default should show 2 facets | |
"/fixtures/facetable?_facet=_neighborhood", | |
2, | |
True, | |
"/fixtures/facetable?_facet=_neighborhood&_facet_size=max", | |
), | |
# _facet_size above max_returned_rows should show max_returned_rows (5) | |
( | |
5, | |
"/fixtures/facetable?_facet=_neighborhood&_facet_size=50", | |
5, | |
True, | |
"/fixtures/facetable?_facet=_neighborhood&_facet_size=max", | |
), | |
# If max_returned_rows is high enough, should return all | |
( | |
20, | |
"/fixtures/facetable?_facet=_neighborhood&_facet_size=max", | |
14, | |
False, | |
None, | |
), | |
# If num facets > max_returned_rows, show ... without a link | |
# _facet_size above max_returned_rows should show max_returned_rows (5) | |
( | |
5, | |
"/fixtures/facetable?_facet=_neighborhood&_facet_size=max", | |
5, | |
True, | |
None, | |
), | |
), | |
) | |
def test_facet_more_links( | |
max_returned_rows, | |
path, | |
expected_num_facets, | |
expected_ellipses, | |
expected_ellipses_url, | |
): | |
with make_app_client( | |
settings={"max_returned_rows": max_returned_rows, "default_facet_size": 2} | |
) as client: | |
response = client.get(path) | |
soup = Soup(response.body, "html.parser") | |
lis = soup.select("#facet-neighborhood-b352a7 ul li:not(.facet-truncated)") | |
facet_truncated = soup.select_one(".facet-truncated") | |
> assert len(lis) == expected_num_facets | |
E assert 0 == 2 | |
E + where 0 = len([]) | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:1075: AssertionError | |
-------------------------------------------------------------------------------- Captured stderr call --------------------------------------------------------------------------------- | |
Traceback (most recent call last): | |
File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 1527, in route_path | |
response = await view(request, send) | |
File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 1673, in async_view_fn | |
response = await async_call_with_supported_arguments( | |
File "/Users/simon/Dropbox/Development/datasette/datasette/utils/__init__.py", line 1005, in async_call_with_supported_arguments | |
return await fn(*call_with) | |
File "/Users/simon/Dropbox/Development/datasette/datasette/views/table.py", line 1487, in table_view | |
return await table_view_traced(datasette, request) | |
File "/Users/simon/Dropbox/Development/datasette/datasette/views/table.py", line 1517, in table_view_traced | |
await datasette.render_template( | |
File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 1206, in render_template | |
return await template.render_async(template_context) | |
File "/Users/simon/.local/share/virtualenvs/datasette-AWNrQs95/lib/python3.10/site-packages/jinja2/environment.py", line 1324, in render_async | |
return self.environment.handle_exception() | |
File "/Users/simon/.local/share/virtualenvs/datasette-AWNrQs95/lib/python3.10/site-packages/jinja2/environment.py", line 936, in handle_exception | |
raise rewrite_traceback_stack(source=source) | |
File "/Users/simon/.local/share/virtualenvs/datasette-AWNrQs95/lib/python3.10/site-packages/jinja2/environment.py", line 1321, in <listcomp> | |
[n async for n in self.root_render_func(ctx)] # type: ignore | |
File "/Users/simon/Dropbox/Development/datasette/datasette/templates/table.html", line 1, in top-level template code | |
{% extends "base.html" %} | |
File "/Users/simon/Dropbox/Development/datasette/datasette/templates/base.html", line 60, in top-level template code | |
{% block content %} | |
File "/Users/simon/Dropbox/Development/datasette/datasette/templates/table.html", line 149, in block 'content' | |
{% include "_facet_results.html" %} | |
File "/Users/simon/Dropbox/Development/datasette/datasette/templates/_facet_results.html", line 22, in top-level template code | |
<a href="{{ path_with_replaced_args(request, {"_facet_size": "max"}) }}">…</a>{% else -%}…{% endif %} | |
File "/Users/simon/.local/share/virtualenvs/datasette-AWNrQs95/lib/python3.10/site-packages/jinja2/utils.py", line 83, in from_obj | |
if hasattr(obj, "jinja_pass_arg"): | |
jinja2.exceptions.UndefinedError: 'path_with_replaced_args' is undefined | |
__________________ test_facet_more_links[5-/fixtures/facetable?_facet=_neighborhood&_facet_size=50-5-True-/fixtures/facetable?_facet=_neighborhood&_facet_size=max] ___________________ | |
max_returned_rows = 5, path = '/fixtures/facetable?_facet=_neighborhood&_facet_size=50', expected_num_facets = 5, expected_ellipses = True | |
expected_ellipses_url = '/fixtures/facetable?_facet=_neighborhood&_facet_size=max' | |
@pytest.mark.parametrize( | |
"max_returned_rows,path,expected_num_facets,expected_ellipses,expected_ellipses_url", | |
( | |
( | |
5, | |
# Default should show 2 facets | |
"/fixtures/facetable?_facet=_neighborhood", | |
2, | |
True, | |
"/fixtures/facetable?_facet=_neighborhood&_facet_size=max", | |
), | |
# _facet_size above max_returned_rows should show max_returned_rows (5) | |
( | |
5, | |
"/fixtures/facetable?_facet=_neighborhood&_facet_size=50", | |
5, | |
True, | |
"/fixtures/facetable?_facet=_neighborhood&_facet_size=max", | |
), | |
# If max_returned_rows is high enough, should return all | |
( | |
20, | |
"/fixtures/facetable?_facet=_neighborhood&_facet_size=max", | |
14, | |
False, | |
None, | |
), | |
# If num facets > max_returned_rows, show ... without a link | |
# _facet_size above max_returned_rows should show max_returned_rows (5) | |
( | |
5, | |
"/fixtures/facetable?_facet=_neighborhood&_facet_size=max", | |
5, | |
True, | |
None, | |
), | |
), | |
) | |
def test_facet_more_links( | |
max_returned_rows, | |
path, | |
expected_num_facets, | |
expected_ellipses, | |
expected_ellipses_url, | |
): | |
with make_app_client( | |
settings={"max_returned_rows": max_returned_rows, "default_facet_size": 2} | |
) as client: | |
response = client.get(path) | |
soup = Soup(response.body, "html.parser") | |
lis = soup.select("#facet-neighborhood-b352a7 ul li:not(.facet-truncated)") | |
facet_truncated = soup.select_one(".facet-truncated") | |
> assert len(lis) == expected_num_facets | |
E assert 0 == 5 | |
E + where 0 = len([]) | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:1075: AssertionError | |
-------------------------------------------------------------------------------- Captured stderr call --------------------------------------------------------------------------------- | |
Traceback (most recent call last): | |
File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 1527, in route_path | |
response = await view(request, send) | |
File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 1673, in async_view_fn | |
response = await async_call_with_supported_arguments( | |
File "/Users/simon/Dropbox/Development/datasette/datasette/utils/__init__.py", line 1005, in async_call_with_supported_arguments | |
return await fn(*call_with) | |
File "/Users/simon/Dropbox/Development/datasette/datasette/views/table.py", line 1487, in table_view | |
return await table_view_traced(datasette, request) | |
File "/Users/simon/Dropbox/Development/datasette/datasette/views/table.py", line 1517, in table_view_traced | |
await datasette.render_template( | |
File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 1206, in render_template | |
return await template.render_async(template_context) | |
File "/Users/simon/.local/share/virtualenvs/datasette-AWNrQs95/lib/python3.10/site-packages/jinja2/environment.py", line 1324, in render_async | |
return self.environment.handle_exception() | |
File "/Users/simon/.local/share/virtualenvs/datasette-AWNrQs95/lib/python3.10/site-packages/jinja2/environment.py", line 936, in handle_exception | |
raise rewrite_traceback_stack(source=source) | |
File "/Users/simon/.local/share/virtualenvs/datasette-AWNrQs95/lib/python3.10/site-packages/jinja2/environment.py", line 1321, in <listcomp> | |
[n async for n in self.root_render_func(ctx)] # type: ignore | |
File "/Users/simon/Dropbox/Development/datasette/datasette/templates/table.html", line 1, in top-level template code | |
{% extends "base.html" %} | |
File "/Users/simon/Dropbox/Development/datasette/datasette/templates/base.html", line 60, in top-level template code | |
{% block content %} | |
File "/Users/simon/Dropbox/Development/datasette/datasette/templates/table.html", line 149, in block 'content' | |
{% include "_facet_results.html" %} | |
File "/Users/simon/Dropbox/Development/datasette/datasette/templates/_facet_results.html", line 22, in top-level template code | |
<a href="{{ path_with_replaced_args(request, {"_facet_size": "max"}) }}">…</a>{% else -%}…{% endif %} | |
File "/Users/simon/.local/share/virtualenvs/datasette-AWNrQs95/lib/python3.10/site-packages/jinja2/utils.py", line 83, in from_obj | |
if hasattr(obj, "jinja_pass_arg"): | |
jinja2.exceptions.UndefinedError: 'path_with_replaced_args' is undefined | |
__________________________________________________________________________________ test_facet_total ___________________________________________________________________________________ | |
def test_facet_total(): | |
# https://github.com/simonw/datasette/issues/1423 | |
# https://github.com/simonw/datasette/issues/1556 | |
with make_app_client(settings={"max_returned_rows": 100}) as client: | |
path = "/fixtures/sortable?_facet=content&_facet=pk1" | |
response = client.get(path) | |
> assert response.status == 200 | |
E assert 500 == 200 | |
E + where 500 = <datasette.utils.testing.TestResponse object at 0x11072c550>.status | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:1123: AssertionError | |
-------------------------------------------------------------------------------- Captured stderr call --------------------------------------------------------------------------------- | |
Traceback (most recent call last): | |
File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 1527, in route_path | |
response = await view(request, send) | |
File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 1673, in async_view_fn | |
response = await async_call_with_supported_arguments( | |
File "/Users/simon/Dropbox/Development/datasette/datasette/utils/__init__.py", line 1005, in async_call_with_supported_arguments | |
return await fn(*call_with) | |
File "/Users/simon/Dropbox/Development/datasette/datasette/views/table.py", line 1487, in table_view | |
return await table_view_traced(datasette, request) | |
File "/Users/simon/Dropbox/Development/datasette/datasette/views/table.py", line 1517, in table_view_traced | |
await datasette.render_template( | |
File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 1206, in render_template | |
return await template.render_async(template_context) | |
File "/Users/simon/.local/share/virtualenvs/datasette-AWNrQs95/lib/python3.10/site-packages/jinja2/environment.py", line 1324, in render_async | |
return self.environment.handle_exception() | |
File "/Users/simon/.local/share/virtualenvs/datasette-AWNrQs95/lib/python3.10/site-packages/jinja2/environment.py", line 936, in handle_exception | |
raise rewrite_traceback_stack(source=source) | |
File "/Users/simon/.local/share/virtualenvs/datasette-AWNrQs95/lib/python3.10/site-packages/jinja2/environment.py", line 1321, in <listcomp> | |
[n async for n in self.root_render_func(ctx)] # type: ignore | |
File "/Users/simon/Dropbox/Development/datasette/datasette/templates/table.html", line 1, in top-level template code | |
{% extends "base.html" %} | |
File "/Users/simon/Dropbox/Development/datasette/datasette/templates/base.html", line 60, in top-level template code | |
{% block content %} | |
File "/Users/simon/Dropbox/Development/datasette/datasette/templates/table.html", line 149, in block 'content' | |
{% include "_facet_results.html" %} | |
File "/Users/simon/Dropbox/Development/datasette/datasette/templates/_facet_results.html", line 22, in top-level template code | |
<a href="{{ path_with_replaced_args(request, {"_facet_size": "max"}) }}">…</a>{% else -%}…{% endif %} | |
File "/Users/simon/.local/share/virtualenvs/datasette-AWNrQs95/lib/python3.10/site-packages/jinja2/utils.py", line 83, in from_obj | |
if hasattr(obj, "jinja_pass_arg"): | |
jinja2.exceptions.UndefinedError: 'path_with_replaced_args' is undefined | |
_____________________________________________________________________________ test_allow_facet_off[True] ______________________________________________________________________________ | |
allow_facet = True | |
@pytest.mark.parametrize("allow_facet", (True, False)) | |
def test_allow_facet_off(allow_facet): | |
with make_app_client(settings={"allow_facet": allow_facet}) as client: | |
response = client.get("/fixtures/facetable") | |
expected = "DATASETTE_ALLOW_FACET = {};".format( | |
"true" if allow_facet else "false" | |
) | |
> assert expected in response.text | |
E assert 'DATASETTE_ALLOW_FACET = true;' in '<!DOCTYPE html>\n<html>\n<head>\n <title>fixtures: facetable: 15 rows</title>\n <link rel="stylesheet" href="/-...name": "table", "request_path": "/fixtures/facetable", "added": 15, "columns": null};</script>\n\n\n\n</body>\n</html>' | |
E + where '<!DOCTYPE html>\n<html>\n<head>\n <title>fixtures: facetable: 15 rows</title>\n <link rel="stylesheet" href="/-...name": "table", "request_path": "/fixtures/facetable", "added": 15, "columns": null};</script>\n\n\n\n</body>\n</html>' = <datasette.utils.testing.TestResponse object at 0x10759e5c0>.text | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:1170: AssertionError | |
_____________________________________________________________________________ test_allow_facet_off[False] _____________________________________________________________________________ | |
allow_facet = False | |
@pytest.mark.parametrize("allow_facet", (True, False)) | |
def test_allow_facet_off(allow_facet): | |
with make_app_client(settings={"allow_facet": allow_facet}) as client: | |
response = client.get("/fixtures/facetable") | |
expected = "DATASETTE_ALLOW_FACET = {};".format( | |
"true" if allow_facet else "false" | |
) | |
> assert expected in response.text | |
E assert 'DATASETTE_ALLOW_FACET = false;' in '<!DOCTYPE html>\n<html>\n<head>\n <title>fixtures: facetable: 15 rows</title>\n <link rel="stylesheet" href="/-...name": "table", "request_path": "/fixtures/facetable", "added": 15, "columns": null};</script>\n\n\n\n</body>\n</html>' | |
E + where '<!DOCTYPE html>\n<html>\n<head>\n <title>fixtures: facetable: 15 rows</title>\n <link rel="stylesheet" href="/-...name": "table", "request_path": "/fixtures/facetable", "added": 15, "columns": null};</script>\n\n\n\n</body>\n</html>' = <datasette.utils.testing.TestResponse object at 0x1104761d0>.text | |
/Users/simon/Dropbox/Development/datasette/tests/test_table_html.py:1170: AssertionError | |
=============================================================================== short test summary info =============================================================================== | |
FAILED tests/test_table_html.py::test_table_definition_sql[/fixtures/facet_cities-CREATE TABLE facet_cities (\n id integer primary key,\n name text\n);] - AttributeError: 'NoneType' object has no attribute 'string' | |
FAILED tests/test_table_html.py::test_table_definition_sql[/fixtures/compound_three_primary_keys-CREATE TABLE compound_three_primary_keys (\n pk1 varchar(30),\n pk2 varchar(30),\n pk3 varchar(30),\n content text,\n PRIMARY KEY (pk1, pk2, pk3)\n);\nCREATE INDEX idx_compound_three_primary_keys_content ON compound_three_primary_keys(content);] - AttributeError: 'NoneType' object has no attribute 'string' | |
FAILED tests/test_table_html.py::test_table_cell_truncation - AssertionError: assert ['Missi…', 'D...'Hayes…', ...] == ['Mission', '... Valley', ...] | |
FAILED tests/test_table_html.py::test_add_filter_redirects - assert 500 == 302 | |
FAILED tests/test_table_html.py::test_existing_filter_redirects - assert 500 == 302 | |
FAILED tests/test_table_html.py::test_reflected_hidden_form_fields[_facet=_neighborhood-expected_hidden0] - AssertionError: assert {} == {'_facet': '_neighborhood'} | |
FAILED tests/test_table_html.py::test_reflected_hidden_form_fields[_where=1+=+1&_col=_city_id-expected_hidden1] - AssertionError: assert {} == {'_col': '_ci...ere': '1 = 1'} | |
FAILED tests/test_table_html.py::test_reflected_hidden_form_fields[_facet=_neighborhood&_neighborhood__exact=Downtown-expected_hidden2] - AssertionError: assert {} == {'_facet': '_neighborhood'} | |
FAILED tests/test_table_html.py::test_reflected_hidden_form_fields[_facet=_neighborhood&_city_id__gt=1-expected_hidden3] - AssertionError: assert {} == {'_facet': '_neighborhood'} | |
FAILED tests/test_table_html.py::test_empty_search_parameter_gets_removed - assert 500 == 302 | |
FAILED tests/test_table_html.py::test_searchable_view_persists_fts_table - AssertionError: assert [('_fts_table...ts_pk', 'pk')] == [] | |
FAILED tests/test_table_html.py::test_sort_by_desc_redirects - assert 500 == 302 | |
FAILED tests/test_table_html.py::test_sort_links - AssertionError: assert [{'a_href': N...', ...}}, ...] == [{'a_href': N...', ...}}, ...] | |
FAILED tests/test_table_html.py::test_facets_persist_through_filter_form - AssertionError: assert [] == [('_facet', '...ray', 'tags')] | |
FAILED tests/test_table_html.py::test_next_does_not_persist_in_hidden_field - AssertionError: assert [] == [('_size', '1')] | |
FAILED tests/test_table_html.py::test_table_html_simple_primary_key - AttributeError: 'NoneType' object has no attribute 'string' | |
FAILED tests/test_table_html.py::test_table_csv_json_export_interface - AssertionError: assert ['/fixtures/s...x', '#export'] == ['', '#export'] | |
FAILED tests/test_table_html.py::test_csv_json_export_links_include_labels_if_foreign_keys - AssertionError: assert ['/fixtures/f...x', '#export'] == ['', '#export'] | |
FAILED tests/test_table_html.py::test_table_html_no_primary_key - AssertionError: assert ['content', 'a', 'b', 'c'] == ['a', 'b', 'c'] | |
FAILED tests/test_table_html.py::test_rowid_sortable_no_primary_key - AttributeError: 'NoneType' object has no attribute 'string' | |
FAILED tests/test_table_html.py::test_table_html_compound_primary_key - AssertionError: assert 'Link' == 'pk1' | |
FAILED tests/test_table_html.py::test_table_html_foreign_key_links - assert [['<td class=...">\xa0</td>']] == [['<td class=...">\xa0</td>']] | |
FAILED tests/test_table_html.py::test_table_html_disable_foreign_key_links_with_labels - assert [['<td class=...str">b</td>']] == [['<td class=...str">b</td>']] | |
FAILED tests/test_table_html.py::test_table_html_foreign_key_custom_label_column - assert [['<td class=...1</em></td>']] == [['<td class=...str">1</td>']] | |
FAILED tests/test_table_html.py::test_table_html_filter_form_column_options[/fixtures/infinity-expected_column_options0] - AssertionError: assert ['- column -'...wid', 'value'] == ['- column -'] | |
FAILED tests/test_table_html.py::test_table_html_filter_form_column_options[/fixtures/primary_key_multiple_columns-expected_column_options1] - AssertionError: assert ['- column -'...', 'content2'] == ['- column -'] | |
FAILED tests/test_table_html.py::test_table_html_filter_form_column_options[/fixtures/compound_primary_key-expected_column_options2] - AssertionError: assert ['- column -'...2', 'content'] == ['- column -'] | |
FAILED tests/test_table_html.py::test_table_html_filter_form_still_shows_nocol_columns - AssertionError: assert ['- column -'] == ['- column -'...nulls_2', ...] | |
FAILED tests/test_table_html.py::test_compound_primary_key_with_foreign_key_references - assert [['<td class=...ne</a></td>']] == [['<td class=...canine</td>']] | |
FAILED tests/test_table_html.py::test_view_html - assert None is not None | |
FAILED tests/test_table_html.py::test_advanced_export_box[/fixtures/complex_foreign_keys-True-False-True] - AssertionError: assert ['default', '...ed', 'object'] == ['default', '...ne-delimited'] | |
FAILED tests/test_table_html.py::test_extra_where_clauses - IndexError: list index out of range | |
FAILED tests/test_table_html.py::test_other_hidden_form_fields[/fixtures/facetable?_size=10-expected_hidden0] - AssertionError: assert [] == [('_size', '10')] | |
FAILED tests/test_table_html.py::test_other_hidden_form_fields[/fixtures/facetable?_size=10&_ignore=1&_ignore=2-expected_hidden1] - AssertionError: assert [] == [('_size', '1...ignore', '2')] | |
FAILED tests/test_table_html.py::test_search_and_sort_fields_not_duplicated[/fixtures/searchable?_sort=text2&_where=1-expected_hidden3] - AssertionError: assert [] == [('_where', '1')] | |
FAILED tests/test_table_html.py::test_binary_data_display_in_table - assert [['<td class=...">\xa0</td>']] == [['<td class=...">\xa0</td>']] | |
FAILED tests/test_table_html.py::test_custom_table_include - assert '<div class="...>1</em></div>' == '<div class="...- 2 - 1</div>' | |
FAILED tests/test_table_html.py::test_metadata_sort - AttributeError: 'NoneType' object has no attribute 'string' | |
FAILED tests/test_table_html.py::test_metadata_sort_desc - AttributeError: 'NoneType' object has no attribute 'string' | |
FAILED tests/test_table_html.py::test_facet_more_links[5-/fixtures/facetable?_facet=_neighborhood-2-True-/fixtures/facetable?_facet=_neighborhood&_facet_size=max] - assert 0 == 2 | |
FAILED tests/test_table_html.py::test_facet_more_links[5-/fixtures/facetable?_facet=_neighborhood&_facet_size=50-5-True-/fixtures/facetable?_facet=_neighborhood&_facet_size=max] - assert 0 == 5 | |
FAILED tests/test_table_html.py::test_facet_total - assert 500 == 200 | |
FAILED tests/test_table_html.py::test_allow_facet_off[True] - assert 'DATASETTE_ALLOW_FACET = true;' in '<!DOCTYPE html>\n<html>\n<head>\n <title>fixtures: facetable: 15 rows</title>\n <link rel="stylesheet" href="/-...name": "table",... | |
FAILED tests/test_table_html.py::test_allow_facet_off[False] - assert 'DATASETTE_ALLOW_FACET = false;' in '<!DOCTYPE html>\n<html>\n<head>\n <title>fixtures: facetable: 15 rows</title>\n <link rel="stylesheet" href="/-...name": "table"... | |
============================================================================ 44 failed, 24 passed in 7.34s ============================================================================ | |
(datasette) simon@Simons-MacBook-Pro datasette % |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment