mirror of
https://github.com/SteamFramelyHomebrew/framely.git
synced 2026-10-17 23:01:23 +02:00
47 lines
2.3 KiB
Python
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 {}
|