test: added tests for input

This commit is contained in:
2026-05-01 11:06:35 -06:00
parent a4fe1ee956
commit 2a58d8398a
4 changed files with 591 additions and 39 deletions
+64 -34
View File
@@ -10,48 +10,78 @@ state from `RequestContext`.
## Behaviors to test
### Input::from_str
- [ ] Creates Input from text string
- [ ] Captures role via resolve_role
- [ ] Captures session from ctx
- [ ] Captures rag from ctx
- [ ] Captures functions via select_functions
- [ ] Captures stream_enabled from AppConfig
- [ ] app_config field set from ctx.app.config
- [ ] Empty text → is_empty() returns true
- [x] Creates Input from text string
- [x] Captures role via resolve_role
- [x] Captures session from ctx
- [ ] Captures rag from ctx (requires RAG setup)
- [ ] Captures functions via select_functions (tested separately)
- [x] Captures stream_enabled from AppConfig
- [x] app_config field set from ctx.app.config
- [x] Empty text → is_empty() returns true
### Input::from_files
- [ ] Loads file contents
- [ ] Supports multiple files
- [ ] Supports directories (recursive)
- [ ] Supports URLs (fetches content)
- [ ] Supports loader syntax (e.g., jina:url)
- [ ] Last message carry-over (%% syntax)
- [ ] Combines file content with text
- [ ] document_loaders from AppConfig used
- [ ] Loads file contents (async + filesystem)
- [ ] Supports multiple files (async + filesystem)
- [ ] Supports directories (recursive) (async + filesystem)
- [ ] Supports URLs (fetches content) (async + network)
- [ ] Supports loader syntax (e.g., jina:url) (async + loader)
- [x] Last message carry-over (%% syntax) (via resolve_paths)
- [ ] Combines file content with text (async)
- [ ] document_loaders from AppConfig used (async)
### resolve_role
- [ ] Returns provided role if given
- [ ] Extracts role from agent if agent active
- [ ] Extracts role from session if session has role
- [ ] Returns default model-based role otherwise
- [ ] with_session flag set correctly
- [ ] with_agent flag set correctly
- [x] Returns provided role if given
- [ ] Extracts role from agent if agent active (requires agent init)
- [x] Extracts role from session if session has role
- [x] Returns default model-based role otherwise
- [x] with_session flag set correctly
- [x] with_agent flag set correctly
### Input methods
- [ ] stream() returns stream_enabled && !model.no_stream()
- [ ] create_client() uses app_config to init client
- [ ] prepare_completion_data() uses captured functions
- [ ] build_messages() uses captured session
- [ ] echo_messages() uses captured session
- [ ] set_regenerate(role) refreshes role
- [ ] use_embeddings() searches RAG if present
- [ ] merge_tool_results() creates continuation input
- [ ] stream() returns stream_enabled && !model.no_stream() (requires Model with no_stream)
- [ ] create_client() uses app_config to init client (requires client config)
- [ ] prepare_completion_data() uses captured functions (requires Model)
- [ ] build_messages() uses captured session (requires Message setup)
- [ ] echo_messages() uses captured session (requires Message setup)
- [x] set_regenerate(role) refreshes role
- [ ] use_embeddings() searches RAG if present (requires RAG)
- [ ] merge_tool_results() creates continuation input (requires ToolResult)
## Context switching scenarios
- [ ] Input with agent → agent functions selected
- [ ] Input with MCP → MCP meta functions in declarations
- [ ] Input with RAG → embeddings included after use_embeddings
- [ ] Input without session → no session messages in build_messages
- [ ] Input with agent → agent functions selected (requires agent init)
- [x] Input with MCP → MCP meta functions in declarations (via select_functions tests)
- [ ] Input with RAG → embeddings included after use_embeddings (requires RAG)
- [x] Input without session → no session messages in build_messages (via session() test)
## Additional behaviors tested (not in original plan)
- [x] resolve_role: explicit role overrides session flag
- [x] resolve_paths: empty input
- [x] resolve_paths: URL detection (https://)
- [x] resolve_paths: external command detection (backtick syntax)
- [x] resolve_paths: rejects URL with glob suffix
- [x] resolve_paths: mixed inputs (%%, URL, external cmd)
- [x] Input::set_text changes text
- [x] Input::patched_text overrides text()
- [x] Input::clear_patch restores original
- [x] Input::set_continue_output accumulates
- [x] Input::summary truncates long text with ...
- [x] Input::summary preserves short text
- [x] Input::raw() with no files
- [x] Input::render() with no medias
- [x] Input::session() returns None when with_session=false
- [x] Input::session() returns Some when with_session=true
- [x] is_image recognizes png/jpeg/jpg/webp/gif
- [x] is_image rejects non-image extensions
- [x] resolve_data_url returns path for known hash
- [x] resolve_data_url returns original for non-data URL
- [x] select_functions: None when no tools enabled
- [x] select_functions: None when function_calling disabled
- [x] select_functions: "all" returns all non-MCP
- [x] select_functions: comma-separated filters
- [x] select_enabled_mcp_servers: empty when MCP disabled
- [x] select_enabled_mcp_servers: "all" returns all MCP functions
- [x] select_enabled_mcp_servers: comma filters by server name
## Old code reference
- `src/config/input.rs` — Input struct, from_str, from_files