Files
app/tests/test_persimmons_update.py

41 lines
1.9 KiB
Python

import importlib.util
import io
import json
from pathlib import Path
import tempfile
import unittest
import zipfile
ROOT = Path(__file__).resolve().parents[1]
spec = importlib.util.spec_from_file_location('updater', ROOT / 'backend/web/update-extension.py')
updater = importlib.util.module_from_spec(spec)
spec.loader.exec_module(updater)
class UpdateTests(unittest.TestCase):
def test_same_folder_preserves_identity_and_unrelated_files(self):
with tempfile.TemporaryDirectory() as name:
folder = Path(name)
manifest = (ROOT / 'extension/manifest.json').read_bytes()
(folder / 'manifest.json').write_bytes(manifest)
(folder / 'keep.txt').write_text('unrelated')
raw = (ROOT / 'assets/extension.zip').read_bytes()
self.assertEqual(updater.update(folder, raw), json.loads(manifest)['version'])
self.assertEqual((folder / 'keep.txt').read_text(), 'unrelated')
self.assertEqual((folder / 'manifest.json').read_bytes(), manifest)
for bad in ('persimmons-extension/../escape.mjs', '/tmp/escape.mjs'):
archive = io.BytesIO()
with zipfile.ZipFile(archive, 'w') as zipped:
zipped.writestr('persimmons-extension/manifest.json', manifest)
zipped.writestr(bad, 'bad')
with self.assertRaises(ValueError):
updater.update(folder, archive.getvalue())
archive = io.BytesIO()
with zipfile.ZipFile(archive, 'w') as zipped:
changed = json.loads(manifest)
changed['key'] = 'YWJj'
zipped.writestr('persimmons-extension/manifest.json', json.dumps(changed))
with self.assertRaises(ValueError):
updater.update(folder, archive.getvalue())
self.assertEqual((folder / 'manifest.json').read_bytes(), manifest)