use crate::e2e::codegen::presentation::PresentationOperation;
fn iterate_operation(fields: Vec<&str>) -> PresentationOperation {
let fields: Vec<String> = fields.into_iter().map(str::to_string).collect();
PresentationOperation {
kind: "iterate",
expression: "result.items".to_string(),
item: "item".to_string(),
field_displays: vec![false; fields.len()],
fields,
optional: false,
display: false,
destructure_source: String::new(),
destructure_item: String::new(),
shown_optional: false,
field_optionals: Vec::new(),
guard_binding: String::new(),
guard_source: String::new(),
guard_condition: String::new(),
}
}
fn render(operation: PresentationOperation) -> String {
crate::e2e::template_env::render(
"python/snippet_body.py.jinja",
minijinja::context! {
imports => Vec::<String>::new(),
body => vec!["result = client.list_items()".to_string()],
is_async => false,
presentation => vec![operation],
expects_error => false,
error_type => "Error",
typed_error_type => Option::<String>::None,
result_var => "result",
returns_void => false,
},
)
}
#[test]
fn an_iterate_with_no_fields_prints_the_raw_item_instead_of_an_empty_block() {
let rendered = render(iterate_operation(vec![]));
assert!(
rendered.contains("for item in result.items:\n print(item)"),
"the loop body must be the raw item, immediately after the `for` line:\n{rendered}"
);
}
#[test]
fn an_iterate_with_fields_prints_only_those_fields() {
let rendered = render(iterate_operation(vec!["item.value"]));
assert!(
rendered.contains("for item in result.items:\n print(item.value)"),
"the declared field must still be printed:\n{rendered}"
);
assert!(
!rendered.contains("print(item)\n"),
"the raw-item fallback must not appear when real fields were rendered:\n{rendered}"
);
}