use crate::e2e::fixture::Assertion;
use super::super::json::value_to_python_string;
pub(super) fn try_render(
out: &mut String,
assertion: &Assertion,
field_access: &str,
field_is_optional: bool,
fold_case: bool,
) -> bool {
let kind = assertion.assertion_type.as_str();
let expected: Vec<&serde_json::Value> = match kind {
"equals" | "contains" | "starts_with" | "ends_with" => assertion.value.iter().collect(),
"contains_all" | "contains_any" => assertion.values.iter().flatten().collect(),
"not_contains" => assertion.expected_values(),
_ => return false,
};
if expected.is_empty() || !expected.iter().all(|v| v.is_string()) {
return false;
}
let literals: Vec<String> = expected.iter().map(|v| value_to_python_string(v)).collect();
let text = format!("{field_access}.text");
let guard = if field_is_optional && kind == "not_contains" {
format!("{field_access} is None or ")
} else {
String::new()
};
if field_is_optional && kind != "not_contains" {
out.push_str(&format!(" assert {field_access} is not None\n"));
}
out.push_str(&format!(" assert {guard}{text} is not None\n"));
let lower = if fold_case { ".lower()" } else { "" };
match kind {
"equals" => out.push_str(&format!(" assert {text}{lower} == {}{lower}\n", literals[0])),
"contains" | "contains_all" => {
for literal in &literals {
out.push_str(&format!(" assert {literal}{lower} in {text}{lower}\n"));
}
}
"contains_any" => {
let list = literals.join(", ");
out.push_str(&format!(
" assert any(v{lower} in {text}{lower} for v in [{list}])\n"
));
}
"not_contains" => {
for literal in &literals {
out.push_str(&format!(" assert {guard}{literal}{lower} not in {text}{lower}\n"));
}
}
"starts_with" => out.push_str(&format!(" assert {text}.startswith({})\n", literals[0])),
"ends_with" => out.push_str(&format!(" assert {text}.endswith({})\n", literals[0])),
_ => return false,
}
true
}