#!/usr/bin/env python3 """Check reorganized menu routes, including conditional hardware entries.""" from pathlib import Path import os import re import subprocess import unittest ROOT = Path(__file__).resolve().parents[1] SOURCE = (ROOT / 'proxmenu-scripts.sh').read_text() def function(name): return name + '() {' + SOURCE.split(name + '() {', 1)[1].split('\n}\n', 1)[0] + '\n}\n' class MenuLayoutTests(unittest.TestCase): def menu(self, name, selection, dell=False): # Real menu functions, mocked host inspection and terminal selection. script = ''' TAPM_POST_PROXMENUX_DETECTED() { return 1; } TAPM_PULSE_RESOURCE_INSTALLED_FROM_CONFIGS() { return 0; } TAPM_PACKAGE_INSTALLED() { return 0; } TAPM_OMSA_SUPPORTED_HARDWARE() { [[ "$TEST_DELL" == yes ]]; } TAPM_HA_NODE_IN_MAINTENANCE() { return 1; } systemctl() { return 0; } dpkg-query() { printf 'install ok installed'; } glances() { :; } SELECT_MENU() { local -n actual_labels="$2" actual_values="$3" [[ ${#actual_labels[@]} == ${#actual_values[@]} ]] || exit 40 if [[ ${TEST_VISITED:-0} == 1 ]]; then MENU_SELECTION=back; return; fi TEST_VISITED=1 printf 'TITLE:%s\\n' "$1" for i in "${!actual_values[@]}"; do printf 'ROW:%s:%s\\n' "${actual_values[$i]}" "${actual_labels[$i]}" done MENU_SELECTION="$TEST_SELECTION" } ''' for action in ['SERVICE_RECOVERY_MENU', 'TAPM_HOST_CONFIGURATION_MENU', 'INSTALL_GLANCES', 'INSTALL_OMSA', 'TAPM_NOTIFICATIONS_MENU', 'DETECT_CPU', 'INSTALL_KEEPALIVE', 'VIRTIO_MENU', 'TAPM_POST_VZDUMP_MENU', 'TAPM_ORPHAN_DISK_REPORT']: script += action + '() { printf "ACTION:' + action + '\\n"; }\n' script += function(name) + '\n' + name result = subprocess.run(['bash', '-c', script], capture_output=True, text=True, env=dict(os.environ, TEST_SELECTION=selection, TEST_DELL='yes' if dell else 'no')) self.assertEqual(result.returncode, 0, result.stderr) rows = dict(re.findall(r'^ROW:([^:]+):(.*)$', result.stdout, re.M)) return rows, result.stdout def test_local_service_recovery_is_under_host_configuration(self): rows, output = self.menu('HOST_SETUP_MENU', 'services') self.assertEqual(set(rows), {'post_install', 'services'}) self.assertIn('ACTION:SERVICE_RECOVERY_MENU', output) def test_cluster_cpu_action_moved_with_its_dispatch(self): rows, output = self.menu('CLUSTER_MENU', 'cpu') self.assertEqual(set(rows), {'maintenance', 'cpu', 'keepalived'}) self.assertIn('ACTION:DETECT_CPU', output) def test_storage_routes_keep_iso_scan_deferred(self): for choice, action in [('virtio', 'VIRTIO_MENU'), ('vzdump', 'TAPM_POST_VZDUMP_MENU'), ('orphan_disks', 'TAPM_ORPHAN_DISK_REPORT')]: rows, output = self.menu('STORAGE_MENU', choice) self.assertEqual(set(rows), {'iso_nfs', 'virtio', 'orphan_disks', 'vzdump'}) self.assertIn('ACTION:' + action, output) self.assertEqual(output.count('ACTION:'), 1) def test_notifications_and_glances_with_optional_dell_entry(self): for dell in [False, True]: rows, output = self.menu('MONITORING_MENU', 'notifications', dell) self.assertEqual('omsa' in rows, dell) self.assertIn('glances', rows) self.assertIn('ACTION:TAPM_NOTIFICATIONS_MENU', output) rows, output = self.menu('MONITORING_MENU', 'glances', dell) self.assertIn('ACTION:INSTALL_GLANCES', output) self.assertTrue(rows['glances'].startswith('Install ')) if __name__ == '__main__': unittest.main()