Files
cleveragents-core/robot/component_resolver.robot
freemo f6d27de1cd
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 15s
CI / build (pull_request) Successful in 15s
CI / quality (pull_request) Successful in 18s
CI / security (pull_request) Successful in 34s
CI / typecheck (pull_request) Successful in 36s
CI / unit_tests (pull_request) Successful in 2m30s
CI / integration_tests (pull_request) Successful in 3m6s
CI / docker (pull_request) Successful in 40s
CI / coverage (pull_request) Successful in 4m28s
CI / benchmark-regression (pull_request) Successful in 29m56s
CI / lint (push) Successful in 13s
CI / quality (push) Successful in 20s
CI / build (push) Successful in 21s
CI / security (push) Successful in 32s
CI / typecheck (push) Successful in 34s
CI / benchmark-regression (push) Has been skipped
CI / unit_tests (push) Successful in 2m38s
CI / integration_tests (push) Successful in 3m12s
CI / docker (push) Successful in 40s
CI / coverage (push) Successful in 4m27s
CI / benchmark-publish (push) Successful in 16m51s
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