use super::render_assertion;
use crate::e2e::field_access::FieldResolver;
use crate::e2e::fixture::Assertion;
use std::collections::{HashMap, HashSet};
fn array_resolver(field: &str) -> FieldResolver {
let result_fields: HashSet<String> = [field.to_string()].into_iter().collect();
let array_fields: HashSet<String> = [field.to_string()].into_iter().collect();
FieldResolver::new(
&HashMap::new(),
&HashSet::new(),
&result_fields,
&array_fields,
&HashSet::new(),
)
}
fn render(assertion: &Assertion, resolver: &FieldResolver) -> String {
let mut out = String::new();
render_assertion(
&mut out,
assertion,
"result",
resolver,
"Sample",
&HashSet::new(),
&HashMap::new(),
false,
false,
false,
false,
);
out
}
fn contains_on(field: &str) -> Assertion {
Assertion {
assertion_type: "contains".to_string(),
field: Some(field.to_string()),
value: Some(serde_json::Value::String("beta".to_string())),
..Default::default()
}
}
#[test]
fn elixir_wildcard_contains_quantifies_over_every_element() {
let out = render(&contains_on("items[].name"), &array_resolver("items"));
assert_eq!(
out,
" assert Enum.any?((result.items || []), fn e -> String.contains?(to_string(e.name), \"beta\") end)\n",
"got: {out}"
);
}
#[test]
fn elixir_explicit_index_still_lowers_to_enum_at() {
let out = render(&contains_on("items[0].name"), &array_resolver("items"));
assert!(out.contains("Enum.at(result.items, 0).name"), "got: {out}");
assert!(!out.contains("Enum.any?"), "got: {out}");
}
#[test]
fn elixir_wildcard_match_in_a_non_first_element_is_not_pinned_to_element_zero() {
let mut assertion = contains_on("items[].name");
assertion.value = Some(serde_json::Value::String("only-in-element-1".to_string()));
let out = render(&assertion, &array_resolver("items"));
assert!(!out.contains("Enum.at("), "index-pinned lookup survived: {out}");
assert!(out.contains("Enum.any?((result.items || [])"), "got: {out}");
assert!(out.contains("to_string(e.name)"), "got: {out}");
}
#[test]
fn nested_wildcard_should_emit_a_visible_skip_rather_than_an_index_zero_check() {
let out = render(&contains_on("pages[].links[].url"), &array_resolver("pages"));
assert_eq!(
out, " # skipped: nested array-wildcard field 'pages[].links[].url' not supported\n",
"got: {out}"
);
}