kopia lustrzana https://github.com/simonw/datasette
88 wiersze
2.7 KiB
Python
88 wiersze
2.7 KiB
Python
from bs4 import BeautifulSoup as Soup
|
|
from .fixtures import ( # noqa
|
|
app_client,
|
|
)
|
|
import pytest
|
|
import urllib
|
|
|
|
|
|
def test_plugins_dir_plugin(app_client):
|
|
response = app_client.get(
|
|
"/fixtures.json?sql=select+convert_units(100%2C+'m'%2C+'ft')"
|
|
)
|
|
assert pytest.approx(328.0839) == response.json['rows'][0][0]
|
|
|
|
|
|
def test_plugin_extra_css_urls(app_client):
|
|
response = app_client.get('/')
|
|
links = Soup(response.body, 'html.parser').findAll('link')
|
|
assert [
|
|
l for l in links
|
|
if l.attrs == {
|
|
'rel': ['stylesheet'],
|
|
'href': 'https://example.com/app.css'
|
|
}
|
|
]
|
|
|
|
|
|
def test_plugin_extra_js_urls(app_client):
|
|
response = app_client.get('/')
|
|
scripts = Soup(response.body, 'html.parser').findAll('script')
|
|
assert [
|
|
s for s in scripts
|
|
if s.attrs == {
|
|
'integrity': 'SRIHASH',
|
|
'crossorigin': 'anonymous',
|
|
'src': 'https://example.com/jquery.js'
|
|
}
|
|
]
|
|
|
|
|
|
def test_plugins_with_duplicate_js_urls(app_client):
|
|
# If two plugins both require jQuery, jQuery should be loaded only once
|
|
response = app_client.get(
|
|
"/fixtures"
|
|
)
|
|
# This test is a little tricky, as if the user has any other plugins in
|
|
# their current virtual environment those may affect what comes back too.
|
|
# What matters is that https://example.com/jquery.js is only there once
|
|
# and it comes before plugin1.js and plugin2.js which could be in either
|
|
# order
|
|
scripts = Soup(response.body, 'html.parser').findAll('script')
|
|
srcs = [s['src'] for s in scripts if s.get('src')]
|
|
# No duplicates allowed:
|
|
assert len(srcs) == len(set(srcs))
|
|
# jquery.js loaded once:
|
|
assert 1 == srcs.count('https://example.com/jquery.js')
|
|
# plugin1.js and plugin2.js are both there:
|
|
assert 1 == srcs.count('https://example.com/plugin1.js')
|
|
assert 1 == srcs.count('https://example.com/plugin2.js')
|
|
# jquery comes before them both
|
|
assert srcs.index(
|
|
'https://example.com/jquery.js'
|
|
) < srcs.index(
|
|
'https://example.com/plugin1.js'
|
|
)
|
|
assert srcs.index(
|
|
'https://example.com/jquery.js'
|
|
) < srcs.index(
|
|
'https://example.com/plugin2.js'
|
|
)
|
|
|
|
|
|
def test_plugins_render_cell(app_client):
|
|
sql = """
|
|
select '{"href": "http://example.com/", "label":"Example"}'
|
|
""".strip()
|
|
path = "/fixtures?" + urllib.parse.urlencode({
|
|
"sql": sql,
|
|
})
|
|
response = app_client.get(path)
|
|
td = Soup(
|
|
response.body, "html.parser"
|
|
).find("table").find("tbody").find("td")
|
|
a = td.find("a")
|
|
assert a is not None, str(a)
|
|
assert a.attrs["href"] == "http://example.com/"
|
|
assert a.text == "Example"
|