use super::*;
use crate::schema::graph::SchemaGraph;
use test_r::test;
fn tool(name: &str, version: &str) -> Tool {
Tool {
version: version.to_string(),
requires_filesystem: false,
commands: CommandTree {
nodes: vec![CommandNode {
name: name.to_string(),
aliases: vec![],
doc: Doc::default(),
globals: Globals::default(),
subcommands: vec![],
body: None,
}],
},
schema: SchemaGraph::empty(),
}
}
#[test]
fn tool_wit_roundtrip_preserves_filesystem_requirement() {
for requires_filesystem in [false, true] {
let mut tool = tool("filesystem-test", "1");
tool.requires_filesystem = requires_filesystem;
let wire = wire::Tool::try_from(&tool).unwrap();
assert_eq!(Tool::try_from(&wire).unwrap(), tool);
}
}
#[test]
fn tool_middleware_roundtrip_preserves_independent_versions() {
let middleware = ToolMiddleware {
name: "redactor".to_string(),
version: "middleware-7".to_string(),
aliases: vec!["scrubber".to_string()],
doc: Doc::default(),
scope: ToolMiddlewareScope::Monomorphic(Box::new(MonomorphicToolMiddlewareScope {
presented: tool("public-tool", "presented-2"),
expected: Some(tool("private-tool", "expected-9")),
})),
parameter_schema: SchemaGraph::anonymous(SchemaType::String {
metadata: Default::default(),
}),
};
let decoded = tool_middleware_from_wit(tool_middleware_to_wit(&middleware).unwrap()).unwrap();
assert_eq!(decoded, middleware);
}
#[test]
fn universal_middleware_roundtrip_preserves_its_version() {
let middleware = ToolMiddleware {
name: "audit".to_string(),
version: "middleware-only-version".to_string(),
aliases: vec![],
doc: Doc::default(),
scope: ToolMiddlewareScope::Universal,
parameter_schema: SchemaGraph::empty(),
};
let decoded = tool_middleware_from_wit(tool_middleware_to_wit(&middleware).unwrap()).unwrap();
assert_eq!(decoded, middleware);
}
#[test]
fn malformed_embedded_tool_is_rejected() {
let middleware = ToolMiddleware {
name: "redactor".to_string(),
version: "1".to_string(),
aliases: vec![],
doc: Doc::default(),
scope: ToolMiddlewareScope::Monomorphic(Box::new(MonomorphicToolMiddlewareScope {
presented: tool("public-tool", "1"),
expected: None,
})),
parameter_schema: SchemaGraph::empty(),
};
let mut wire = tool_middleware_to_wit(&middleware).unwrap();
let wire::ToolMiddlewareScope::Monomorphic(scope) = &mut wire.scope else {
unreachable!()
};
scope.presented.schema.type_nodes[0].body =
crate::schema::wit::wire::SchemaTypeBody::RefType(i32::MAX);
scope
.presented
.schema
.defs
.push(crate::schema::wit::wire::SchemaTypeDef {
id: "broken".to_string(),
name: None,
body: 0,
});
assert!(tool_middleware_from_wit(wire).is_err());
}