Files
Interview-Notebook/website/deploy/test_package_site.py

55 lines
2.3 KiB
Python

"""Verify Unicode names, exact bytes and reproducibility of release archives."""
import hashlib
import json
import tempfile
import unittest
import zipfile
from pathlib import Path
from package_site import create_archive
class ArchiveTests(unittest.TestCase):
def fixture(self, root):
source = root / 'dist'
files = {'index.html': b'<h1>CS-Notes</h1>', 'notes/大模型应用.md': '# 中文文章'.encode(),
'notes/Java 基础.md': b'Java', '.nojekyll': b''}
for name, data in files.items():
path = source / name
path.parent.mkdir(parents=True, exist_ok=True)
path.write_bytes(data)
manifest = {'files': [{'path': name, 'bytes': len(data),
'sha256': hashlib.sha256(data).hexdigest()} for name, data in files.items()]}
(source / 'asset-manifest.json').write_text(json.dumps(manifest, ensure_ascii=False))
return source, files
def test_unicode_roundtrip_and_reproducible_bytes(self):
with tempfile.TemporaryDirectory() as directory:
root = Path(directory)
source, files = self.fixture(root)
first, second = root / 'first.zip', root / 'second.zip'
self.assertEqual(create_archive(source, first), len(files) + 1)
create_archive(source, second)
self.assertEqual(first.read_bytes(), second.read_bytes())
with zipfile.ZipFile(first) as archive:
for name, data in files.items():
self.assertEqual(archive.read(name), data)
if not name.isascii():
self.assertTrue(archive.getinfo(name).flag_bits & 0x800)
def test_modified_file_is_rejected_without_replacing_previous_archive(self):
with tempfile.TemporaryDirectory() as directory:
root = Path(directory)
source, _ = self.fixture(root)
output = root / 'release.zip'
create_archive(source, output)
previous = output.read_bytes()
(source / 'notes/大模型应用.md').write_text('modified')
with self.assertRaisesRegex(ValueError, '校验不一致'):
create_archive(source, output)
self.assertEqual(output.read_bytes(), previous)
if __name__ == '__main__':
unittest.main()