Files
TA-ProxMenu/tests/test-menu-layout.py
David Schroeder 6f4c95e0f2 menu update
2026-09-24 19:22:04 -05:00

83 lines
3.6 KiB
Python

#!/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()