Files
cleveragents-core/robot/advanced_context_strategies.robot
T
HAL9000 df26d166c3 test(context): add integration tests for advanced context strategies
Implemented comprehensive integration tests for advanced context strategies:

Behave Feature File (features/advanced_context_strategies.feature):
  - 30+ scenarios covering semantic search, relevance scoring,
    adaptive selection, context fusion, YAML config, and integraton
  - Uses FakeEmbeddings for deterministic testing without real API calls

Step Definitions (features/steps/advanced_context_strategies_steps.py):
  - 50+ step definitions for all test scenarios
  - RelevanceScoringStrategy, AdaptiveContextSelector, ContextFusionStrategy
  - Full type annotations with pyright compliance

Robot Framework Tests (robot/advanced_context_strategies.robot):
  - E2E integration tests for all advanced strategies
  - Helper keywords for test execution and strategy creation

Robot Helper (robot/helper_advanced_context_strategies.py):
  - Strategy creation/configureation functions
  - Fragment and budget management utilities

- Add CHANGELOG.md entry under [Unreleased] section
- Update CONTRIBUTORS.md with contribution entry

ISSUES CLOSED: #7574
2026-06-06 05:52:06 -04:00

280 lines
13 KiB
Plaintext

*** Settings ***
Documentation Advanced Context Strategies Integration Tests
... Tests for semantic search, relevance scoring, adaptive selection,
... and context fusion strategies using FakeEmbeddings.
Library Collections
Library String
Library helper_advanced_context_strategies.py
*** Test Cases ***
Semantic Search Strategy Ranks By Similarity
[Documentation] Verify semantic search ranks fragments by embedding similarity
[Tags] semantic_search integration
${strategy}= Create Semantic Search Strategy
${fragments}= Create Test Fragments
... project://app/db.py database connection 0.5 20 3
... project://app/io.py file input output handler 0.8 15 3
... project://app/sql.py database connection executor 0.6 25 3
${budget}= Create Context Budget 1000 0
${results}= Search With Query ${strategy} database connection ${fragments} ${budget}
Should Be Equal ${results[0].uko_node} project://app/db.py
${count}= Get Length ${results}
Should Be True ${count} >= 1
Semantic Search Filters Low Similarity
[Documentation] Verify semantic search filters low-similarity results
[Tags] semantic_search integration
${strategy}= Create Semantic Search Strategy
${fragments}= Create Test Fragments
... project://app/db.py database handler 0.9 20 3
... project://app/io.py file io module 0.8 15 3
${budget}= Create Context Budget 1000 0
${results}= Search With Query ${strategy} quantum computing ${fragments} ${budget}
Length Should Be ${results} 0
Relevance Scoring Ranks By Score
[Documentation] Verify relevance scoring ranks by relevance score
[Tags] relevance_scoring integration
${strategy}= Create Relevance Scoring Strategy
${fragments}= Create Test Fragments
... project://app/a.py alpha 0.3 10 3
... project://app/b.py beta 0.9 10 3
... project://app/c.py gamma 0.6 10 3
${budget}= Create Context Budget 1000 0
${results}= Assemble With Strategy ${strategy} ${fragments} ${budget}
Should Be Equal ${results[0].uko_node} project://app/b.py
Should Be Equal ${results[1].uko_node} project://app/c.py
Should Be Equal ${results[2].uko_node} project://app/a.py
Relevance Scoring Respects Budget
[Documentation] Verify relevance scoring respects token budget
[Tags] relevance_scoring integration
${strategy}= Create Relevance Scoring Strategy
${fragments}= Create Test Fragments
... project://app/a.py alpha 0.9 100 3
... project://app/b.py beta 0.8 100 3
... project://app/c.py gamma 0.7 100 3
${budget}= Create Context Budget 250 0
${results}= Assemble With Strategy ${strategy} ${fragments} ${budget}
Length Should Be ${results} 2
Adaptive Selector Chooses Best Strategy
[Documentation] Verify adaptive selector chooses best strategy for query
[Tags] adaptive_selector integration
${selector}= Create Adaptive Selector
${fragments}= Create Test Fragments
... project://app/db.py Database connection pool manager 0.5 20 3
... project://app/io.py File input output handler 0.8 15 3
... project://app/sql.py SQL database query executor 0.6 25 3
${budget}= Create Context Budget 1000 0
${strategy_name}= Select Strategy For Query ${selector} database connection
Should Be Equal ${strategy_name} semantic-embedding
Adaptive Selector Falls Back To Relevance
[Documentation] Verify adaptive selector falls back to relevance without query
[Tags] adaptive_selector integration
${selector}= Create Adaptive Selector
${fragments}= Create Test Fragments
... project://app/a.py alpha 0.3 10 3
... project://app/b.py beta 0.9 10 3
${budget}= Create Context Budget 1000 0
${strategy_name}= Select Strategy Without Query ${selector}
Should Be Equal ${strategy_name} relevance-scoring
Context Fusion Combines Results
[Documentation] Verify context fusion combines results from multiple strategies
[Tags] context_fusion integration
${fusion}= Create Context Fusion Strategy semantic-embedding relevance-scoring
${fragments}= Create Test Fragments
... project://app/db.py Database connection pool manager 0.5 20 3
... project://app/io.py File input output handler 0.8 15 3
... project://app/sql.py SQL database query executor 0.6 25 3
${budget}= Create Context Budget 1000 0
${results}= Fuse With Query ${fusion} database ${fragments} ${budget}
${count}= Get Length ${results}
Should Be True ${count} >= 2
Context Fusion Deduplicates
[Documentation] Verify context fusion deduplicates results
[Tags] context_fusion integration
${fusion}= Create Context Fusion Strategy semantic-embedding relevance-scoring
${fragments}= Create Test Fragments
... project://app/a.py database 0.9 100 3
... project://app/b.py database 0.8 100 3
${budget}= Create Context Budget 1000 0
${results}= Fuse With Query ${fusion} database ${fragments} ${budget}
${uko_nodes}= Get Uko Nodes ${results}
${unique_nodes}= Get Length ${uko_nodes}
${total_nodes}= Get Length ${uko_nodes}
Should Be Equal ${unique_nodes} ${total_nodes}
YAML Configuration Loads Semantic Search
[Documentation] Verify YAML configuration loads semantic search strategy
[Tags] yaml_config integration
${config}= Create Dictionary strategy=semantic-embedding min_similarity=0.05
${strategy}= Load Strategy From YAML ${config}
Should Be Equal ${strategy.name} semantic-embedding
YAML Configuration Loads Relevance Scoring
[Documentation] Verify YAML configuration loads relevance scoring strategy
[Tags] yaml_config integration
${config}= Create Dictionary strategy=relevance-scoring
${strategy}= Load Strategy From YAML ${config}
Should Be Equal ${strategy.name} relevance-scoring
YAML Configuration Loads Adaptive Selector
[Documentation] Verify YAML configuration loads adaptive selector
[Tags] yaml_config integration
${config}= Create Dictionary strategy=adaptive-selector fallback=relevance-scoring
${strategy}= Load Strategy From YAML ${config}
Should Be Equal ${strategy.name} adaptive-selector
YAML Configuration Loads Context Fusion
[Documentation] Verify YAML configuration loads context fusion
[Tags] yaml_config integration
${strategies}= Create List semantic-embedding relevance-scoring
${config}= Create Dictionary strategy=context-fusion strategies=${strategies}
${strategy}= Load Strategy From YAML ${config}
Should Be Equal ${strategy.name} context-fusion
ContextAssembler Integrates Advanced Strategies
[Documentation] Verify ContextAssembler integrates advanced strategies
[Tags] integration assembler
${assembler}= Create Context Assembler With Advanced Strategies
${fragments}= Create Test Fragments
... project://app/db.py Database connection pool manager 0.5 20 3
... project://app/io.py File input output handler 0.8 15 3
... project://app/sql.py SQL database query executor 0.6 25 3
${budget}= Create Context Budget 1000 0
${results}= Assemble Context With Query ${assembler} database ${fragments} ${budget}
${count}= Get Length ${results}
Should Be True ${count} > 0
ContextAssembler Respects Strategy Priority
[Documentation] Verify ContextAssembler respects strategy priority
[Tags] integration assembler
${assembler}= Create Context Assembler With Multiple Strategies
${fragments}= Create Test Fragments
... project://app/a.py alpha module 0.5 10 3
... project://app/b.py beta module 0.9 10 3
${budget}= Create Context Budget 1000 0
${results}= Assemble Context With Query ${assembler} module ${fragments} ${budget}
${count}= Get Length ${results}
Should Be True ${count} > 0
Semantic Search Handles Empty Query
[Documentation] Verify semantic search handles empty query gracefully
[Tags] error_handling integration
${strategy}= Create Semantic Search Strategy
${fragments}= Create Test Fragments
... project://app/a.py alpha 0.5 10 3
${budget}= Create Context Budget 1000 0
${results}= Search With Query ${strategy} ${EMPTY} ${fragments} ${budget}
${count}= Get Length ${results}
Should Be True ${count} >= 0
Adaptive Selector Handles Invalid Request
[Documentation] Verify adaptive selector handles invalid request
[Tags] error_handling integration
${selector}= Create Adaptive Selector
${strategy_name}= Select Strategy With Invalid Request ${selector}
Should Not Be Empty ${strategy_name}
*** Keywords ***
Create Semantic Search Strategy
[Documentation] Create a semantic search strategy with FakeEmbeddings
${strategy}= Create Semantic Search Strategy Impl
RETURN ${strategy}
Create Relevance Scoring Strategy
[Documentation] Create a relevance scoring strategy
${strategy}= Create Relevance Scoring Strategy Impl
RETURN ${strategy}
Create Adaptive Selector
[Documentation] Create an adaptive context strategy selector
${selector}= Create Adaptive Selector Impl
RETURN ${selector}
Create Context Fusion Strategy
[Documentation] Create a context fusion strategy
[Arguments] @{strategies}
${fusion}= Create Context Fusion Strategy Impl ${strategies}
RETURN ${fusion}
Create Test Fragments
[Documentation] Create test context fragments
[Arguments] @{args}
${fragments}= Create Test Fragments Impl ${args}
RETURN ${fragments}
Create Context Budget
[Documentation] Create a context budget
[Arguments] ${max_tokens} ${reserved_tokens}
${budget}= Create Context Budget Impl ${max_tokens} ${reserved_tokens}
RETURN ${budget}
Search With Query
[Documentation] Search with a query
[Arguments] ${strategy} ${query} ${fragments} ${budget}
${results}= Search With Query Impl ${strategy} ${query} ${fragments} ${budget}
RETURN ${results}
Assemble With Strategy
[Documentation] Assemble with a strategy
[Arguments] ${strategy} ${fragments} ${budget}
${results}= Assemble With Strategy Impl ${strategy} ${fragments} ${budget}
RETURN ${results}
Select Strategy For Query
[Documentation] Select strategy for a query
[Arguments] ${selector} ${query}
${strategy_name}= Select Strategy For Query Impl ${selector} ${query}
RETURN ${strategy_name}
Select Strategy Without Query
[Documentation] Select strategy without query
[Arguments] ${selector}
${strategy_name}= Select Strategy Without Query Impl ${selector}
RETURN ${strategy_name}
Select Strategy With Invalid Request
[Documentation] Select strategy with invalid request
[Arguments] ${selector}
${strategy_name}= Select Strategy With Invalid Request Impl ${selector}
RETURN ${strategy_name}
Fuse With Query
[Documentation] Fuse strategies with a query
[Arguments] ${fusion} ${query} ${fragments} ${budget}
${results}= Fuse With Query Impl ${fusion} ${query} ${fragments} ${budget}
RETURN ${results}
Load Strategy From YAML
[Documentation] Load strategy from YAML configuration
[Arguments] ${config}
${strategy}= Load Strategy From YAML Impl ${config}
RETURN ${strategy}
Create Context Assembler With Advanced Strategies
[Documentation] Create a ContextAssembler with advanced strategies
${assembler}= Create Context Assembler With Advanced Strategies Impl
RETURN ${assembler}
Create Context Assembler With Multiple Strategies
[Documentation] Create a ContextAssembler with multiple strategies
${assembler}= Create Context Assembler With Multiple Strategies Impl
RETURN ${assembler}
Assemble Context With Query
[Documentation] Assemble context with a query
[Arguments] ${assembler} ${query} ${fragments} ${budget}
${results}= Assemble Context With Query Impl ${assembler} ${query} ${fragments} ${budget}
RETURN ${results}
Get Uko Nodes
[Documentation] Extract uko_node values from fragments
[Arguments] ${fragments}
${nodes}= Get Uko Nodes Impl ${fragments}
RETURN ${nodes}