@@ -160,6 +160,17 @@ def test_render_failure_is_not_written_to_jsonl
160160 refute_path_exists ( recording )
161161 end
162162
163+ def test_memory_limited_render_is_not_recorded_as_successful
164+ writer = CollectingWriter . new
165+ template = Liquid ::Template . parse ( "0123456789" )
166+ template . resource_limits . render_length_limit = 9
167+
168+ output = Liquid ::TemplateRecorder . record ( writer ) { template . render }
169+
170+ assert_equal ( "Liquid error: Memory limits exceeded" , output )
171+ assert_empty ( writer . records )
172+ end
173+
163174 def test_tampered_template_is_rejected
164175 Liquid ::TemplateRecorder . record ( path ) { Liquid ::Template . parse ( "safe" ) . render! }
165176 session = JSON . parse ( File . read ( path ) )
@@ -311,6 +322,35 @@ def test_unsupported_accessed_values_do_not_affect_the_render
311322 assert_equal ( { } , writer . records . first [ "assigns" ] )
312323 end
313324
325+ def test_recorder_hooks_accept_host_application_contexts
326+ product = ProductDrop . new ( "Computed" , "secret" )
327+ product . context = Object . new
328+ assert_equal ( "Computed" , product . invoke_drop ( "title" ) )
329+
330+ filter = Module . new do
331+ def passthrough ( input )
332+ input
333+ end
334+ end
335+ strainer_class = Class . new ( Liquid ::StrainerTemplate )
336+ strainer_class . add_filter ( filter )
337+
338+ assert_equal ( "value" , strainer_class . new ( Object . new ) . invoke ( :passthrough , "value" ) )
339+ end
340+
341+ def test_records_only_output_produced_by_the_template
342+ writer = CollectingWriter . new
343+ output = +"prefix:"
344+
345+ Liquid ::TemplateRecorder . record ( writer ) do
346+ Liquid ::Template . parse ( "body" ) . render! ( { } , output : output )
347+ output << ":suffix"
348+ end
349+
350+ assert_equal ( "prefix:body:suffix" , output )
351+ assert_equal ( "body" , writer . records . first [ "output" ] )
352+ end
353+
314354 def test_strict_replay_accepts_the_application_environment
315355 environment = Liquid ::Environment . build (
316356 tags : Liquid ::Environment . default . tags . merge ( "marker" => MarkerTag ) ,
@@ -329,6 +369,20 @@ def test_strict_replay_accepts_the_application_environment
329369 assert_equal ( "custom" , replay . render )
330370 end
331371
372+ def test_strict_replay_stubs_host_application_tags
373+ environment = Liquid ::Environment . build (
374+ tags : Liquid ::Environment . default . tags . merge ( "wrapper" => WrapperTag , "marker" => MarkerTag ) ,
375+ )
376+ writer = CollectingWriter . new
377+ Liquid ::TemplateRecorder . record ( writer ) do
378+ Liquid ::Template . parse ( "{% wrapper %}{% marker %}{% endwrapper %}" , environment : environment ) . render!
379+ end
380+
381+ replay = Liquid ::TemplateRecorder ::Replayer . new ( writer . records . first , mode : :strict )
382+
383+ assert_equal ( "custom" , replay . render )
384+ end
385+
332386 def test_captures_file_reads_that_happen_before_the_template_starts_rendering
333387 writer = CollectingWriter . new
334388 Liquid ::TemplateRecorder . record ( writer ) do
0 commit comments