11require "test_helper"
22
33class Tailwindcss ::EnginesTest < ActiveSupport ::TestCase
4- def setup
5- super
6- # Store original Rails state
7- @original_rails_root = Rails . root
8- @original_application = Rails . application
9- @test_app_root = Pathname . new ( TAILWINDCSS_TEST_APP_ROOT )
10-
11- # Set up directories
12- @builds_dir = @test_app_root . join ( "app/assets/builds/tailwind" )
13- FileUtils . rm_rf ( @builds_dir ) if Dir . exist? ( @builds_dir )
14-
15- # Save original subclasses to restore later
16- @original_subclasses = Rails ::Engine . subclasses . dup
17- end
18-
19- def teardown
20- super
21- # Restore original state
22- Rails . application = @original_application if @original_application
23-
24- # If we've modified the Rails::Engine subclasses, restore them
25- if @original_subclasses
26- Rails ::Engine . instance_variable_set ( :@subclasses , @original_subclasses )
27- end
28-
29- # Clean up test directory
30- FileUtils . rm_rf ( @builds_dir ) if Dir . exist? ( @builds_dir )
31- end
32-
334 test "bundle creates the builds directory" do
34- # Store the original Rails application for restoration later
35- original_app = Rails . application
36-
375 Dir . mktmpdir do |tmpdir |
386 @tmpdir = tmpdir
397 tmpdir_path = Pathname . new ( tmpdir )
408 builds_dir = tmpdir_path . join ( "app/assets/builds/tailwind" )
419
4210 Rails . stub ( :root , tmpdir_path ) do
43- # Execute the bundle method
4411 Tailwindcss ::Engines . bundle
45-
46- # Assert that the directory was created
4712 assert Dir . exist? ( builds_dir ) , "Expected directory #{ builds_dir } to be created"
4813 end
4914 end
50-
51- # Restore the original Rails application
52- Rails . application = original_app
5315 end
54-
16+
5517 test "bundle generates CSS files for engine's tailwind assets" do
56- # Store the original Rails application and engine subclasses
57- original_app = Rails . application
58- original_subclasses = Rails ::Engine . subclasses . dup
59-
6018 Dir . mktmpdir do |tmpdir |
6119 @tmpdir = tmpdir
6220 tmpdir_path = Pathname . new ( tmpdir )
6321 builds_dir = tmpdir_path . join ( "app/assets/builds/tailwind" )
6422
6523 Rails . stub ( :root , tmpdir_path ) do
66- # Create a mock engine with tailwind assets
6724 setup_mock_engine ( "mock_engine" , tmpdir_path )
68-
69- # Execute the bundle method
25+
7026 Tailwindcss ::Engines . bundle
71-
72- # Assert that the CSS file was generated
27+
7328 css_file_path = builds_dir . join ( "mock_engine.css" )
7429 assert File . exist? ( css_file_path ) , "Expected file #{ css_file_path } to be created"
75-
76- # Check content of the generated file
30+
7731 content = File . read ( css_file_path )
7832 assert_match ( /DO NOT MODIFY THIS FILE/ , content )
79- assert_match ( /@import ".*\/ app\/ assets\/ tailwind\/ mock_engine\/ application .css"/ , content )
33+ assert_match ( /@import ".*\/ app\/ assets\/ tailwind\/ mock_engine\/ engine .css"/ , content )
8034 end
8135 end
82-
83- # Restore the original Rails application and engine subclasses
84- Rails . application = original_app
85- Rails ::Engine . instance_variable_set ( :@subclasses , original_subclasses )
8636 end
87-
37+
8838 test "bundle removes existing files before generating new ones" do
89- # Store the original Rails application and engine subclasses
90- original_app = Rails . application
91- original_subclasses = Rails ::Engine . subclasses . dup
92-
9339 Dir . mktmpdir do |tmpdir |
9440 @tmpdir = tmpdir
9541 tmpdir_path = Pathname . new ( tmpdir )
9642 builds_dir = tmpdir_path . join ( "app/assets/builds/tailwind" )
9743
9844 Rails . stub ( :root , tmpdir_path ) do
99- # Create a mock engine with tailwind assets
10045 setup_mock_engine ( "mock_engine" , tmpdir_path )
101-
102- # Create an existing file that should be replaced
46+
10347 FileUtils . mkdir_p ( builds_dir )
10448 css_file_path = builds_dir . join ( "mock_engine.css" )
10549 File . write ( css_file_path , "OLD CONTENT" )
106-
107- # Execute the bundle method
50+
10851 Tailwindcss ::Engines . bundle
109-
110- # Assert that the old content was removed
52+
11153 content = File . read ( css_file_path )
11254 assert_no_match ( /OLD CONTENT/ , content )
11355 assert_match ( /DO NOT MODIFY THIS FILE/ , content )
11456 end
11557 end
116-
117- # Restore the original Rails application and engine subclasses
118- Rails . application = original_app
119- Rails ::Engine . instance_variable_set ( :@subclasses , original_subclasses )
12058 end
121-
59+
12260 test "bundle only processes engines with tailwind assets" do
123- # Store the original Rails application and engine subclasses
124- original_app = Rails . application
125- original_subclasses = Rails ::Engine . subclasses . dup
126-
12761 Dir . mktmpdir do |tmpdir |
12862 @tmpdir = tmpdir
12963 tmpdir_path = Pathname . new ( tmpdir )
13064 builds_dir = tmpdir_path . join ( "app/assets/builds/tailwind" )
13165
13266 Rails . stub ( :root , tmpdir_path ) do
133- # Create a mock engine with tailwind assets
13467 setup_mock_engine ( "engine_with_assets" , tmpdir_path )
135-
136- # Create a mock engine without tailwind assets
68+
13769 root_path = tmpdir_path
13870 mock_engine_without_assets = Class . new ( Rails ::Engine ) do
13971 define_singleton_method ( :engine_name ) { "engine_without_assets" }
14072 define_singleton_method ( :root ) { root_path }
14173 end
14274 Rails ::Engine . instance_variable_set ( :@subclasses , Rails ::Engine . subclasses + [ mock_engine_without_assets ] )
143-
144- # Execute the bundle method
75+
14576 Tailwindcss ::Engines . bundle
146-
147- # Assert that only the engine with assets has a CSS file generated
77+
14878 assert File . exist? ( builds_dir . join ( "engine_with_assets.css" ) ) , "Expected CSS file for engine with assets"
14979 refute File . exist? ( builds_dir . join ( "engine_without_assets.css" ) ) , "Expected no CSS file for engine without assets"
15080 end
15181 end
152-
153- # Restore the original Rails application and engine subclasses
154- Rails . application = original_app
155- Rails ::Engine . instance_variable_set ( :@subclasses , original_subclasses )
15682 end
157-
83+
15884 test "bundle handles multiple engines" do
159- # Store the original Rails application and engine subclasses
160- original_app = Rails . application
161- original_subclasses = Rails ::Engine . subclasses . dup
162-
16385 Dir . mktmpdir do |tmpdir |
16486 @tmpdir = tmpdir
16587 tmpdir_path = Pathname . new ( tmpdir )
16688 builds_dir = tmpdir_path . join ( "app/assets/builds/tailwind" )
16789
16890 Rails . stub ( :root , tmpdir_path ) do
169- # Create multiple mock engines with tailwind assets
17091 setup_mock_engine ( "engine1" , tmpdir_path )
17192 setup_mock_engine ( "engine2" , tmpdir_path )
172-
173- # Execute the bundle method
93+
17494 Tailwindcss ::Engines . bundle
175-
176- # Assert that CSS files were generated for both engines
95+
17796 assert File . exist? ( builds_dir . join ( "engine1.css" ) ) , "Expected CSS file for engine1"
17897 assert File . exist? ( builds_dir . join ( "engine2.css" ) ) , "Expected CSS file for engine2"
17998 end
18099 end
181-
182- # Restore the original Rails application and engine subclasses
183- Rails . application = original_app
184- Rails ::Engine . instance_variable_set ( :@subclasses , original_subclasses )
185100 end
186-
101+
187102 private
188-
103+
189104 def setup_mock_engine ( name , root_path )
190- # Create a mock Rails engine with captured local variables
191105 engine_name = name
192106 path = root_path
193107 mock_engine = Class . new ( Rails ::Engine ) do
194108 define_singleton_method ( :engine_name ) { engine_name }
195109 define_singleton_method ( :root ) { path }
196110 end
197-
198- # Create the required tailwind asset file for the mock engine
111+
199112 tailwind_dir = root_path . join ( "app/assets/tailwind/#{ name } " )
200113 FileUtils . mkdir_p ( tailwind_dir )
201- File . write ( tailwind_dir . join ( "application.css" ) , "/* Test CSS */" )
202-
203- # Add the mock engine to Rails::Engine.subclasses
204- Rails ::Engine . instance_variable_set ( :@subclasses , Rails ::Engine . subclasses + [ mock_engine ] )
205-
114+ File . write ( tailwind_dir . join ( "engine.css" ) , "/* Test CSS */" )
115+
206116 mock_engine
207117 end
208- end
118+ end
0 commit comments