Replace the download-file shortcut approach with compact self-contained picker URLs under /p/. Preserve long-link compatibility, selected install formats, and full published firmware filenames. Cover selection round trips and the redirect in the picker tests.
54 lines
2.7 KiB
Python
54 lines
2.7 KiB
Python
#!/usr/bin/env python3
|
|
"""Offline picker packaging preserves qualified full/reduced OTA choices."""
|
|
import importlib.util
|
|
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 OfflinePickerPackageTests(unittest.TestCase):
|
|
def test_sensor_policy_pairs_and_individual_downloads_are_retained(self):
|
|
source = 'a' * 40
|
|
family = 'v1.17.1.7-dev-aaaaaaaa'
|
|
logical = 'RAK_3401_repeater_lora_ota_no_external_sensors'
|
|
controls = dict(familyTag=family, source=source, profiles={})
|
|
assets = []
|
|
for policy in ('full', 'reduced'):
|
|
target = logical + '-' + policy
|
|
controls['profiles'][target] = dict(platform='NRF52_PLATFORM', otaRole='lora-receiver',
|
|
updateMethods=['lora'], sensorProfile=policy, sensorProfileSource=source)
|
|
for extension in ('.zip', '.uf2'):
|
|
name = target + '-ota-' + family + extension
|
|
assets.append(dict(name=name, size=100,
|
|
browser_download_url='https://github.com/mikecarper/MeshCore/releases/download/' + family + '/' + name,
|
|
uploader={'token': 'not part of the picker'}))
|
|
releases = [dict(name=family, tag_name=family, assets=assets, authorization='private')]
|
|
packaged = PACKAGE.package(releases, controls)
|
|
match = re.search(r'<script type="application/json" id="firmware-picker-data">(.*?)</script>', packaged)
|
|
embedded = json.loads(match[1])
|
|
self.assertEqual(embedded['controls'], controls)
|
|
self.assertEqual(len(embedded['releases'][0]['assets']), 4)
|
|
self.assertEqual({asset['name'] for asset in embedded['releases'][0]['assets']},
|
|
{asset['name'] for asset in assets})
|
|
self.assertNotIn('authorization', embedded['releases'][0])
|
|
self.assertTrue(all('uploader' not in asset for asset in embedded['releases'][0]['assets']))
|
|
self.assertIn('Full supported sensors', packaged)
|
|
self.assertIn('Reduced sensors', packaged)
|
|
self.assertIn('data-share-url="https://mikecarper.github.io/MeshCore/p/"', packaged)
|
|
self.assertIn('shortSelectionUrl', packaged)
|
|
|
|
def test_controls_must_belong_to_the_packaged_release_family(self):
|
|
with self.assertRaisesRegex(ValueError, 'match the supplied release family'):
|
|
PACKAGE.package([dict(tag_name='v1.17.1.6', assets=[])],
|
|
dict(familyTag='v1.17.1.7', profiles={}))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|