Files
rigdoctor/tests/test_inventory.py
T
jessey 9bb0f9a684
tests / core (pull_request) Successful in 12s
tests / gui-smoke (pull_request) Successful in 27s
feat(inventory): show NVMe PCIe link gen/width, flag downtrains — 0.38.0
Each NVMe drive's Inventory entry now shows its negotiated PCIe link (e.g.
'· PCIe Gen4 x4') from sysfs (current/max link speed+width), and flags drives
running below their capability ('Gen3 x4 (capable of Gen4 x4)') — so you can
confirm a Gen4 SSD is in a Gen4 slot. SATA disks show no PCIe link. Renders in
the GUI Inventory, CLI, and the Markdown/JSON export automatically. +tests.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 16:45:08 +02:00

59 lines
2.1 KiB
Python

"""Tests for the M5 system inventory (render + dict round-trip; collect on real system)."""
import tempfile
import unittest
from pathlib import Path
from rigdoctor.core import inventory
from rigdoctor.core.inventory import Section
class InventoryTests(unittest.TestCase):
def test_collect_returns_sections(self):
sections = inventory.collect()
self.assertTrue(sections)
titles = {s.title for s in sections}
self.assertIn("System", titles)
self.assertIn("CPU", titles)
def test_dict_round_trip(self):
sections = [Section("System", [("Kernel", "7.0.0"), ("Distro", "Ubuntu")])]
restored = inventory.from_dict(inventory.to_dict(sections))
self.assertEqual(restored[0].title, "System")
self.assertEqual(restored[0].items, [("Kernel", "7.0.0"), ("Distro", "Ubuntu")])
def test_render_markdown(self):
md = inventory.render_markdown([Section("CPU", [("Model", "Test CPU")])])
self.assertIn("## CPU", md)
self.assertIn("- **Model:** Test CPU", md)
class PcieLinkTests(unittest.TestCase):
def test_gen_mapping(self):
self.assertEqual(inventory._gen("16.0 GT/s PCIe"), 4)
self.assertEqual(inventory._gen("8.0 GT/s PCIe"), 3)
self.assertIsNone(inventory._gen(""))
def _fake_dev(self, cur_s, cur_w, max_s, max_w) -> Path:
d = Path(tempfile.mkdtemp())
(d / "current_link_speed").write_text(cur_s)
(d / "current_link_width").write_text(cur_w)
(d / "max_link_speed").write_text(max_s)
(d / "max_link_width").write_text(max_w)
return d
def test_link_at_full_speed(self):
dev = self._fake_dev("16.0 GT/s PCIe", "4", "16.0 GT/s PCIe", "4")
self.assertEqual(inventory._link_desc(dev), "PCIe Gen4 x4")
def test_link_downtrained_flags_capability(self):
dev = self._fake_dev("8.0 GT/s PCIe", "4", "16.0 GT/s PCIe", "4")
self.assertEqual(inventory._link_desc(dev), "PCIe Gen3 x4 (capable of Gen4 x4)")
def test_non_nvme_has_no_link(self):
self.assertEqual(inventory._nvme_link("sda"), "")
if __name__ == "__main__":
unittest.main()