-
Notifications
You must be signed in to change notification settings - Fork 323
/
Copy pathtest_view.py
62 lines (48 loc) · 1.63 KB
/
test_view.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
"""test view handler"""
from html.parser import HTMLParser
import pytest
import tornado
from jupyter_server.utils import url_path_join
from .utils import expected_http_error
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}")