@@ -195,4 +195,63 @@ def test_uses_module_configuration
195195 assert_equal false , TestAlreadyConfigurableModule ::SomeComponent . instrumentation_enabled
196196 assert_equal false , TestAlreadyConfiguredModule ::SomeComponent . instrumentation_enabled
197197 end
198+
199+ def test_after_compile_hook_called_on_compile
200+ klass = Class . new ( ViewComponent ::Base ) do
201+ @@calls = 0
202+
203+ def self . calls
204+ @@calls
205+ end
206+
207+ class << self
208+ def after_compile
209+ @@calls += 1
210+ end
211+ end
212+
213+ erb_template ""
214+ end
215+
216+ self . class . const_set ( :TempHookComponent , klass )
217+ ViewComponent ::CompileCache . invalidate_class! ( klass )
218+
219+ ViewComponent ::Compiler . new ( klass ) . compile ( force : true )
220+ assert_equal 1 , klass . calls
221+ ensure
222+ self . class . send ( :remove_const , :TempHookComponent ) if self . class . const_defined? ( :TempHookComponent )
223+ ViewComponent ::CompileCache . invalidate_class! ( klass ) if defined? ( klass )
224+ end
225+
226+ def test_after_compile_not_called_on_cached_compile
227+ klass = Class . new ( ViewComponent ::Base ) do
228+ @@calls = 0
229+
230+ def self . calls
231+ @@calls
232+ end
233+
234+ class << self
235+ def after_compile
236+ @@calls += 1
237+ end
238+ end
239+
240+ erb_template ""
241+ end
242+
243+ self . class . const_set ( :TempHookCachedComponent , klass )
244+ ViewComponent ::CompileCache . invalidate_class! ( klass )
245+
246+ compiler = ViewComponent ::Compiler . new ( klass )
247+ compiler . compile ( force : true )
248+ assert_equal 1 , klass . calls
249+
250+ # compile again without force -> should not call hook again
251+ compiler . compile
252+ assert_equal 1 , klass . calls
253+ ensure
254+ self . class . send ( :remove_const , :TempHookCachedComponent ) if self . class . const_defined? ( :TempHookCachedComponent )
255+ ViewComponent ::CompileCache . invalidate_class! ( klass ) if defined? ( klass )
256+ end
198257end
0 commit comments