Files
2026-10-04 20:12:06 +08:00

47 lines
2.3 KiB
Python

"""Exercise the public entry point without network access or installation."""
import json
import os
import pathlib
import subprocess
import tempfile
import unittest
class InstallEntryTests(unittest.TestCase):
def test_engine_matches_selected_release_and_arguments_are_preserved(self):
for args, release in [
(['install'], 'latest/download'),
(['install', '--version', 'v0.4.2-preview.3'], 'download/v0.4.2-preview.3'),
(['update', '--version=v0.4.2-preview.3'], 'download/v0.4.2-preview.3'),
]:
with self.subTest(args=args):
result, calls = self.run_entry(args)
self.assertEqual(result.returncode, 0, result.stderr)
self.assertEqual(calls['url'], f'https://github.com/TestOwner/framely/releases/{release}/bootstrap.py')
self.assertEqual(calls['args'], ['--repo', 'TestOwner/framely', *args])
def test_invalid_or_missing_version_stops_before_download(self):
for args in [['install', '--version'], ['install', '--version='], ['install', '--version', '../bad']]:
with self.subTest(args=args):
result, calls = self.run_entry(args)
self.assertNotEqual(result.returncode, 0)
self.assertEqual(calls, {})
def run_entry(self, args):
with tempfile.TemporaryDirectory() as temp:
root = pathlib.Path(temp)
log = root / 'calls.json'
curl = root / 'curl'
curl.write_text('''#!/usr/bin/env python3
import json, os, pathlib, sys
args = sys.argv[1:]
pathlib.Path(os.environ['FRAMELY_ENTRY_LOG']).write_text(json.dumps({'url': args[-1]}))
pathlib.Path(args[args.index('--output') + 1]).write_text("import json,os,pathlib,sys; p=pathlib.Path(os.environ['FRAMELY_ENTRY_LOG']); d=json.loads(p.read_text()); d['args']=sys.argv[1:]; p.write_text(json.dumps(d))")
''')
curl.chmod(0o755)
env = dict(os.environ, PATH=str(root) + os.pathsep + os.environ['PATH'],
FRAMELY_REPOSITORY='TestOwner/framely', FRAMELY_ENTRY_LOG=str(log))
result = subprocess.run(['bash', str(pathlib.Path(__file__).parents[1] / 'install.sh'), *args],
env=env, text=True, capture_output=True, timeout=10)
return result, json.loads(log.read_text()) if log.exists() else {}