Rename application to Samsara and add assessment summary, detailed tabs and local Linux inventory
This commit is contained in:
139
tests/test_ui.py
139
tests/test_ui.py
@@ -1,12 +1,17 @@
|
||||
import os
|
||||
os.environ.setdefault('QT_QPA_PLATFORM', 'offscreen')
|
||||
import time
|
||||
import tempfile
|
||||
from pathlib import Path
|
||||
import unittest
|
||||
from unittest.mock import patch
|
||||
try:
|
||||
from PySide6.QtWidgets import QApplication
|
||||
from server_buddy.ui.window import MainWindow
|
||||
from samsara.ui.window import MainWindow
|
||||
except ImportError:
|
||||
QApplication = None
|
||||
from samsara.collectors.demo import collect_demo, LINUX_DEMO_HOST
|
||||
|
||||
|
||||
@unittest.skipIf(QApplication is None, 'PySide6 not installed')
|
||||
class UITests(unittest.TestCase):
|
||||
@@ -14,74 +19,98 @@ class UITests(unittest.TestCase):
|
||||
def setUpClass(cls):
|
||||
cls.app = QApplication.instance() or QApplication([])
|
||||
|
||||
def test_navigation_collection_and_environment_errors(self):
|
||||
def finish(self, window):
|
||||
deadline = time.monotonic() + 5
|
||||
while window.job is not None and time.monotonic() < deadline:
|
||||
self.app.processEvents()
|
||||
time.sleep(.01)
|
||||
self.assertIsNone(window.job)
|
||||
|
||||
def test_default_workflow_navigation_and_no_fabricated_history(self):
|
||||
window = MainWindow()
|
||||
window.show()
|
||||
self.assertEqual(window.tabs.count(), 10)
|
||||
for index in range(6):
|
||||
self.assertEqual(window.windowTitle(), 'Samsara')
|
||||
self.assertEqual(window.source.currentData(), 'local')
|
||||
self.assertEqual(window.target.currentData(), 'auto')
|
||||
self.assertIsNone(window.data)
|
||||
self.assertEqual(window.history, [])
|
||||
self.assertFalse(window.report_buttons[0].isEnabled())
|
||||
self.assertEqual(window.nav.item(0).text(), 'Summary')
|
||||
for index in range(5):
|
||||
window.nav.setCurrentRow(index)
|
||||
self.assertEqual(window.pages.currentIndex(), index)
|
||||
window.hostname.setText('host;bad')
|
||||
window.start_collection()
|
||||
self.assertIn('Enter a hostname', window.status.text())
|
||||
window.hostname.setText('demo-web-01.example.test')
|
||||
window.environment.setCurrentIndex(1)
|
||||
window.start_collection()
|
||||
self.assertIn('not implemented', window.status.text())
|
||||
window.environment.setCurrentIndex(0)
|
||||
window.start_collection()
|
||||
deadline = time.monotonic() + 5
|
||||
while window.job is not None and time.monotonic() < deadline:
|
||||
self.app.processEvents()
|
||||
time.sleep(.01)
|
||||
self.assertIsNone(window.job)
|
||||
self.assertEqual(len(window.history), 2)
|
||||
self.assertTrue(window.analyze_button.isEnabled())
|
||||
self.assertIn('Complete', window.status.text())
|
||||
self.assertEqual(window.pages.currentIndex(), {0: 1, 1: 0, 2: 2, 3: 3, 4: 4}[index])
|
||||
window.close()
|
||||
|
||||
def test_linux_demo_collection(self):
|
||||
def test_samples_details_and_history(self):
|
||||
window = MainWindow()
|
||||
window.target.setCurrentIndex(1)
|
||||
self.assertEqual(window.hostname.text(), 'demo-rhel-01.example.test')
|
||||
window.start_collection()
|
||||
deadline = time.monotonic() + 5
|
||||
while window.job is not None and time.monotonic() < deadline:
|
||||
self.app.processEvents()
|
||||
time.sleep(.01)
|
||||
self.assertIsNone(window.job)
|
||||
for source, expected in [('linux_demo', 'linux'), ('windows_demo', 'windows')]:
|
||||
window.source.setCurrentIndex(window.source.findData(source))
|
||||
self.assertFalse(window.target.isEnabled())
|
||||
window.start_collection()
|
||||
self.finish(window)
|
||||
self.assertEqual(window.data['server']['platform'], expected)
|
||||
self.assertIn('Synthetic', window.banner.text())
|
||||
self.assertEqual(window.nav.currentRow(), 0)
|
||||
self.assertEqual(window.result_tabs.tabText(0), 'Summary')
|
||||
self.assertIn('/100', window.retirement_score.text())
|
||||
self.assertIn('Version:', window.os_version.text())
|
||||
for index in range(1, window.result_tabs.count()):
|
||||
window.result_tabs.setCurrentIndex(index)
|
||||
self.assertGreaterEqual(list(window.detail_areas.values())[index - 1].count(), 1)
|
||||
window.open_history(window.history_list.item(0))
|
||||
self.assertEqual(window.data['server']['platform'], 'linux')
|
||||
self.assertIn('SYNTHETIC', window.banner.text())
|
||||
self.assertEqual(window.tabs.count(), 10)
|
||||
self.assertEqual(len(window.records), 2)
|
||||
window.close()
|
||||
|
||||
def test_local_collection_source_and_report(self):
|
||||
from unittest.mock import patch
|
||||
from server_buddy.collectors.demo import collect_demo, LINUX_DEMO_HOST
|
||||
def test_auto_detect_runs_local_collector_and_saves_report(self):
|
||||
data = collect_demo(LINUX_DEMO_HOST)
|
||||
data['synthetic'] = False
|
||||
data['server']['collection_source'] = 'Local Linux read-only collection'
|
||||
with patch('server_buddy.ui.window.platform.system', return_value='Linux'), patch('server_buddy.ui.window.collect_local_linux', return_value=data):
|
||||
detected = {'platform': 'linux', 'family': 'linux', 'version': '22', 'name': 'Local Linux'}
|
||||
with patch('samsara.ui.window.detect_local_os', return_value=detected) as detection, patch('samsara.ui.window.collect_local_linux', return_value=data) as collector:
|
||||
window = MainWindow()
|
||||
# Local collection does not validate or contact the hostname field.
|
||||
window.hostname.setText('not-a-remote-target;')
|
||||
window.local_button.click()
|
||||
window.analyze_button.click()
|
||||
self.assertFalse(window.analyze_button.isEnabled())
|
||||
self.assertTrue(window.cancel_button.isEnabled())
|
||||
deadline = time.monotonic() + 5
|
||||
while window.job is not None and time.monotonic() < deadline:
|
||||
self.app.processEvents()
|
||||
time.sleep(.01)
|
||||
self.assertIsNone(window.job)
|
||||
self.assertIn('LOCAL LINUX', window.banner.text())
|
||||
self.assertEqual(window.history[-1]['source'], 'Local Linux read-only collection')
|
||||
self.assertTrue(window.local_button.isEnabled())
|
||||
self.assertFalse(window.cancel_button.isEnabled())
|
||||
import tempfile
|
||||
from pathlib import Path
|
||||
self.finish(window)
|
||||
detection.assert_called_once()
|
||||
collector.assert_called_once()
|
||||
self.assertIn('Local Linux', window.banner.text())
|
||||
self.assertTrue(window.analyze_button.isEnabled())
|
||||
self.assertTrue(window.report_buttons[0].isEnabled())
|
||||
with tempfile.TemporaryDirectory() as folder:
|
||||
report = Path(folder) / 'local.html'
|
||||
with patch('server_buddy.ui.window.QFileDialog.getSaveFileName', return_value=(str(report), '')), patch('server_buddy.ui.window.QMessageBox.information'):
|
||||
window.save_report('html')
|
||||
with patch('samsara.ui.window.QFileDialog.getSaveFileName', return_value=(str(report), '')), patch('samsara.ui.window.QMessageBox.information'):
|
||||
window.quick_save.click()
|
||||
self.assertIn('LOCAL LINUX INVENTORY', report.read_text())
|
||||
window.close()
|
||||
|
||||
def test_mismatched_profile_and_windows_unavailable_keep_prior_results(self):
|
||||
window = MainWindow()
|
||||
window.collection_done(collect_demo(LINUX_DEMO_HOST))
|
||||
previous = window.data
|
||||
detected = {'platform': 'linux', 'family': 'linux', 'version': '22', 'name': 'Local Linux'}
|
||||
with patch('samsara.ui.window.detect_local_os', return_value=detected), patch('samsara.ui.window.collect_local_linux') as collector:
|
||||
window.target.setCurrentIndex(window.target.findData('rhel:9'))
|
||||
window.start_collection()
|
||||
self.finish(window)
|
||||
collector.assert_not_called()
|
||||
self.assertIn('does not match', window.status.text())
|
||||
self.assertIs(window.data, previous)
|
||||
with patch('samsara.ui.window.detect_local_os', return_value={'platform': 'windows', 'family': 'windows', 'version': '', 'name': 'Windows'}):
|
||||
window.start_collection()
|
||||
self.finish(window)
|
||||
self.assertIn('not available yet', window.status.text())
|
||||
window.close()
|
||||
|
||||
def test_import_requires_file_and_reads_recorded_os(self):
|
||||
window = MainWindow()
|
||||
window.source.setCurrentIndex(window.source.findData('file'))
|
||||
self.assertFalse(window.target.isEnabled())
|
||||
window.start_collection()
|
||||
self.assertIn('Choose an inventory', window.status.text())
|
||||
with patch('samsara.ui.window.load_inventory', return_value=collect_demo(LINUX_DEMO_HOST)) as loader, patch('samsara.ui.window.detect_local_os') as detect:
|
||||
window.inventory_path.setText('/tmp/saved-inventory.json')
|
||||
window.start_collection()
|
||||
self.finish(window)
|
||||
loader.assert_called_once_with('/tmp/saved-inventory.json')
|
||||
detect.assert_not_called()
|
||||
window.close()
|
||||
|
||||
Reference in New Issue
Block a user