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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
from __future__ import annotations
from pygitweb.static_tests.js_runtime import JsPage
from pygitweb.static_tests.pages import requested
_HOOKS = (
'<button class="hook-toggle" data-project="demo" data-sample="commit-msg" data-op="uninstall">x</button>'
'<button class="hook-install-btn" data-project="demo" data-op="install">install</button>'
'<select id="hook-install-select"><option value="pre-commit">pre</option></select>'
'<button id="plain">plain</button>'
'<button class="hook-toggle" id="incomplete">bad</button>'
'<button class="hook-install-btn" id="install-bare">bare</button>'
)
def test_click_outside_a_hook_control_is_ignored(js: JsPage) -> None:
js.set_html(_HOOKS)
js.load("hook-install.js")
js.click("#plain")
assert js.value("__alerts") == []
assert requested(js, "/hook?") is False
def test_incomplete_toggle_does_not_post(js: JsPage) -> None:
js.set_html(_HOOKS)
js.load("hook-install.js")
js.click("#incomplete")
assert requested(js, "/hook?") is False
assert js.prop("#incomplete", "disabled") is False
def test_uninstall_reloads_after_a_successful_post(js: JsPage) -> None:
js.route("/hook?", status=200, text="ok")
js.set_html(_HOOKS)
js.load("hook-install.js")
js.click(".hook-toggle[data-sample]")
urls = [item["url"] for item in js.requests() if "/hook?" in str(item["url"])]
assert urls[0].endswith("name=commit-msg&op=uninstall")
assert js.value("__reloaded") is True
assert js.prop(".hook-toggle[data-sample]", "disabled") is True
def test_uninstall_alerts_and_reenables_when_the_post_fails(js: JsPage) -> None:
js.route("/hook?", status=500, text="nope")
js.set_html(_HOOKS)
js.load("hook-install.js")
js.click(".hook-toggle[data-sample]")
alerts = js.value("__alerts")
assert "uninstall failed (500)" in alerts[0]
assert "nope" in alerts[0]
assert js.prop(".hook-toggle[data-sample]", "disabled") is False
assert js.value("__reloaded") is False
def test_uninstall_alerts_when_fetch_rejects(js: JsPage) -> None:
js.route("/hook?", error="offline")
js.set_html(_HOOKS)
js.load("hook-install.js")
js.click(".hook-toggle[data-sample]")
assert "offline" in js.value("__alerts")[0]
assert js.prop(".hook-toggle[data-sample]", "disabled") is False
def test_install_posts_the_selected_sample(js: JsPage) -> None:
js.route("/hook?", status=200, text="ok")
js.set_html(_HOOKS)
js.load("hook-install.js")
js.click(".hook-install-btn[data-project]")
urls = [item["url"] for item in js.requests()]
assert any("name=pre-commit&op=install" in url for url in urls)
assert js.value("__reloaded") is True
def test_install_without_a_select_does_not_post(js: JsPage) -> None:
html = _HOOKS.replace(
'<select id="hook-install-select"><option value="pre-commit">pre</option></select>',
'<div id="hook-install-select"></div>',
)
js.set_html(html)
js.load("hook-install.js")
js.click(".hook-install-btn[data-project]")
assert requested(js, "/hook?") is False
def test_install_without_a_project_does_not_post(js: JsPage) -> None:
js.set_html(_HOOKS)
js.load("hook-install.js")
js.click("#install-bare")
assert requested(js, "/hook?") is False