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