"""Read-only metadata fixtures; no real release artifacts or signing keys.""" import copy import importlib.util from pathlib import Path import unittest spec = importlib.util.spec_from_file_location('binding', Path(__file__).parents[1] / 'check-release-source-binding.py') binding = importlib.util.module_from_spec(spec) spec.loader.exec_module(binding) COMMIT = 'a' * 40 VERSION = '2.1.0-beta' class SourceBindingTests(unittest.TestCase): def setUp(self): self.manifest = {'version': VERSION, 'source_commit': COMMIT, 'components': [{ 'new_version': VERSION, 'download_url': 'https://registry.invalid/org/project/releases/download/v' + VERSION + '/archipelago', }]} def check(self, manifest=None, backend=VERSION, frontend=VERSION): binding.validate(manifest or self.manifest, COMMIT, backend, frontend) def test_matching_reviewed_source(self): self.check() def test_stale_manifest_and_component(self): for target in ['manifest', 'component']: with self.subTest(target=target): value = copy.deepcopy(self.manifest) if target == 'manifest': value['version'] = '1.9.1-alpha' else: value['components'][0]['new_version'] = '1.9.1-alpha' with self.assertRaises(ValueError): self.check(value) def test_backend_frontend_or_source_mismatch(self): with self.assertRaises(ValueError): self.check(backend='1.9.1-alpha') with self.assertRaises(ValueError): self.check(frontend='1.9.1-alpha') self.manifest['source_commit'] = 'b' * 40 with self.assertRaises(ValueError): self.check() def test_stale_or_unbound_urls(self): for url in ['https://registry.invalid/releases/download/v1.9.1-alpha/archipelago', 'http://registry.invalid/releases/download/v2.1.0-beta/archipelago', 'https://registry.invalid/releases/download/v2.1.0-beta/../old', 'https://registry.invalid/releases/download/v2.1.0-beta/app?old=1']: with self.subTest(url=url): self.manifest['components'][0]['download_url'] = url with self.assertRaises(ValueError): self.check() if __name__ == '__main__': unittest.main()