1
1
require "test_helper"
2
2
3
3
class 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
-
33
4
test "bundle creates the builds directory" do
34
- # Store the original Rails application for restoration later
35
- original_app = Rails . application
36
-
37
5
Dir . mktmpdir do |tmpdir |
38
6
@tmpdir = tmpdir
39
7
tmpdir_path = Pathname . new ( tmpdir )
40
8
builds_dir = tmpdir_path . join ( "app/assets/builds/tailwind" )
41
9
42
10
Rails . stub ( :root , tmpdir_path ) do
43
- # Execute the bundle method
44
11
Tailwindcss ::Engines . bundle
45
-
46
- # Assert that the directory was created
47
12
assert Dir . exist? ( builds_dir ) , "Expected directory #{ builds_dir } to be created"
48
13
end
49
14
end
50
-
51
- # Restore the original Rails application
52
- Rails . application = original_app
53
15
end
54
-
16
+
55
17
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
-
60
18
Dir . mktmpdir do |tmpdir |
61
19
@tmpdir = tmpdir
62
20
tmpdir_path = Pathname . new ( tmpdir )
63
21
builds_dir = tmpdir_path . join ( "app/assets/builds/tailwind" )
64
22
65
23
Rails . stub ( :root , tmpdir_path ) do
66
- # Create a mock engine with tailwind assets
67
24
setup_mock_engine ( "mock_engine" , tmpdir_path )
68
-
69
- # Execute the bundle method
25
+
70
26
Tailwindcss ::Engines . bundle
71
-
72
- # Assert that the CSS file was generated
27
+
73
28
css_file_path = builds_dir . join ( "mock_engine.css" )
74
29
assert File . exist? ( css_file_path ) , "Expected file #{ css_file_path } to be created"
75
-
76
- # Check content of the generated file
30
+
77
31
content = File . read ( css_file_path )
78
32
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 )
80
34
end
81
35
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 )
86
36
end
87
-
37
+
88
38
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
-
93
39
Dir . mktmpdir do |tmpdir |
94
40
@tmpdir = tmpdir
95
41
tmpdir_path = Pathname . new ( tmpdir )
96
42
builds_dir = tmpdir_path . join ( "app/assets/builds/tailwind" )
97
43
98
44
Rails . stub ( :root , tmpdir_path ) do
99
- # Create a mock engine with tailwind assets
100
45
setup_mock_engine ( "mock_engine" , tmpdir_path )
101
-
102
- # Create an existing file that should be replaced
46
+
103
47
FileUtils . mkdir_p ( builds_dir )
104
48
css_file_path = builds_dir . join ( "mock_engine.css" )
105
49
File . write ( css_file_path , "OLD CONTENT" )
106
-
107
- # Execute the bundle method
50
+
108
51
Tailwindcss ::Engines . bundle
109
-
110
- # Assert that the old content was removed
52
+
111
53
content = File . read ( css_file_path )
112
54
assert_no_match ( /OLD CONTENT/ , content )
113
55
assert_match ( /DO NOT MODIFY THIS FILE/ , content )
114
56
end
115
57
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 )
120
58
end
121
-
59
+
122
60
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
-
127
61
Dir . mktmpdir do |tmpdir |
128
62
@tmpdir = tmpdir
129
63
tmpdir_path = Pathname . new ( tmpdir )
130
64
builds_dir = tmpdir_path . join ( "app/assets/builds/tailwind" )
131
65
132
66
Rails . stub ( :root , tmpdir_path ) do
133
- # Create a mock engine with tailwind assets
134
67
setup_mock_engine ( "engine_with_assets" , tmpdir_path )
135
-
136
- # Create a mock engine without tailwind assets
68
+
137
69
root_path = tmpdir_path
138
70
mock_engine_without_assets = Class . new ( Rails ::Engine ) do
139
71
define_singleton_method ( :engine_name ) { "engine_without_assets" }
140
72
define_singleton_method ( :root ) { root_path }
141
73
end
142
74
Rails ::Engine . instance_variable_set ( :@subclasses , Rails ::Engine . subclasses + [ mock_engine_without_assets ] )
143
-
144
- # Execute the bundle method
75
+
145
76
Tailwindcss ::Engines . bundle
146
-
147
- # Assert that only the engine with assets has a CSS file generated
77
+
148
78
assert File . exist? ( builds_dir . join ( "engine_with_assets.css" ) ) , "Expected CSS file for engine with assets"
149
79
refute File . exist? ( builds_dir . join ( "engine_without_assets.css" ) ) , "Expected no CSS file for engine without assets"
150
80
end
151
81
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 )
156
82
end
157
-
83
+
158
84
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
-
163
85
Dir . mktmpdir do |tmpdir |
164
86
@tmpdir = tmpdir
165
87
tmpdir_path = Pathname . new ( tmpdir )
166
88
builds_dir = tmpdir_path . join ( "app/assets/builds/tailwind" )
167
89
168
90
Rails . stub ( :root , tmpdir_path ) do
169
- # Create multiple mock engines with tailwind assets
170
91
setup_mock_engine ( "engine1" , tmpdir_path )
171
92
setup_mock_engine ( "engine2" , tmpdir_path )
172
-
173
- # Execute the bundle method
93
+
174
94
Tailwindcss ::Engines . bundle
175
-
176
- # Assert that CSS files were generated for both engines
95
+
177
96
assert File . exist? ( builds_dir . join ( "engine1.css" ) ) , "Expected CSS file for engine1"
178
97
assert File . exist? ( builds_dir . join ( "engine2.css" ) ) , "Expected CSS file for engine2"
179
98
end
180
99
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 )
185
100
end
186
-
101
+
187
102
private
188
-
103
+
189
104
def setup_mock_engine ( name , root_path )
190
- # Create a mock Rails engine with captured local variables
191
105
engine_name = name
192
106
path = root_path
193
107
mock_engine = Class . new ( Rails ::Engine ) do
194
108
define_singleton_method ( :engine_name ) { engine_name }
195
109
define_singleton_method ( :root ) { path }
196
110
end
197
-
198
- # Create the required tailwind asset file for the mock engine
111
+
199
112
tailwind_dir = root_path . join ( "app/assets/tailwind/#{ name } " )
200
113
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
+
206
116
mock_engine
207
117
end
208
- end
118
+ end
0 commit comments