Files
Home-Assistant/esphome/bambu-display/test_generate.py
T
2026-10-17 17:09:47 -04:00

68 lines
3.1 KiB
Python

"""Run with: python -m unittest discover -s esphome/bambu-display -v."""
import copy
import unittest
import yaml
from generate import HERE, generate, validate_printers
class FleetTests(unittest.TestCase):
def setUp(self):
self.printers = yaml.safe_load((HERE / 'printers.yaml').read_text())['printers']
def test_all_subscriptions_match_repository_entities(self):
known = {line.split(' | ')[0] for line in
(HERE.parent / 'ha-entities.txt').read_text().splitlines()}
package = generate(self.printers)
subscribed = {entry['entity_id'] for domain in ('sensor', 'text_sensor')
for entry in package[domain]}
self.assertFalse(subscribed - known)
def test_seven_printers_have_independent_pages_and_metrics(self):
for index in (6, 7):
extra = copy.deepcopy(self.printers[0])
extra.update(id=f'printer_{index}', entity_prefix=f'new_printer_{index}')
self.printers.append(extra)
package = generate(self.printers)
self.assertEqual(len(package['lvgl']['pages']), 7)
self.assertEqual(len(package['script']), 7)
subscriptions = {entry['id']: entry['entity_id'] for entry in package['sensor']}
self.assertEqual(subscriptions['printer_7_progress'], 'sensor.new_printer_7_print_progress')
for page in package['lvgl']['pages']:
self.assertIn('lvgl.page.next', page['on_swipe_left'][-1])
self.assertIn('lvgl.page.previous', page['on_swipe_right'][-1])
def test_overrides_apply_to_values_and_unit_subscriptions(self):
self.printers[0]['entities'] = {'time_left': 'sensor.custom_remaining'}
package = generate(self.printers)
for domain, key in [('sensor', 'time_left'), ('text_sensor', 'remaining_unit')]:
entry = next(row for row in package[domain] if row['id'] == f'prints_charming_{key}')
self.assertEqual(entry['entity_id'], 'sensor.custom_remaining')
def test_reject_empty_duplicate_and_malformed_printer_ids(self):
for invalid in ([], self.printers + [self.printers[0]],
[{**self.printers[0], 'id': 'invalid-id'}]):
with self.subTest(invalid=invalid), self.assertRaises(ValueError):
validate_printers(invalid)
def test_reject_overflowing_filament_strip(self):
self.printers[0]['external_spools'] = [{'label': 'EXT', 'entity': 'sensor.external_spool'}]
with self.assertRaisesRegex(ValueError, 'eight slots'):
generate(self.printers)
def test_progress_and_dual_nozzle_widgets_fit_the_panel(self):
package = generate(self.printers)
for page in package['lvgl']['pages']:
for widget in page['widgets']:
props = next(iter(widget.values()))
self.assertGreaterEqual(props.get('x', 0), 0)
self.assertGreaterEqual(props.get('y', 0), 0)
self.assertLessEqual(props.get('x', 0) + props.get('width', 0), 800)
self.assertLessEqual(props.get('y', 0) + props.get('height', 0), 480)
if __name__ == '__main__':
unittest.main()