#!/usr/bin/env python3 """Usage: python3 Tests/laravel_regression.py /absolute/path/container-compose""" import json, os, pathlib, subprocess, sys, tempfile binary=str(pathlib.Path(sys.argv[1]).resolve()) with tempfile.TemporaryDirectory(prefix='container-compose-laravel-',dir=os.environ.get('CONTAINER_COMPOSE_TEST_TMPDIR', '/Volumes/ChatGPT' if pathlib.Path('/Volumes/ChatGPT').is_dir() else tempfile.gettempdir())) as tmp: root=pathlib.Path(tmp); calls=root/'calls' runtime=root/'container' runtime.write_text('#!'+sys.executable+'\nimport os,json,sys\nwith open(os.environ["CALLS"],"a") as f: f.write(json.dumps(sys.argv[1:])+"\\n")\n') runtime.chmod(0o755) env=dict(os.environ,PATH=str(root)+':'+os.environ.get('PATH',''),CALLS=str(calls),UID='1234',GID='2345') path=root/'compose.yaml' def run(command='config'): return subprocess.run([binary,'-f',str(path),command],env=env,text=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,timeout=10) cases=[('', 'Compose file is empty'),(' # comment\n','mapping at its root'),('name: wrong\n','Missing top-level services'),('services: []\n','nonempty mapping'),('services: {}\n','nonempty mapping'),('services: [\n','Invalid YAML')] for content,expected in cases: path.write_text(content);p=run();assert p.returncode!=0 and expected in p.stdout and path.name in p.stdout,p.stdout path.write_text((pathlib.Path(__file__).parent/'Fixtures/laravel.yaml').read_text()) p=run();assert p.returncode==0 and 'Validated 4 services' in p.stdout,p.stdout p=run('build');assert p.returncode==0,p.stdout records=[json.loads(x) for x in calls.read_text().splitlines()] assert len(records)==2,records assert records[0]==['build','-t','laravel-nginx:latest',str((root/'docker/nginx').resolve())],records assert records[1]==['build','-t','laravel-web:latest','--build-arg','gid=2345','--build-arg','uid=1234',str((root/'docker/php').resolve())],records calls.write_text('') path.write_text('services:\n web:\n build:\n context: .\n args: ["UID", "LITERAL=hello world"]\n') p=run('build');assert p.returncode==0,p.stdout records=[json.loads(x) for x in calls.read_text().splitlines()] assert ['--build-arg','UID=1234','--build-arg','LITERAL=hello world']==records[0][3:7],records print('PASS: 9 Laravel and file diagnostic cases')