use super::*;
use crate::core::config::e2e::CallConfig;
use crate::core::ir::{FieldDef, FunctionDef, TypeDef, TypeRef};
fn docs_fixture() -> Fixture {
serde_json::from_value(serde_json::json!({
"id": "sample_fixture",
"description": "Sample fixture",
"input": {"query": "irrelevant"},
"docs": {
"topic": "guides",
"stem": "sample_fixture",
"presentation": {
"operations": [
{
"op": "iterate",
"path": "results[0].matched_terms",
"item": "term",
"fields": ["value"],
"display": true
}
]
}
}
}))
.expect("fixture must parse")
}
fn config() -> E2eConfig {
E2eConfig {
call: CallConfig {
function: "search".into(),
result_var: "result".into(),
..CallConfig::default()
},
result_fields: ["results".to_string()].into_iter().collect(),
..E2eConfig::default()
}
}
fn field(name: &str, ty: TypeRef) -> FieldDef {
FieldDef {
name: name.to_string(),
ty,
..FieldDef::default()
}
}
fn search_returning(type_name: &str) -> Vec<FunctionDef> {
vec![FunctionDef {
name: "search".to_string(),
return_type: TypeRef::Named(type_name.to_string()),
..FunctionDef::default()
}]
}
fn type_defs() -> Vec<TypeDef> {
vec![
TypeDef {
name: "Envelope".to_string(),
fields: vec![field(
"results",
TypeRef::Vec(Box::new(TypeRef::Named("ResultItem".to_string()))),
)],
..TypeDef::default()
},
TypeDef {
name: "ResultItem".to_string(),
fields: vec![field(
"matched_terms",
TypeRef::Vec(Box::new(TypeRef::Named("TermMatch".to_string()))),
)],
..TypeDef::default()
},
TypeDef {
name: "TermMatch".to_string(),
fields: vec![field("value", TypeRef::String)],
..TypeDef::default()
},
]
}
fn iterate_expression(language: &str) -> String {
resolve(
&docs_fixture(),
&config(),
language,
&type_defs(),
&search_returning("Envelope"),
)
.into_iter()
.find(|operation| operation.kind == "iterate")
.expect("fixture declares one iterate operation")
.expression
}
#[test]
fn wasm_camel_cases_the_iterate_tail_segment() {
assert_eq!(iterate_expression("wasm"), "first?.matchedTerms");
}
#[test]
fn node_camel_cases_the_iterate_tail_segment_identically_to_wasm() {
assert_eq!(iterate_expression("node"), "first?.matchedTerms");
assert_eq!(iterate_expression("node"), iterate_expression("wasm"));
}
#[test]
fn wasm_leaves_an_already_camel_tail_segment_unchanged() {
let fixture: Fixture = serde_json::from_value(serde_json::json!({
"id": "sample_fixture",
"description": "Sample fixture",
"input": {"query": "irrelevant"},
"docs": {
"topic": "guides",
"stem": "sample_fixture",
"presentation": {
"operations": [
{
"op": "iterate",
"path": "results[0].tags",
"item": "tag",
"fields": [],
"display": true
}
]
}
}
}))
.expect("fixture must parse");
let type_defs = vec![
TypeDef {
name: "Envelope".to_string(),
fields: vec![field(
"results",
TypeRef::Vec(Box::new(TypeRef::Named("ResultItem".to_string()))),
)],
..TypeDef::default()
},
TypeDef {
name: "ResultItem".to_string(),
fields: vec![field("tags", TypeRef::Vec(Box::new(TypeRef::String)))],
..TypeDef::default()
},
];
let expression = resolve(&fixture, &config(), "wasm", &type_defs, &search_returning("Envelope"))
.into_iter()
.find(|operation| operation.kind == "iterate")
.expect("fixture declares one iterate operation")
.expression;
assert_eq!(expression, "first?.tags");
}