Files
cleveragents-core/robot/component_resolver.robot
freemo f6d27de1cd feat(extensibility): implement pluggable scope chain resolution
Introduce ComponentResolver with a deterministic 3-level scope chain
(plan > project > global) for resolving pluggable Protocol-based
components. The resolver supports caching, thread-safety, config.toml
extension loading, plan metadata loading, introspection APIs, and
security-restricted dynamic imports.

Includes 39 BDD scenarios, 9 Robot Framework integration tests,
ASV benchmarks, and vulture whitelist updates. 100% code coverage
on component_resolver.py; overall coverage at 97.07%.

ISSUES CLOSED: #552
2026-03-07 11:49:14 -05:00

82 lines
3.7 KiB
Plaintext

*** Settings ***
Documentation End-to-end tests for ComponentResolver with 3-level scope chain
Resource ${CURDIR}/common.resource
Suite Setup Setup Test Environment
Suite Teardown Cleanup Test Environment
*** Variables ***
${HELPER} ${CURDIR}/helper_component_resolver.py
*** Test Cases ***
ComponentResolver Global Default Resolution
[Documentation] Verify global default is resolved when no overrides exist
${result}= Run Process ${PYTHON} ${HELPER} global-default cwd=${WORKSPACE}
Log ${result.stdout}
Log ${result.stderr}
Should Be Equal As Integers ${result.rc} 0
Should Contain ${result.stdout} component-resolver-global-ok
ComponentResolver Project Override
[Documentation] Verify project-level override takes precedence over global
${result}= Run Process ${PYTHON} ${HELPER} project-override cwd=${WORKSPACE}
Log ${result.stdout}
Log ${result.stderr}
Should Be Equal As Integers ${result.rc} 0
Should Contain ${result.stdout} component-resolver-project-override-ok
ComponentResolver Plan Override
[Documentation] Verify plan-level override takes highest precedence
${result}= Run Process ${PYTHON} ${HELPER} plan-override cwd=${WORKSPACE}
Log ${result.stdout}
Log ${result.stderr}
Should Be Equal As Integers ${result.rc} 0
Should Contain ${result.stdout} component-resolver-plan-override-ok
ComponentResolver Fallthrough To Global
[Documentation] Verify fallthrough when no plan or project override matches
${result}= Run Process ${PYTHON} ${HELPER} fallthrough cwd=${WORKSPACE}
Log ${result.stdout}
Log ${result.stderr}
Should Be Equal As Integers ${result.rc} 0
Should Contain ${result.stdout} component-resolver-fallthrough-ok
ComponentResolver Missing Component Error
[Documentation] Verify ComponentNotFoundError for unregistered components
${result}= Run Process ${PYTHON} ${HELPER} not-found cwd=${WORKSPACE}
Log ${result.stdout}
Log ${result.stderr}
Should Be Equal As Integers ${result.rc} 0
Should Contain ${result.stdout} component-resolver-not-found-ok
ComponentResolver Caching Behavior
[Documentation] Verify resolution results are cached
${result}= Run Process ${PYTHON} ${HELPER} caching cwd=${WORKSPACE}
Log ${result.stdout}
Log ${result.stderr}
Should Be Equal As Integers ${result.rc} 0
Should Contain ${result.stdout} component-resolver-caching-ok
ComponentResolver Security Module Prefix
[Documentation] Verify disallowed module prefixes are rejected
${result}= Run Process ${PYTHON} ${HELPER} security cwd=${WORKSPACE}
Log ${result.stdout}
Log ${result.stderr}
Should Be Equal As Integers ${result.rc} 0
Should Contain ${result.stdout} component-resolver-security-ok
ComponentResolver Introspection APIs
[Documentation] Verify list_global_types, list_project_types, list_plan_types
${result}= Run Process ${PYTHON} ${HELPER} introspection cwd=${WORKSPACE}
Log ${result.stdout}
Log ${result.stderr}
Should Be Equal As Integers ${result.rc} 0
Should Contain ${result.stdout} component-resolver-introspection-ok
ComponentResolver Clear All
[Documentation] Verify clear removes all registrations
${result}= Run Process ${PYTHON} ${HELPER} clear cwd=${WORKSPACE}
Log ${result.stdout}
Log ${result.stderr}
Should Be Equal As Integers ${result.rc} 0
Should Contain ${result.stdout} component-resolver-clear-ok