#!/usr/bin/env python3 """Exercise menu reloads after successful and partially failed updates.""" from pathlib import Path import os import subprocess import tempfile import unittest ROOT = Path(__file__).resolve().parents[1] class MenuUpdateTests(unittest.TestCase): def test_reload_after_success_or_failure(self): source = (ROOT / 'proxmenu-scripts.sh').read_text() function = source.split('TAPM_INSTALL_MENU_UPDATE() {', 1)[1].split('\n}\n', 1)[0] for status in (0, 1): with self.subTest(update_status=status), tempfile.TemporaryDirectory() as directory: launcher = Path(directory) / 'run.sh' log = Path(directory) / 'calls' launcher.write_text('''#!/bin/bash if [[ "${1:-}" == update ]]; then echo update >> "$TEST_LOG" exit "$TEST_STATUS" fi echo reload >> "$TEST_LOG" ''') launcher.chmod(0o700) script = 'TAPM_UI_TASK() { :; }\nENTER2CONTINUE() { echo pause >> "$TEST_LOG"; }\n' script += 'TAPM_INSTALL_MENU_UPDATE() {' + function.replace( '/opt/idssys/ta-proxmenu/run.sh', '"' + str(launcher) + '"') + '\n}\n' script += 'TAPM_INSTALL_MENU_UPDATE\necho stale-menu >> "$TEST_LOG"\n' result = subprocess.run(['bash', '-c', script], capture_output=True, text=True, env=dict(os.environ, TEST_LOG=str(log), TEST_STATUS=str(status))) self.assertEqual(result.returncode, 0, result.stderr) self.assertEqual(log.read_text().splitlines(), ['update', 'reload'] if status == 0 else ['update', 'pause', 'reload']) if status: self.assertIn('reported failures', result.stdout) if __name__ == '__main__': unittest.main()