"""test view handler""" from html.parser import HTMLParser import pytest import tornado from .utils import expected_http_error from jupyter_server.utils import url_path_join class IFrameSrcFinder(HTMLParser): """Minimal HTML parser to find iframe.src attr""" def __init__(self): super().__init__() self.iframe_src = None def handle_starttag(self, tag, attrs): if tag.lower() == "iframe": for attr, value in attrs: if attr.lower() == "src": self.iframe_src = value return def find_iframe_src(html): """Find the src= attr of an iframe on the page Assumes only one iframe """ finder = IFrameSrcFinder() finder.feed(html) return finder.iframe_src @pytest.mark.parametrize( "exists, name", [ (False, "nosuchfile.html"), (False, "nosuchfile.bin"), (True, "exists.html"), (True, "exists.bin"), ], ) async def test_view(jp_fetch, jp_serverapp, jp_root_dir, exists, name): """Test /view/$path for a few cases""" if exists: jp_root_dir.joinpath(name).write_text(name) if not exists: with pytest.raises(tornado.httpclient.HTTPClientError) as e: await jp_fetch("view", name, method="GET") assert expected_http_error(e, 404), [name, e] else: r = await jp_fetch("view", name, method="GET") assert r.code == 200 assert r.headers["content-type"] == "text/html; charset=UTF-8" html = r.body.decode() src = find_iframe_src(html) assert src == url_path_join(jp_serverapp.base_url, f"/files/{name}")