From d5f73fe37bdade6f2928767266f9bbe6283b98f9 Mon Sep 17 00:00:00 2001 From: Tat Dat Duong Date: Thu, 17 Apr 2025 22:21:23 +0200 Subject: [PATCH] Add tests --- libs/cli/langgraph_cli/config.py | 13 +++++---- libs/cli/tests/unit_tests/test_config.py | 35 ++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/libs/cli/langgraph_cli/config.py b/libs/cli/langgraph_cli/config.py index 7b18b4a4d..8170062fe 100644 --- a/libs/cli/langgraph_cli/config.py +++ b/libs/cli/langgraph_cli/config.py @@ -1048,6 +1048,8 @@ def python_config_to_docker( else "" ) + docker_tag = config.get("_INTERNAL_docker_tag") or config["python_version"] + # collect dependencies pypi_deps = [dep for dep in config["dependencies"] if not dep.startswith(".")] local_deps = _assemble_local_deps(config_path, config) @@ -1168,7 +1170,7 @@ ADD {relpath} /deps/{name} ) docker_file_contents = [ - f"FROM {base_image}:{base_docker_tag or config['python_version']}", + f"FROM {base_image}:{docker_tag}", "", os.linesep.join(config["dockerfile_lines"]), "", @@ -1203,10 +1205,10 @@ def node_config_to_docker( config_path: pathlib.Path, config: Config, base_image: str, - base_docker_tag: Optional[str] = None, ) -> tuple[str, dict[str, str]]: faux_path = f"/deps/{config_path.parent.name}" install_cmd = _get_node_pm_install_cmd(config_path, config) + docker_tag = config.get("_INTERNAL_docker_tag") or config["node_version"] env_vars: list[str] = [] @@ -1233,7 +1235,7 @@ def node_config_to_docker( env_vars.append(f"ENV LANGSERVE_GRAPHS='{json.dumps(config['graphs'])}'") docker_file_contents = [ - f"FROM {base_image}:{base_docker_tag or config['node_version']}", + f"FROM {base_image}:{docker_tag}", "", os.linesep.join(config["dockerfile_lines"]), "", @@ -1275,14 +1277,13 @@ def config_to_docker( config_path: pathlib.Path, config: Config, base_image: Optional[str] = None, - base_docker_tag: Optional[str] = None, ) -> tuple[str, dict[str, str]]: base_image = base_image or default_base_image(config) if config.get("node_version") and not config.get("python_version"): - return node_config_to_docker(config_path, config, base_image, base_docker_tag) + return node_config_to_docker(config_path, config, base_image) - return python_config_to_docker(config_path, config, base_image, base_docker_tag) + return python_config_to_docker(config_path, config, base_image) def config_to_compose( diff --git a/libs/cli/tests/unit_tests/test_config.py b/libs/cli/tests/unit_tests/test_config.py index 0249510ab..cb25eee30 100644 --- a/libs/cli/tests/unit_tests/test_config.py +++ b/libs/cli/tests/unit_tests/test_config.py @@ -29,6 +29,7 @@ def test_validate_config(): } actual_config = validate_config(expected_config) expected_config = { + "_INTERNAL_docker_tag": None, "python_version": "3.11", "node_version": None, "pip_config_file": None, @@ -47,6 +48,7 @@ def test_validate_config(): # full config env = ".env" expected_config = { + "_INTERNAL_docker_tag": None, "python_version": "3.12", "node_version": None, "pip_config_file": "pipconfig.txt", @@ -567,6 +569,39 @@ RUN (test ! -f /api/langgraph_api/js/build.mts && echo "Prebuild script not foun assert additional_contexts == {} +def test_config_to_docker_nodejs_internal_docker_tag(): + graphs = {"agent": "./graphs/agent.js:graph"} + actual_docker_stdin, additional_contexts = config_to_docker( + PATH_TO_CONFIG, + validate_config( + { + "node_version": "20", + "graphs": graphs, + "dockerfile_lines": ["ARG meow", "ARG foo"], + "auth": {"path": "./graphs/auth.mts:auth"}, + "ui": {"agent": "./graphs/agent.ui.jsx"}, + "ui_config": {"shared": ["nuqs"]}, + "_INTERNAL_docker_tag": "my-tag", + } + ), + "langchain/langgraphjs-api", + ) + expected_docker_stdin = """FROM langchain/langgraphjs-api:my-tag +ARG meow +ARG foo +ADD . /deps/unit_tests +RUN cd /deps/unit_tests && npm i +ENV LANGGRAPH_AUTH='{"path": "./graphs/auth.mts:auth"}' +ENV LANGGRAPH_UI='{"agent": "./graphs/agent.ui.jsx"}' +ENV LANGGRAPH_UI_CONFIG='{"shared": ["nuqs"]}' +ENV LANGSERVE_GRAPHS='{"agent": "./graphs/agent.js:graph"}' +WORKDIR /deps/unit_tests +RUN (test ! -f /api/langgraph_api/js/build.mts && echo "Prebuild script not found, skipping") || tsx /api/langgraph_api/js/build.mts""" + + assert clean_empty_lines(actual_docker_stdin) == expected_docker_stdin + assert additional_contexts == {} + + def test_config_to_docker_gen_ui_python(): graphs = {"agent": "./agent.py:graph"} actual_docker_stdin, additional_contexts = config_to_docker(