@@ -170,6 +170,62 @@ def test_render_parent_preserves_child_fragment_cache_identity
170170 end
171171 end
172172
173+ def test_precomputation_does_not_log_unresolvable_interpolated_helper_dependencies
174+ with_component_files (
175+ "interpolated_helper.rb" => <<~'RUBY' ,
176+ module TemplateRegressionFixtures::InterpolatedHelper
177+ def nested_fields(path, association)
178+ render("#{path}/#{association}_fields")
179+ end
180+ end
181+ RUBY
182+ "base_component.rb" => <<~RUBY ,
183+ class TemplateRegressionFixtures::BaseComponent < ViewComponent::Base
184+ include TemplateRegressionFixtures::InterpolatedHelper
185+ end
186+ RUBY
187+ "greeting_component.rb" => "class TemplateRegressionFixtures::GreetingComponent < TemplateRegressionFixtures::BaseComponent; end" ,
188+ "greeting_component.html.erb" => "<p>Hello</p>" ,
189+ "control_component.rb" => "class TemplateRegressionFixtures::ControlComponent < ViewComponent::Base; end" ,
190+ "control_component.html.erb" => "<%= render TemplateRegressionFixtures::GreetingComponent.new %>"
191+ ) do
192+ components = [ TemplateRegressionFixtures ::GreetingComponent , TemplateRegressionFixtures ::ControlComponent ]
193+ components . each ( &:__vc_compile )
194+
195+ ActionView ::Digestor . logger . stub ( :error , -> ( message ) { flunk message } ) do
196+ ViewComponent ::CacheDigest . precompute! ( components )
197+ end
198+
199+ refute_includes components . first . __vc_cache_digest_source , "*/*_fields"
200+ assert_includes components . last . __vc_cache_digest_source ,
201+ ViewComponent ::CacheDigest . virtual_path_for ( components . first )
202+ end
203+ end
204+
205+ def test_supported_interpolated_partial_edits_change_component_digest
206+ parser = ViewComponent ::CacheDigest ::RENDER_PARSER . new ( "test/template" , "render \" buttons/\# {kind}\" " )
207+ unless parser . render_calls . any? { |path | path . gsub ( %r{/_} , "/" ) == "buttons/*" }
208+ skip "Action View's render parser does not support interpolated directory wildcards"
209+ end
210+
211+ with_component_files (
212+ "wildcard_component.rb" => "class TemplateRegressionFixtures::WildcardComponent < ViewComponent::Base; end" ,
213+ "wildcard_component.html.erb" => "<%= render \" buttons/\# {kind}\" %>" ,
214+ "views/buttons/_button.html.erb" => "original partial"
215+ ) do |directory |
216+ component = TemplateRegressionFixtures ::WildcardComponent
217+ component . __vc_cache_digest_source = ViewComponent ::CacheDigest ::Resolver . instance . source_for ( component ) . freeze
218+ resolver = ActionView ::FileSystemResolver . new ( File . join ( directory , "views" ) )
219+ before = component . cache_digest ( finder : ActionView ::LookupContext . new ( [ resolver ] ) )
220+
221+ File . write ( File . join ( directory , "views/buttons/_button.html.erb" ) , "changed partial" )
222+ resolver . clear_cache
223+ clear_digest_cache
224+
225+ refute_equal before , component . cache_digest ( finder : ActionView ::LookupContext . new ( [ resolver ] ) )
226+ end
227+ end
228+
173229 def test_view_fragments_track_components_assigned_to_locals
174230 with_component_files (
175231 "leaf_component.rb" => "class TemplateRegressionFixtures::LeafComponent < ViewComponent::Base; end" ,
0 commit comments