#!/usr/bin/env python3 """Offline picker packaging preserves qualified full/reduced OTA choices.""" import importlib.util from html.parser import HTMLParser import json from pathlib import Path import re import unittest ROOT = Path(__file__).resolve().parents[1] SPEC = importlib.util.spec_from_file_location('package_firmware_picker', ROOT / 'scripts/package_firmware_picker.py') PACKAGE = importlib.util.module_from_spec(SPEC) SPEC.loader.exec_module(PACKAGE) class PickerMarkup(HTMLParser): def __init__(self, text): super().__init__() self.tags = [] self.feed(text) def matching(self, attribute, value): return [(index, tag, attrs) for index, (tag, attrs) in enumerate(self.tags) if attrs.get(attribute) == value] def handle_starttag(self, tag, attrs): self.tags.append((tag, dict(attrs))) class OfflinePickerPackageTests(unittest.TestCase): def assert_picker_first(self, text): markup = PickerMarkup(text) form = markup.matching('data-role', 'form') release = markup.matching('data-role', 'release-set') help_panels = markup.matching('class', 'firmware-picker-help') self.assertEqual(len(form), 1) self.assertEqual(len(release), 1) self.assertEqual(len(help_panels), 1) help_index, help_tag, help_attrs = help_panels[0] self.assertEqual(help_tag, 'details') self.assertNotIn('open', help_attrs) self.assertLess(form[0][0], release[0][0]) self.assertLess(markup.matching('data-role', 'result')[0][0], help_index) fields = [(attrs.get('data-field'), index) for index, (_, attrs) in enumerate(markup.tags) if 'data-field' in attrs] self.assertEqual(fields[0][0], 'hardwareFamily') field_positions = dict(fields) self.assertLess(field_positions['role'], field_positions['install']) self.assertTrue({'chipFamily', 'hardwareFamily', 'hardware', 'install', 'role', 'logging', 'firmwareProfile', 'mode'}.issubset( {field for field, _ in fields})) for _, attrs in markup.tags: for described_by in attrs.get('aria-describedby', '').split(): self.assertEqual(len(markup.matching('id', described_by)), 1) def test_hosted_page_starts_with_choices_not_instructions(self): source = (ROOT / 'docs/firmware_picker.md').read_text(encoding='utf-8') title_end = source.index('# Firmware picker') + len('# Firmware picker') picker_start = source.index('