Files
saphid--frame-control/tests/test_framey_compatibility.py
T

65 lines
3.6 KiB
Python

"""A compatibility claim must never transfer to a different published archive."""
import sandbox # noqa: F401
import json
from pathlib import Path
import sys
import subprocess
import unittest
from unittest.mock import patch
sys.path.insert(0, str(Path(__file__).resolve().parents[1]/'ui'))
import framey_compatibility as compatibility
import frame_decky_store
import frame_decky
class Compatibility(unittest.TestCase):
def test_table_matches_store_data_and_complete_browser_and_fake_evidence(self):
root = Path(__file__).resolve().parents[1]
subprocess.run([sys.executable, str(root/'scripts/framey-compatibility-doc.py'), '--check'], check=True)
records = json.loads(compatibility.DATA.read_text())['plugins']
self.assertEqual(len({p['id'] for p in records}), len(records))
for record in records:
self.assertEqual(record['browser']['id'], record['id'])
self.assertEqual(record['fakeFrame']['sha256'], record['sha256'])
self.assertIn(record['status'], ('works', 'partial', 'broken', 'na'))
def test_claims_require_exact_id_version_and_digest(self):
records = json.loads(compatibility.DATA.read_text())['plugins']
for plugin in records:
with self.subTest(plugin=plugin['name']):
expected = compatibility.lookup(plugin['id'], plugin['sha256'], plugin['version'])
self.assertEqual(expected['status'], plugin['status'])
for plugin_id, digest, version in (
(plugin['id'], '0'*64, plugin['version']),
(plugin['id'], plugin['sha256'], plugin['version']+'-new'),
(99999, plugin['sha256'], plugin['version']),
):
result = compatibility.lookup(plugin_id, digest, version)
self.assertEqual(result['status'], 'unverified')
self.assertFalse(result['blockInstall'])
def test_installed_receipt_uses_its_digest_not_current_store_version(self):
record = json.loads(compatibility.DATA.read_text())['plugins'][0]
installed = {'plugins': [{'storeId': record['id'], 'version': record['version'],
'sha256': record['sha256']},
{'storeId': record['id'], 'version': record['version'], 'sha256': '0'*64}]}
result = frame_decky.status(lambda *a, **k: json.dumps(installed))
self.assertEqual(result['plugins'][0]['compatibility']['status'], record['status'])
self.assertEqual(result['plugins'][1]['compatibility']['status'], 'unverified')
def test_hardware_block_precedes_any_download_or_ssh_mutation(self):
with patch.object(frame_decky, 'status', return_value={'managed': True, 'running': True, 'plugins': []}), \
patch.object(frame_decky_store, 'catalog', return_value=[{'id': 42, 'name': 'Hardware only',
'sha256': 'a'*64, 'root': False, 'compatibility': {'blockInstall': True, 'reason': 'Not supported on Frame'}}]), \
patch.object(frame_decky_store.urllib.request, 'urlopen') as download:
def no_ssh(*a, **k):
self.fail('must not mutate headset for known hardware blocker')
with self.assertRaisesRegex(ValueError, 'Not supported on Frame'):
frame_decky_store.change(no_ssh, 'install', 42)
download.assert_not_called()
def test_missing_audit_data_is_unverified(self):
with patch.object(compatibility, 'DATA', Path('/nonexistent/framey-audit.json')):
self.assertEqual(compatibility.lookup(12, 'a'*64, '1.0')['status'], 'unverified')