use std::rc::Rc;
use indoc::indoc;
use insta::assert_snapshot;
use sapiens::invoke_tool;
use sapiens::tools::Toolbox;
use sapiens_tools::dummy::DummyTool;
use sapiens_tools::python;
use sapiens_tools::python::PythonTool;
#[test]
fn test_tool_invocation() {
let data = indoc! {r#"
# Action
```yaml
command: SandboxedPython
input:
code: |
print("Hello world!")
```
"#};
let mut toolbox = Toolbox::default();
toolbox.add_advanced_tool(PythonTool::default());
let toolbox = Rc::new(toolbox);
let (tool_name, res) = invoke_tool(toolbox, data);
assert_eq!(tool_name, "SandboxedPython");
let output = res.unwrap();
assert_eq!(output, "stdout: |\n Hello world!\nstderr: ''\n");
}
#[test]
fn test_tool_invocation_in_python() {
let data = indoc! {r#"
# Action
```yaml
command: SandboxedPython
input:
code: |
print("Hello world!")
rooms = toolbox.invoke("Dummy", {"blah": "blah"})
print(rooms)
rooms = tools.dummy(blah="blah")
print(rooms)
```
"#};
let mut toolbox = Toolbox::default();
toolbox.add_advanced_tool(PythonTool::default());
toolbox.add_tool(DummyTool::default());
let toolbox = Rc::new(toolbox);
let (tool_name, res) = invoke_tool(toolbox, data);
assert_eq!(tool_name, "SandboxedPython");
let output = res.unwrap();
assert_eq!(
output,
"stdout: |\n Hello world!\n {'something': 'blah and something else'}\n {'something': 'blah and something else'}\nstderr: ''\n"
);
}
#[test]
fn test_multiple_tool_invocations() {
let data = indoc! {r#"
# Action
```yaml
command: SandboxedPython
input:
code: |
print("Hello world 1!")
```
# And another action
```yaml
command: SandboxedPython
input:
code: |
print("Hello world 2!")
```
# And yet another action
```
command: SandboxedPython
input:
code: |
print("Hello world 3!")
```
"#};
let mut toolbox = Toolbox::default();
toolbox.add_advanced_tool(PythonTool::default());
let toolbox = Rc::new(toolbox);
let (tool_name, res) = invoke_tool(toolbox, data);
assert_eq!(tool_name, "SandboxedPython");
let output = res.unwrap();
assert_snapshot!(output);
}
#[test]
fn test_python() {
let mut toolbox = Toolbox::default();
toolbox.add_tool(DummyTool::default());
toolbox.add_advanced_tool(python::PythonTool::default());
let toolbox = Rc::new(toolbox);
let data = indoc! {
r#"```yaml
command: SandboxedPython
input:
code: |
args = {
'blah': "hello"
}
output = tools.Dummy(**args)
something = output['something']
print(f"And the result is: {something}")
```
"#};
let (tool_name, res) = invoke_tool(toolbox, data);
assert_eq!(tool_name, "SandboxedPython");
let output = res.unwrap();
assert_snapshot!(output);
}
#[cfg(feature = "wiki")]
mod wiki {
use indoc::indoc;
#[test]
fn test_wikidata_sparql() {
let query = indoc! {
r#"
PREFIX wd: <http://www.wikidata.org/entity/>
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?country ?countryLabel ?capital ?capitalLabel
WHERE {
?country wdt:P31 wd:Q6256 . # ?country is an instance of a country (Q6256)
?country wdt:P36 ?capital . # ?country has a capital (?capital)
SERVICE wikibase:label {
bd:serviceParam wikibase:language "en" . # Use English labels
?country rdfs:label ?countryLabel .
?capital rdfs:label ?capitalLabel .
}
}
ORDER BY ?countryLabel
LIMIT 10
"#
};
let api = mediawiki::api_sync::ApiSync::new("https://www.wikidata.org/w/api.php").unwrap(); let res = api.sparql_query(query).unwrap();
println!("{}", serde_json::to_string_pretty(&res).unwrap());
}
#[test]
fn test_wikipedia() {
let api = mediawiki::api_sync::ApiSync::new("https://en.wikipedia.org/w/api.php").unwrap();
let params = api.params_into(&[
("action", "query"),
("prop", "extracts|explaintext|exintro"),
("titles", "Albert Einstein"),
]);
let res = api.get_query_api_json_all(¶ms).unwrap();
println!("{}", serde_json::to_string_pretty(&res).unwrap());
}
}