diff --git a/libs/langgraph/.gitignore b/libs/langgraph/.gitignore index 132fa2e54..0dbce5c72 100644 --- a/libs/langgraph/.gitignore +++ b/libs/langgraph/.gitignore @@ -1 +1,2 @@ .langgraph_api/ +.devserver.pid diff --git a/libs/langgraph/Makefile b/libs/langgraph/Makefile index 83dd44132..cee283617 100644 --- a/libs/langgraph/Makefile +++ b/libs/langgraph/Makefile @@ -41,20 +41,36 @@ stop-postgres: docker compose -f tests/compose-postgres.yml down -v start-dev-server: - poetry run langgraph dev --config integration_tests/example_app/langgraph.json --no-browser + poetry run langgraph dev --config tests/example_app/langgraph.json --no-browser & + @echo "Dev server started." + @echo "Dev server PID: $$!" > .devserver.pid + +stop-dev-server: + @if [ -f .devserver.pid ]; then \ + kill `cat .devserver.pid` && rm .devserver.pid; \ + echo "Dev server stopped."; \ + else \ + echo "No dev server PID file found."; \ + fi TEST ?= . test: - make start-postgres && poetry run pytest $(TEST); \ + make start-postgres &&\ + make start-dev-server &&\ + poetry run pytest $(TEST); \ EXIT_CODE=$$?; \ make stop-postgres; \ + make stop-dev-server; \ exit $$EXIT_CODE test_parallel: - make start-postgres && poetry run pytest -n auto --dist worksteal $(TEST); \ + make start-postgres &&\ + make start-dev-server &&\ + poetry run pytest -n auto --dist worksteal $(TEST); \ EXIT_CODE=$$?; \ make stop-postgres; \ + make stop-dev-server; \ exit $$EXIT_CODE integration_tests: @@ -68,9 +84,12 @@ MAXFAIL_ARGS := $(if $(MAXFAIL),--maxfail $(MAXFAIL),) XDIST_ARGS := $(if $(WORKERS),-x $(XDIST_ARGS),) test_watch: - make start-postgres && poetry run ptw . -- --ff -vv $(XDIST_ARGS) $(MAXFAIL_ARGS) $(TEST); \ + make start-postgres &&\ + make start-dev-server &&\ + poetry run ptw . -- --ff -vv $(XDIST_ARGS) $(MAXFAIL_ARGS) $(TEST); \ EXIT_CODE=$$?; \ make stop-postgres; \ + make stop-dev-server; \ exit $$EXIT_CODE test_watch_all: diff --git a/libs/langgraph/tests/conftest.py b/libs/langgraph/tests/conftest.py index 633280b87..5bfec63bd 100644 --- a/libs/langgraph/tests/conftest.py +++ b/libs/langgraph/tests/conftest.py @@ -1,13 +1,10 @@ -import subprocess import sys -import time from collections.abc import AsyncIterator from contextlib import asynccontextmanager from typing import Optional from uuid import UUID, uuid4 import pytest -import requests from langchain_core import __version__ as core_version from packaging import version from psycopg import AsyncConnection, Connection @@ -444,55 +441,6 @@ async def awith_store(store_name: Optional[str]) -> AsyncIterator[BaseStore]: raise NotImplementedError(f"Unknown store {store_name}") -@pytest.fixture(scope="session", autouse=True) -def dev_server(): - # Command to start the dev server - if sys.version_info < (3, 11): - # We'll skip these tests - yield - return - cmd = [ - "poetry", - "run", - "langgraph", - "dev", - "--config", - "tests/example_app/langgraph.json", - "--no-browser", - "--port", - "2024", - ] - server = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - url = "http://localhost:2024/ok" - timeout = 30 - start = time.time() - while True: - if server.poll() is not None: - out, err = server.communicate() - raise RuntimeError( - f"Dev server exited early.\nstdout: {out.decode()}\nstderr: {err.decode()}" - ) - try: - resp = requests.get(url) - if resp.status_code == 200: - break - except Exception: - pass - if time.time() - start > timeout: - server.terminate() - out, err = server.communicate() - raise TimeoutError( - f"Timed out waiting for dev server to start.\nstdout: {out.decode()}\nstderr: {err.decode()}" - ) - time.sleep(0.25) - yield - server.terminate() - try: - server.wait(timeout=10) - except subprocess.TimeoutExpired: - server.kill() - - SHALLOW_CHECKPOINTERS_SYNC = ["postgres_shallow"] REGULAR_CHECKPOINTERS_SYNC = [ "memory",