- Reject dotted tool identifiers during registration and remove alias-backed lookups. - Drop web.search compatibility, normalize all code/tests around the canonical web_search name, and update consent/session logic. - Harden CLI toggles to manage the spec-compliant identifier and ensure MCP configs shed non-compliant entries automatically. Acceptance Criteria: - Tool registry denies invalid identifiers by default and no alias codepaths remain. Test Notes: - cargo check -p owlen-core (tests unavailable in sandbox).
101 lines
3.0 KiB
Rust
101 lines
3.0 KiB
Rust
use owlen_core::consent::{ConsentManager, ConsentScope};
|
|
use owlen_core::tools::WEB_SEARCH_TOOL_NAME;
|
|
|
|
#[test]
|
|
fn test_consent_scopes() {
|
|
let mut manager = ConsentManager::new();
|
|
|
|
// Test session consent
|
|
manager.grant_consent_with_scope(
|
|
"test_tool",
|
|
vec!["data".to_string()],
|
|
vec!["https://example.com".to_string()],
|
|
ConsentScope::Session,
|
|
);
|
|
|
|
assert!(manager.has_consent("test_tool"));
|
|
|
|
// Clear session consent and verify it's gone
|
|
manager.clear_session_consent();
|
|
assert!(!manager.has_consent("test_tool"));
|
|
|
|
// Test permanent consent survives session clear
|
|
manager.grant_consent_with_scope(
|
|
"test_tool_permanent",
|
|
vec!["data".to_string()],
|
|
vec!["https://example.com".to_string()],
|
|
ConsentScope::Permanent,
|
|
);
|
|
|
|
assert!(manager.has_consent("test_tool_permanent"));
|
|
manager.clear_session_consent();
|
|
assert!(manager.has_consent("test_tool_permanent"));
|
|
|
|
// Verify revoke works for permanent consent
|
|
manager.revoke_consent("test_tool_permanent");
|
|
assert!(!manager.has_consent("test_tool_permanent"));
|
|
}
|
|
|
|
#[test]
|
|
fn test_pending_requests_prevents_duplicates() {
|
|
let mut manager = ConsentManager::new();
|
|
|
|
// Simulate concurrent consent requests by checking pending state
|
|
// In real usage, multiple threads would call request_consent simultaneously
|
|
|
|
// First, verify a tool has no consent
|
|
assert!(!manager.has_consent(WEB_SEARCH_TOOL_NAME));
|
|
|
|
// The pending_requests map is private, but we can test the behavior
|
|
// by checking that consent checks work correctly
|
|
assert!(manager.check_consent_needed(WEB_SEARCH_TOOL_NAME).is_some());
|
|
|
|
// Grant session consent
|
|
manager.grant_consent_with_scope(
|
|
WEB_SEARCH_TOOL_NAME,
|
|
vec!["search queries".to_string()],
|
|
vec!["https://api.search.com".to_string()],
|
|
ConsentScope::Session,
|
|
);
|
|
|
|
// Now it should have consent
|
|
assert!(manager.has_consent(WEB_SEARCH_TOOL_NAME));
|
|
assert!(manager.check_consent_needed(WEB_SEARCH_TOOL_NAME).is_none());
|
|
}
|
|
|
|
#[test]
|
|
fn test_consent_record_separation() {
|
|
let mut manager = ConsentManager::new();
|
|
|
|
// Add permanent consent
|
|
manager.grant_consent_with_scope(
|
|
"perm_tool",
|
|
vec!["data".to_string()],
|
|
vec!["https://perm.com".to_string()],
|
|
ConsentScope::Permanent,
|
|
);
|
|
|
|
// Add session consent
|
|
manager.grant_consent_with_scope(
|
|
"session_tool",
|
|
vec!["data".to_string()],
|
|
vec!["https://session.com".to_string()],
|
|
ConsentScope::Session,
|
|
);
|
|
|
|
// Both should have consent
|
|
assert!(manager.has_consent("perm_tool"));
|
|
assert!(manager.has_consent("session_tool"));
|
|
|
|
// Clear session consent
|
|
manager.clear_session_consent();
|
|
|
|
// Only permanent should remain
|
|
assert!(manager.has_consent("perm_tool"));
|
|
assert!(!manager.has_consent("session_tool"));
|
|
|
|
// Clear all
|
|
manager.clear_all_consent();
|
|
assert!(!manager.has_consent("perm_tool"));
|
|
}
|