195fbac109
CI / lint (pull_request) Successful in 40s
CI / helm (pull_request) Successful in 38s
CI / build (pull_request) Successful in 48s
CI / quality (pull_request) Successful in 1m0s
CI / typecheck (pull_request) Successful in 1m29s
CI / security (pull_request) Successful in 1m28s
CI / push-validation (pull_request) Successful in 20s
CI / unit_tests (pull_request) Successful in 5m8s
CI / docker (pull_request) Successful in 1m27s
CI / integration_tests (pull_request) Successful in 8m39s
CI / coverage (pull_request) Successful in 11m1s
CI / status-check (pull_request) Successful in 3s
Add domain-scenario Gherkin tags to all A2A, session, and CLI feature files (30 files) so tests can be filtered individually via behave. - 8 A2A feature files: @a2a tag - 7 session feature files: @session tag - 15 CLI feature files: @cli tag ISSUES CLOSED: #9124
169 lines
8.3 KiB
Gherkin
169 lines
8.3 KiB
Gherkin
@a2a
|
|
Feature: A2A local facade wiring to live services
|
|
As a client of the A2A local facade
|
|
I want operations to route to real application services
|
|
So that the facade delegates to live implementations
|
|
|
|
# ---------------------------------------------------------------
|
|
# Session wiring
|
|
# ---------------------------------------------------------------
|
|
|
|
Scenario: session.create delegates to SessionService
|
|
Given a wired A2aLocalFacade with a mock SessionService
|
|
When I dispatch wired operation "session.create" with params {"actor_name": "local/test-actor"}
|
|
Then the wired response status should be "ok"
|
|
And wired response data key "session_id" equals "MOCK-SESSION-001"
|
|
And wired response data key "status" equals "created"
|
|
|
|
Scenario: session.create with existing session_id is idempotent
|
|
Given a wired A2aLocalFacade with a mock SessionService
|
|
When I dispatch wired operation "session.create" with params {"session_id": "EXISTING-SESSION-999"}
|
|
Then the wired response status should be "ok"
|
|
And wired response data key "session_id" equals "EXISTING-SESSION-999"
|
|
And wired response data key "status" equals "created"
|
|
And the mock SessionService create should not have been called
|
|
|
|
Scenario: session.close delegates to SessionService
|
|
Given a wired A2aLocalFacade with a mock SessionService
|
|
When I dispatch wired operation "session.close" with params {"session_id": "MOCK-SESSION-001"}
|
|
Then the wired response status should be "ok"
|
|
And wired response data key "status" equals "closed"
|
|
|
|
Scenario: session.close without session_id returns error
|
|
Given a wired A2aLocalFacade with a mock SessionService
|
|
When I dispatch wired operation "session.close" with params {}
|
|
Then the wired response status should be "error"
|
|
|
|
# ---------------------------------------------------------------
|
|
# Plan lifecycle wiring
|
|
# ---------------------------------------------------------------
|
|
|
|
Scenario: plan.create delegates to PlanLifecycleService
|
|
Given a wired A2aLocalFacade with a mock PlanLifecycleService
|
|
When I dispatch wired operation "plan.create" with params {"action_name": "local/test-action"}
|
|
Then the wired response status should be "ok"
|
|
And wired response data key "plan_id" equals "MOCK-PLAN-001"
|
|
And wired response data key "status" equals "created"
|
|
|
|
Scenario: plan.create without action_name returns error
|
|
Given a wired A2aLocalFacade with a mock PlanLifecycleService
|
|
When I dispatch wired operation "plan.create" with params {}
|
|
Then the wired response status should be "error"
|
|
|
|
Scenario: plan.execute delegates to PlanLifecycleService
|
|
Given a wired A2aLocalFacade with a mock PlanLifecycleService
|
|
When I dispatch wired operation "plan.execute" with params {"plan_id": "MOCK-PLAN-001"}
|
|
Then the wired response status should be "ok"
|
|
And wired response data key "plan_id" equals "MOCK-PLAN-001"
|
|
|
|
Scenario: plan.status delegates to PlanLifecycleService
|
|
Given a wired A2aLocalFacade with a mock PlanLifecycleService
|
|
When I dispatch wired operation "plan.status" with params {"plan_id": "MOCK-PLAN-001"}
|
|
Then the wired response status should be "ok"
|
|
And wired response data key "plan_id" equals "MOCK-PLAN-001"
|
|
And wired response data key "phase" equals "strategize"
|
|
|
|
Scenario: plan.diff delegates to PlanLifecycleService
|
|
Given a wired A2aLocalFacade with a mock PlanLifecycleService
|
|
When I dispatch wired operation "plan.diff" with params {"plan_id": "MOCK-PLAN-001"}
|
|
Then the wired response status should be "ok"
|
|
And wired response data key "plan_id" equals "MOCK-PLAN-001"
|
|
|
|
Scenario: plan.apply delegates to PlanLifecycleService
|
|
Given a wired A2aLocalFacade with a mock PlanLifecycleService
|
|
When I dispatch wired operation "plan.apply" with params {"plan_id": "MOCK-PLAN-001"}
|
|
Then the wired response status should be "ok"
|
|
And wired response data key "plan_id" equals "MOCK-PLAN-001"
|
|
|
|
# ---------------------------------------------------------------
|
|
# Registry wiring
|
|
# ---------------------------------------------------------------
|
|
|
|
Scenario: registry.list_tools delegates to ToolRegistry
|
|
Given a wired A2aLocalFacade with a mock ToolRegistry
|
|
When I dispatch wired operation "registry.list_tools" with params {}
|
|
Then the wired response status should be "ok"
|
|
And wired response data should contain tools list with 2 items
|
|
|
|
Scenario: registry.list_resources delegates to ResourceRegistryService
|
|
Given a wired A2aLocalFacade with a mock ResourceRegistryService
|
|
When I dispatch wired operation "registry.list_resources" with params {}
|
|
Then the wired response status should be "ok"
|
|
And wired response data should contain resources list with 1 items
|
|
|
|
# ---------------------------------------------------------------
|
|
# Context stub
|
|
# ---------------------------------------------------------------
|
|
|
|
Scenario: context.get returns stub pending ACMS pipeline
|
|
Given a wired A2aLocalFacade with no services
|
|
When I dispatch wired operation "context.get" with params {}
|
|
Then the wired response status should be "ok"
|
|
And wired response data key "stub" equals "True"
|
|
|
|
# ---------------------------------------------------------------
|
|
# Event wiring
|
|
# ---------------------------------------------------------------
|
|
|
|
Scenario: event.subscribe delegates to A2aEventQueue
|
|
Given a wired A2aLocalFacade with a mock A2aEventQueue
|
|
When I dispatch wired operation "event.subscribe" with params {}
|
|
Then the wired response status should be "ok"
|
|
And wired response data key "status" equals "subscribed"
|
|
And wired response data key "subscription_id" should not be empty
|
|
|
|
# ---------------------------------------------------------------
|
|
# Error mapping
|
|
# ---------------------------------------------------------------
|
|
|
|
Scenario: NOT_FOUND error code for missing resources
|
|
Given a wired A2aLocalFacade with a raising SessionService for not-found
|
|
When I dispatch wired operation "session.close" with params {"session_id": "nonexistent"}
|
|
Then the wired response status should be "error"
|
|
And wired response error code should be "NOT_FOUND"
|
|
|
|
Scenario: VALIDATION_ERROR code for validation failures
|
|
Given a wired A2aLocalFacade with a raising service for validation-error
|
|
When I dispatch wired operation "plan.create" with params {"action_name": "bad"}
|
|
Then the wired response status should be "error"
|
|
And wired response error code should be "VALIDATION_ERROR"
|
|
|
|
Scenario: PLAN_ERROR code for plan failures
|
|
Given a wired A2aLocalFacade with a raising service for plan-error
|
|
When I dispatch wired operation "plan.execute" with params {"plan_id": "P1"}
|
|
Then the wired response status should be "error"
|
|
And wired response error code should be "PLAN_ERROR"
|
|
|
|
Scenario: INVALID_STATE code for business rule violations
|
|
Given a wired A2aLocalFacade with a raising service for invalid-state
|
|
When I dispatch wired operation "plan.apply" with params {"plan_id": "P1"}
|
|
Then the wired response status should be "error"
|
|
And wired response error code should be "INVALID_STATE"
|
|
|
|
# ---------------------------------------------------------------
|
|
# Fallback stubs when no service is wired
|
|
# ---------------------------------------------------------------
|
|
|
|
Scenario: session.create stub when no service wired
|
|
Given a wired A2aLocalFacade with no services
|
|
When I dispatch wired operation "session.create" with params {}
|
|
Then the wired response status should be "ok"
|
|
And wired response data key "status" equals "created"
|
|
|
|
Scenario: plan.create stub when no service wired
|
|
Given a wired A2aLocalFacade with no services
|
|
When I dispatch wired operation "plan.create" with params {}
|
|
Then the wired response status should be "ok"
|
|
And wired response data key "status" equals "created"
|
|
|
|
Scenario: registry.list_tools stub when no service wired
|
|
Given a wired A2aLocalFacade with no services
|
|
When I dispatch wired operation "registry.list_tools" with params {}
|
|
Then the wired response status should be "ok"
|
|
|
|
Scenario: event.subscribe stub when no service wired
|
|
Given a wired A2aLocalFacade with no services
|
|
When I dispatch wired operation "event.subscribe" with params {}
|
|
Then the wired response status should be "ok"
|
|
And wired response data key "status" equals "subscribed"
|