import os import shlex import shutil import subprocess import sys from pathlib import Path import pytest ROOT = Path(__file__).resolve().parents[1] @pytest.mark.parametrize( ("configured_port", "environment_port", "argument_port", "expected_port"), [ (None, None, None, "8000"), ("8002", None, None, "8002"), ("8123", None, None, "8123"), ("8002", "8124", None, "8124"), ("8002", "8124", "8125", "8125"), ], ) def test_dev_uses_the_same_backend_port_for_both_servers( tmp_path: Path, configured_port: str | None, environment_port: str | None, argument_port: str | None, expected_port: str, ): shutil.copyfile(ROOT / "Makefile", tmp_path / "Makefile") secret = "fixture-secret-must-not-be-exported-or-printed" config = f"AI_PLATFORM_OPENAI_API_KEY={secret}\n" if configured_port is not None: config += f'BACKEND_PORT="{configured_port}"\n' (tmp_path / ".env").write_text(config) # Only the port lookup executes during dry-run; bypass uv project discovery in this fixture. uv = tmp_path / "uv" uv.write_text(f'#!/bin/sh\nshift 3\nexec {shlex.quote(sys.executable)} "$@"\n') uv.chmod(0o700) environment = os.environ.copy() for name in ("BACKEND_PORT", "MAKEFLAGS", "MFLAGS", "MAKEOVERRIDES"): environment.pop(name, None) environment["PATH"] = f"{tmp_path}{os.pathsep}{environment['PATH']}" if environment_port is not None: environment["BACKEND_PORT"] = environment_port command = ["make", "--dry-run", "dev"] if argument_port is not None: command.append(f"BACKEND_PORT={argument_port}") result = subprocess.run( command, cwd=tmp_path, env=environment, text=True, capture_output=True, check=False, timeout=30, ) assert result.returncode == 0, result.stderr assert f"--port {expected_port}" in result.stdout assert f"BACKEND_INTERNAL_URL=http://127.0.0.1:{expected_port} bun" in result.stdout assert "docker compose up -d --wait postgres" in result.stdout assert "alembic" not in result.stdout assert secret not in result.stdout + result.stderr assert "AI_PLATFORM_OPENAI_API_KEY" not in result.stdout + result.stderr