use std::collections::{HashMap, HashSet};
use super::assertions::render_assertion;
use crate::e2e::codegen::field_skip::FieldSkip;
use crate::e2e::field_access::FieldResolver;
use crate::e2e::fixture::Assertion;
fn set(values: &[&str]) -> HashSet<String> {
values.iter().map(ToString::to_string).collect()
}
fn resolver(optional: &[&str], result_fields: &[&str], is_byte_payload: bool) -> FieldResolver {
FieldResolver::new(
&HashMap::new(),
&set(optional),
&set(result_fields),
&HashSet::new(),
&HashSet::new(),
)
.with_result_is_byte_payload(is_byte_payload)
}
fn render(field: &str, field_resolver: &FieldResolver, result_is_simple: bool) -> String {
let assertion = Assertion {
assertion_type: "not_empty".to_string(),
field: Some(field.to_string()),
..Default::default()
};
let mut out = String::new();
render_assertion(
&mut out,
&assertion,
"result",
"sample_module",
"sample_dep",
false,
&[],
field_resolver,
false,
result_is_simple,
false,
false,
true,
None,
);
out
}
#[test]
fn should_skip_the_assertion_when_a_simple_result_type_has_no_fields() {
let out = render("payload", &resolver(&["payload"], &["payload"], true), true);
assert_eq!(
out,
format!(
" // skipped: {}\n",
FieldSkip::NotAvailableWhenResultIsSimple.message("payload")
),
"a fieldless (byte-payload) result must route through the recorded skip funnel"
);
assert!(
!out.contains("result.payload"),
"`result.payload` on a `bytes::Bytes` value is E0609 in the generated crate; got: {out}"
);
}
#[test]
fn should_still_render_the_field_access_for_a_real_field_on_a_struct_result() {
let out = render("payload", &resolver(&[], &["payload"], false), false);
assert_eq!(
out, " assert!(!result.payload.is_empty(), \"expected non-empty value\");\n",
"a struct result that declares the field must keep asserting on it"
);
}
#[test]
fn should_assert_on_the_whole_value_when_a_simple_result_still_has_fields() {
let out = render("payload", &resolver(&[], &["payload"], false), true);
assert_eq!(
out, " assert!(!result.is_empty(), \"expected non-empty value\");\n",
"a simple (non-fieldless) result reinterprets the field as the whole value"
);
}
#[test]
fn should_not_rebuild_a_member_accessor_for_an_optional_field_on_a_simple_result() {
let out = render("payload", &resolver(&["payload"], &["payload"], false), true);
assert_eq!(
out, " assert!(!result.is_empty(), \"expected non-empty value\");\n",
"the simple-result decision must survive into the not_empty renderer"
);
assert!(
!out.contains("result.payload"),
"a simple result has no `payload` member to reach; got: {out}"
);
}
#[test]
fn should_keep_the_whole_result_sentinel_on_a_fieldless_result() {
let out = render("result", &resolver(&[], &[], true), true);
assert_eq!(
out, " assert!(!result.is_empty(), \"expected non-empty value\");\n",
"`field: \"result\"` names the byte payload itself, not a member of it"
);
}