196 lines
9.9 KiB
Gherkin
196 lines
9.9 KiB
Gherkin
@server @langgraph-platform
|
|
Feature: LangGraph Platform RemoteGraph Integration
|
|
As a server-mode deployment
|
|
I want to manage actor graphs via LangGraph Platform RemoteGraph
|
|
So that actor execution can be delegated to the platform
|
|
|
|
# -----------------------------------------------------------------------
|
|
# RemoteGraphConfig validation
|
|
# -----------------------------------------------------------------------
|
|
|
|
Scenario: RemoteGraphConfig accepts valid HTTPS platform URL
|
|
When I create a basic RemoteGraphConfig with graph_id "strategy-actor" and platform_url "https://langgraph.example.com"
|
|
Then the config graph_id should be "strategy-actor"
|
|
And the config platform_url should be "https://langgraph.example.com"
|
|
And the config api_key_env should be "LANGGRAPH_API_KEY"
|
|
And the config timeout should be 60.0
|
|
|
|
Scenario: RemoteGraphConfig accepts valid HTTP platform URL
|
|
When I create a basic RemoteGraphConfig with graph_id "execution-actor" and platform_url "http://localhost:8123"
|
|
Then the config graph_id should be "execution-actor"
|
|
And the config platform_url should be "http://localhost:8123"
|
|
|
|
Scenario: RemoteGraphConfig accepts custom api_key_env
|
|
When I create a RemoteGraphConfig with custom api_key_env "MY_API_KEY"
|
|
Then the config api_key_env should be "MY_API_KEY"
|
|
|
|
Scenario: RemoteGraphConfig accepts custom timeout
|
|
When I create a RemoteGraphConfig with custom timeout 120.0
|
|
Then the config timeout should be 120.0
|
|
|
|
Scenario: RemoteGraphConfig rejects empty graph_id
|
|
When I try to create a RemoteGraphConfig with empty graph_id
|
|
Then a remote graph config validation error should be raised
|
|
|
|
Scenario: RemoteGraphConfig rejects empty platform_url
|
|
When I try to create a RemoteGraphConfig with empty platform_url
|
|
Then a remote graph config validation error should be raised
|
|
|
|
Scenario: RemoteGraphConfig rejects non-HTTP platform_url
|
|
When I try to create a RemoteGraphConfig with platform_url "ftp://langgraph.example.com"
|
|
Then a remote graph config validation error should be raised
|
|
|
|
Scenario: RemoteGraphConfig rejects non-positive timeout
|
|
When I try to create a RemoteGraphConfig with timeout 0
|
|
Then a remote graph config validation error should be raised
|
|
|
|
Scenario: RemoteGraphConfig is frozen
|
|
When I create a basic RemoteGraphConfig with graph_id "actor" and platform_url "https://langgraph.example.com"
|
|
Then the remote graph config should be immutable
|
|
|
|
# -----------------------------------------------------------------------
|
|
# RemoteGraphManager — not configured (no platform URL)
|
|
# -----------------------------------------------------------------------
|
|
|
|
Scenario: RemoteGraphManager is not available when no platform URL given
|
|
Given a RemoteGraphManager with no platform URL
|
|
Then the manager should not be available
|
|
And the manager platform_url should be None
|
|
|
|
Scenario: RemoteGraphManager register_graph raises when not configured
|
|
Given a RemoteGraphManager with no platform URL
|
|
When I try to register a graph on the unconfigured manager
|
|
Then a RemoteGraphNotAvailableError should be raised
|
|
|
|
Scenario: RemoteGraphManager list_graphs raises when not configured
|
|
Given a RemoteGraphManager with no platform URL
|
|
When I try to list graphs on the unconfigured manager
|
|
Then a RemoteGraphNotAvailableError should be raised
|
|
|
|
Scenario: RemoteGraphManager invoke raises when not configured
|
|
Given a RemoteGraphManager with no platform URL
|
|
When I try to invoke a graph on the unconfigured manager
|
|
Then a RemoteGraphNotAvailableError should be raised
|
|
|
|
Scenario: RemoteGraphManager health_check returns False when not configured
|
|
Given a RemoteGraphManager with no platform URL
|
|
When I call health_check on the unconfigured manager
|
|
Then the health check result should be False
|
|
|
|
# -----------------------------------------------------------------------
|
|
# RemoteGraphManager — configured (with platform URL)
|
|
# -----------------------------------------------------------------------
|
|
|
|
Scenario: RemoteGraphManager is available when platform URL is given
|
|
Given a RemoteGraphManager with platform URL "https://langgraph.example.com"
|
|
Then the manager should be available
|
|
And the manager platform_url should be "https://langgraph.example.com"
|
|
|
|
Scenario: RemoteGraphManager can register a graph
|
|
Given a RemoteGraphManager with platform URL "https://langgraph.example.com"
|
|
When I register a graph with id "strategy-actor"
|
|
Then the graph "strategy-actor" should be registered
|
|
|
|
Scenario: RemoteGraphManager list_graphs returns registered graph IDs
|
|
Given a RemoteGraphManager with platform URL "https://langgraph.example.com"
|
|
When I register graphs with ids "alpha" and "beta"
|
|
Then list_graphs should return "alpha" and "beta" in sorted order
|
|
|
|
Scenario: RemoteGraphManager get_graph_config returns registered config
|
|
Given a RemoteGraphManager with platform URL "https://langgraph.example.com"
|
|
When I register a graph with id "execution-actor"
|
|
Then get_graph_config for "execution-actor" should return the config
|
|
|
|
Scenario: RemoteGraphManager get_graph_config raises for unknown graph
|
|
Given a RemoteGraphManager with platform URL "https://langgraph.example.com"
|
|
When I try to get config for unregistered graph "unknown-actor"
|
|
Then a KeyError should be raised for the unknown graph
|
|
|
|
Scenario: RemoteGraphManager unregister_graph removes a graph
|
|
Given a RemoteGraphManager with platform URL "https://langgraph.example.com"
|
|
When I register then unregister graph "temp-actor"
|
|
Then the graph "temp-actor" should not be registered
|
|
|
|
Scenario: RemoteGraphManager unregister_graph raises for unknown graph
|
|
Given a RemoteGraphManager with platform URL "https://langgraph.example.com"
|
|
When I try to unregister an unknown graph "ghost-actor"
|
|
Then a KeyError should be raised for the unregistered graph
|
|
|
|
Scenario: RemoteGraphManager invoke raises RemoteGraphNotAvailableError for registered graph
|
|
Given a RemoteGraphManager with platform URL "https://langgraph.example.com"
|
|
When I register a graph with id "strategy-actor"
|
|
And I try to invoke the registered graph "strategy-actor"
|
|
Then a RemoteGraphNotAvailableError should be raised for the stub invocation
|
|
|
|
Scenario: RemoteGraphManager invoke raises KeyError for unregistered graph
|
|
Given a RemoteGraphManager with platform URL "https://langgraph.example.com"
|
|
When I try to invoke unregistered graph "missing-actor"
|
|
Then a KeyError should be raised for the missing graph invocation
|
|
|
|
Scenario: RemoteGraphManager health_check returns False for stub
|
|
Given a RemoteGraphManager with platform URL "https://langgraph.example.com"
|
|
When I call health_check on the configured manager
|
|
Then the health check result should be False
|
|
|
|
# -----------------------------------------------------------------------
|
|
# PostgreSQL connection utilities
|
|
# -----------------------------------------------------------------------
|
|
|
|
Scenario: PostgreSQLConnectionConfig accepts valid parameters
|
|
When I create a PostgreSQLConnectionConfig with host "db.example.com" database "cleveragents" username "app" password "secret"
|
|
Then the pg config host should be "db.example.com"
|
|
And the pg config database should be "cleveragents"
|
|
And the pg config username should be "app"
|
|
And the pg config port should be 5432
|
|
And the pg config ssl_mode should be "prefer"
|
|
|
|
Scenario: PostgreSQLConnectionConfig accepts custom port
|
|
When I create a PostgreSQLConnectionConfig with host "db.example.com" database "cleveragents" username "app" password "secret" port 5433
|
|
Then the pg config port should be 5433
|
|
|
|
Scenario: PostgreSQLConnectionConfig to_url returns async URL by default
|
|
When I create a PostgreSQLConnectionConfig with host "db.example.com" database "cleveragents" username "app" password "secret"
|
|
Then the pg config async URL should start with "postgresql+asyncpg://"
|
|
|
|
Scenario: PostgreSQLConnectionConfig to_url returns sync URL when requested
|
|
When I create a PostgreSQLConnectionConfig with host "db.example.com" database "cleveragents" username "app" password "secret"
|
|
Then the pg config sync URL should start with "postgresql://"
|
|
|
|
Scenario: PostgreSQLConnectionConfig rejects empty host
|
|
When I try to create a PostgreSQLConnectionConfig with empty host
|
|
Then a pg config validation error should be raised
|
|
|
|
Scenario: PostgreSQLConnectionConfig rejects invalid port
|
|
When I try to create a PostgreSQLConnectionConfig with port 0
|
|
Then a pg config validation error should be raised
|
|
|
|
Scenario: PostgreSQLConnectionConfig rejects negative pool_size
|
|
When I try to create a PostgreSQLConnectionConfig with pool_size 0
|
|
Then a pg config validation error should be raised
|
|
|
|
Scenario: build_postgresql_url returns async URL
|
|
When I call build_postgresql_url with host "db.example.com" database "mydb" username "user" password "pass"
|
|
Then the built URL should start with "postgresql+asyncpg://"
|
|
And the built URL should contain "db.example.com"
|
|
And the built URL should contain "mydb"
|
|
|
|
Scenario: build_postgresql_url returns sync URL when async_driver is False
|
|
When I call build_postgresql_url with async_driver False
|
|
Then the built URL should start with "postgresql://"
|
|
|
|
Scenario: is_postgresql_url returns True for postgresql URL
|
|
When I check if "postgresql://user:pass@host/db" is a PostgreSQL URL
|
|
Then the pg url check result should be True
|
|
|
|
Scenario: is_postgresql_url returns True for postgresql+asyncpg URL
|
|
When I check if "postgresql+asyncpg://user:pass@host/db" is a PostgreSQL URL
|
|
Then the pg url check result should be True
|
|
|
|
Scenario: is_postgresql_url returns False for sqlite URL
|
|
When I check if "sqlite:///path/to/db.sqlite" is a PostgreSQL URL
|
|
Then the pg url check result should be False
|
|
|
|
Scenario: is_postgresql_url returns False for empty string
|
|
When I check if "" is a PostgreSQL URL
|
|
Then the pg url check result should be False
|