@@ -1023,3 +1023,43 @@ def render_template(thread_id):
10231023 t .join (timeout = 30 )
10241024
10251025 assert not errors , f"Concurrent render raised errors: { errors } "
1026+
1027+
1028+ # ── fn.* Mustache lambda helper tests ────────────────────────────────────────
1029+
1030+
1031+ def test_fn_na_on_missing_key (mocked_context_manager ):
1032+ """fn.na renders 'N/A' when the wrapped field is absent from the context."""
1033+ mocked_context_manager .get_full_context .return_value = {
1034+ "alert" : {"name" : "test-alert" }, # no 'slack_timestamp' field
1035+ }
1036+ iohandler = IOHandler (mocked_context_manager )
1037+ result = iohandler .render ("ts={{#fn.na}}{{ alert.slack_timestamp }}{{/fn.na}}" )
1038+ assert result == "ts=N/A" , f"Expected 'ts=N/A', got '{ result } '"
1039+
1040+
1041+ def test_fn_default_on_missing_key (mocked_context_manager ):
1042+ """fn.default renders an empty string when the wrapped field is absent."""
1043+ mocked_context_manager .get_full_context .return_value = {
1044+ "alert" : {"name" : "test-alert" }, # no 'silenceURL' field
1045+ }
1046+ iohandler = IOHandler (mocked_context_manager )
1047+ result = iohandler .render ("url={{#fn.default}}{{ alert.silenceURL }}{{/fn.default}}" )
1048+ assert result == "url=" , f"Expected 'url=', got '{ result } '"
1049+
1050+
1051+ def test_fn_upper_lower_strip_on_present_value (mocked_context_manager ):
1052+ """fn.upper, fn.lower, and fn.strip transform present field values correctly."""
1053+ mocked_context_manager .get_full_context .return_value = {
1054+ "alert" : {"env" : " Production " },
1055+ }
1056+ iohandler = IOHandler (mocked_context_manager )
1057+
1058+ upper = iohandler .render ("{{#fn.upper}}{{ alert.env }}{{/fn.upper}}" )
1059+ assert upper == " PRODUCTION " , f"fn.upper got '{ upper } '"
1060+
1061+ lower = iohandler .render ("{{#fn.lower}}{{ alert.env }}{{/fn.lower}}" )
1062+ assert lower == " production " , f"fn.lower got '{ lower } '"
1063+
1064+ strip = iohandler .render ("{{#fn.strip}}{{ alert.env }}{{/fn.strip}}" )
1065+ assert strip == "Production" , f"fn.strip got '{ strip } '"
0 commit comments