forked from toolshed/alakazam
75 lines
3.6 KiB
Python
75 lines
3.6 KiB
Python
"""Tests for the strict hook mode that lets a scratch build fail on a broken hook."""
|
|
|
|
import os
|
|
import stat
|
|
import sys
|
|
|
|
import click
|
|
import pytest
|
|
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
|
|
import alakazam
|
|
from alakazam import execute_cmds, run_secret_hooks
|
|
|
|
|
|
def failing_script(tmp_path):
|
|
"""A tiny local script that exits non-zero, for testing 'script' hook failure handling."""
|
|
script = tmp_path / "fail.sh"
|
|
script.write_text("#!/bin/sh\nexit 1\n")
|
|
script.chmod(script.stat().st_mode | stat.S_IXUSR)
|
|
return script
|
|
|
|
|
|
class TestStrictHooks:
|
|
def test_a_secret_hook_failure_is_tolerated_by_default(self, monkeypatch):
|
|
"""'secrets' has always continued past a failing hook, that must not change."""
|
|
monkeypatch.setattr(alakazam, "abra", lambda *a, **k: "")
|
|
run_secret_hooks("login.a.org", {"secret_hooks": ["insert_cert"]})
|
|
|
|
def test_a_secret_hook_failure_aborts_in_strict_mode(self, monkeypatch):
|
|
def failing(*args, ignore_error=False, **kwargs):
|
|
assert not ignore_error
|
|
assert kwargs.get("stream"), "a hook can run for minutes, its output must not be buffered"
|
|
raise RuntimeError("FATA no such command")
|
|
monkeypatch.setattr(alakazam, "abra", failing)
|
|
with pytest.raises(click.ClickException) as excinfo:
|
|
run_secret_hooks("login.a.org", {"secret_hooks": ["insert_cert"]}, strict=True)
|
|
assert "secret hook 'insert_cert' failed" in excinfo.value.message
|
|
|
|
def test_a_command_failure_is_tolerated_by_default(self, monkeypatch):
|
|
monkeypatch.setattr(alakazam, "abra", lambda *a, **k: "")
|
|
execute_cmds({"app_domain": "login.a.org", "server": "a.org", "initial-hooks": ["app init"]}, initial=True)
|
|
|
|
def test_a_command_failure_aborts_in_strict_mode(self, monkeypatch):
|
|
def failing(*args, ignore_error=False, **kwargs):
|
|
raise RuntimeError("FATA container not found")
|
|
monkeypatch.setattr(alakazam, "abra", failing)
|
|
with pytest.raises(click.ClickException) as excinfo:
|
|
execute_cmds({"app_domain": "login.a.org", "server": "a.org", "initial-hooks": ["app init"]}, initial=True, strict=True)
|
|
assert "command 'app init' failed" in excinfo.value.message
|
|
|
|
def test_a_script_secret_hook_failure_is_tolerated_by_default(self, tmp_path):
|
|
"""A failing local script must be tolerated by default too, same as a failing abra.sh hook."""
|
|
script = failing_script(tmp_path)
|
|
run_secret_hooks("login.a.org", {"secret_hooks": [f"script {script}"], "server": "a.org"})
|
|
|
|
def test_a_script_secret_hook_failure_aborts_in_strict_mode(self, tmp_path):
|
|
script = failing_script(tmp_path)
|
|
with pytest.raises(click.ClickException) as excinfo:
|
|
run_secret_hooks("login.a.org", {"secret_hooks": [f"script {script}"], "server": "a.org"}, strict=True)
|
|
assert str(script) in excinfo.value.message
|
|
assert "failed" in excinfo.value.message
|
|
|
|
def test_a_script_command_failure_is_tolerated_by_default(self, tmp_path):
|
|
script = failing_script(tmp_path)
|
|
execute_cmds({"app_domain": "login.a.org", "server": "a.org", "initial-hooks": [f"script {script}"]}, initial=True)
|
|
|
|
def test_a_script_command_failure_aborts_in_strict_mode(self, tmp_path):
|
|
script = failing_script(tmp_path)
|
|
with pytest.raises(click.ClickException) as excinfo:
|
|
execute_cmds({"app_domain": "login.a.org", "server": "a.org", "initial-hooks": [f"script {script}"]},
|
|
initial=True, strict=True)
|
|
assert str(script) in excinfo.value.message
|
|
assert "failed" in excinfo.value.message
|