Skip to content

Instantly share code, notes, and snippets.

@simonw
Created March 9, 2023 00:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save simonw/df0a52cd7d820b776dc3dfc50e7cb778 to your computer and use it in GitHub Desktop.
Save simonw/df0a52cd7d820b776dc3dfc50e7cb778 to your computer and use it in GitHub Desktop.
(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">&lt;Binary:\xa07\xa0bytes&gt;</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">&lt;Binary:\xa07\xa0bytes&gt;</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">&lt;Binary:\xa07\xa0bytes&gt;</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">&lt;Binary:\xa07\xa0bytes&gt;</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