@a2a Feature: A2A local facade coverage boost — uncovered validation paths As a developer maintaining the A2A local facade I want all error-handling and validation paths exercised So that edge-case regressions are caught early # --------------------------------------------------------------- # Constructor validation (line 82) # --------------------------------------------------------------- Scenario: Constructing A2aLocalFacade with a non-dict raises TypeError When I try to create an A2aLocalFacade with a non-dict services argument Then a TypeError should be raised with message "services must be a dict or None" # --------------------------------------------------------------- # plan.execute — empty plan_id with service wired (line 256) # --------------------------------------------------------------- Scenario: plan.execute with empty plan_id and wired service returns error Given a coverage-boost facade with a mock PlanLifecycleService When I dispatch coverage-boost operation "plan.execute" with params {"plan_id": ""} Then the coverage-boost response status should be "error" And the coverage-boost response error code should be "INTERNAL_ERROR" And the coverage-boost response error message should contain "plan_id is required" Scenario: plan.execute with missing plan_id param and wired service returns error Given a coverage-boost facade with a mock PlanLifecycleService When I dispatch coverage-boost operation "plan.execute" with params {} Then the coverage-boost response status should be "error" And the coverage-boost response error code should be "INTERNAL_ERROR" And the coverage-boost response error message should contain "plan_id is required" # --------------------------------------------------------------- # plan.status — empty plan_id with service wired (line 266) # --------------------------------------------------------------- Scenario: plan.status with empty plan_id and wired service returns error Given a coverage-boost facade with a mock PlanLifecycleService When I dispatch coverage-boost operation "plan.status" with params {"plan_id": ""} Then the coverage-boost response status should be "error" And the coverage-boost response error code should be "INTERNAL_ERROR" And the coverage-boost response error message should contain "plan_id is required" Scenario: plan.status with missing plan_id param and wired service returns error Given a coverage-boost facade with a mock PlanLifecycleService When I dispatch coverage-boost operation "plan.status" with params {} Then the coverage-boost response status should be "error" And the coverage-boost response error code should be "INTERNAL_ERROR" And the coverage-boost response error message should contain "plan_id is required" # --------------------------------------------------------------- # plan.diff — empty plan_id with service wired (line 281) # --------------------------------------------------------------- Scenario: plan.diff with empty plan_id and wired service returns error Given a coverage-boost facade with a mock PlanLifecycleService When I dispatch coverage-boost operation "plan.diff" with params {"plan_id": ""} Then the coverage-boost response status should be "error" And the coverage-boost response error code should be "INTERNAL_ERROR" And the coverage-boost response error message should contain "plan_id is required" Scenario: plan.diff with missing plan_id param and wired service returns error Given a coverage-boost facade with a mock PlanLifecycleService When I dispatch coverage-boost operation "plan.diff" with params {} Then the coverage-boost response status should be "error" And the coverage-boost response error code should be "INTERNAL_ERROR" And the coverage-boost response error message should contain "plan_id is required" # --------------------------------------------------------------- # plan.apply — empty plan_id with service wired (line 295) # --------------------------------------------------------------- Scenario: plan.apply with empty plan_id and wired service returns error Given a coverage-boost facade with a mock PlanLifecycleService When I dispatch coverage-boost operation "plan.apply" with params {"plan_id": ""} Then the coverage-boost response status should be "error" And the coverage-boost response error code should be "INTERNAL_ERROR" And the coverage-boost response error message should contain "plan_id is required" Scenario: plan.apply with missing plan_id param and wired service returns error Given a coverage-boost facade with a mock PlanLifecycleService When I dispatch coverage-boost operation "plan.apply" with params {} Then the coverage-boost response status should be "error" And the coverage-boost response error code should be "INTERNAL_ERROR" And the coverage-boost response error message should contain "plan_id is required" # --------------------------------------------------------------- # message/send validation (lines 468-471) # --------------------------------------------------------------- Scenario: message/send with empty session_id returns validation error Given a coverage-boost facade with a mock PlanLifecycleService When I dispatch coverage-boost operation "message/send" with params {"session_id": "", "message": "hi"} Then the coverage-boost response status should be "error" And the coverage-boost response error code should be "INTERNAL_ERROR" And the coverage-boost response error message should contain "session_id is required" Scenario: message/send with empty message returns validation error Given a coverage-boost facade with a mock PlanLifecycleService When I dispatch coverage-boost operation "message/send" with params {"session_id": "s1", "message": ""} Then the coverage-boost response status should be "error" And the coverage-boost response error code should be "INTERNAL_ERROR" And the coverage-boost response error message should contain "message is required" # --------------------------------------------------------------- # Static DI-fallback resolvers (lines 411-425, 434-452) # --------------------------------------------------------------- Scenario: _build_actor_resolver_for_session_workflow falls back when DI container raises When I call the static resolver builder with a failing DI container Then the static resolver result should be None Scenario: _build_actor_options_resolver_for_session_workflow falls back when DI container raises When I call the static options-resolver builder with a failing DI container Then the static options-resolver result should be None # --------------------------------------------------------------- # Service accessor: _provider_registry property (line 160) # --------------------------------------------------------------- Scenario: _provider_registry property reads from services dict Given a coverage-boost facade wired with a mock ProviderRegistry When I access the _provider_registry property Then the provider registry accessor should return the mock