diff --git a/test/snapshot_utils.rb b/test/snapshot_utils.rb index a6b8701..528f27b 100644 --- a/test/snapshot_utils.rb +++ b/test/snapshot_utils.rb @@ -7,6 +7,7 @@ require "readline" require "digest" require "json" +require "prism" def ask?(prompt = "") Readline.readline("===> #{prompt}? (y/N) ", true).squeeze(" ").strip == "y" @@ -25,6 +26,18 @@ def assert_compiled_snapshot(source, handler: ReActionView::Template::Handlers:: compiled_source = template.handler.call(template, source) + prism_result = Prism.parse(compiled_source) + syntax_errors = prism_result.errors.reject { |e| e.type == :invalid_yield } + + assert syntax_errors.empty?, <<~MESSAGE + Compiled output is not valid Ruby: + + #{syntax_errors.map { |e| " - #{e.message} (line #{e.location.start_line})" }.join("\n")} + + Compiled source: + #{compiled_source} + MESSAGE + snapshot_key = JSON.generate({ source: source, handler: handler, @@ -39,7 +52,7 @@ def assert_compiled_snapshot(source, handler: ReActionView::Template::Handlers:: compiled_source end - def assert_evaluated_snapshot(source, ivars: {}, options: {}, handler: ReActionView::Template::Handlers::ERB, virtual_path: "test", format: :html, locals: []) # rubocop:disable Metrics/ParameterLists,Layout/LineLength + def assert_evaluated_snapshot(source, ivars: {}, options: {}, handler: ReActionView::Template::Handlers::ERB, virtual_path: "test", format: :html, locals: []) # rubocop:disable Metrics/ParameterLists,Layout/LineLength,Metrics/MethodLength template = ActionView::Template.new( source, "test_template", @@ -51,6 +64,18 @@ def assert_evaluated_snapshot(source, ivars: {}, options: {}, handler: ReActionV compiled_source = template.handler.call(template, source) + prism_result = Prism.parse(compiled_source) + syntax_errors = prism_result.errors.reject { |e| e.type == :invalid_yield } + + assert syntax_errors.empty?, <<~MESSAGE + Compiled output is not valid Ruby: + + #{syntax_errors.map { |e| " - #{e.message} (line #{e.location.start_line})" }.join("\n")} + + Compiled source: + #{compiled_source} + MESSAGE + lookup_context = ActionView::LookupContext.new([]) view_context = ActionView::Base.with_empty_template_cache.new(lookup_context, {}, nil)