asset_hat 0.3.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +2 -0
- data/Gemfile.lock +37 -0
- data/HISTORY +10 -0
- data/README.rdoc +117 -75
- data/Rakefile +4 -4
- data/VERSION.yml +2 -2
- data/asset_hat.gemspec +69 -7
- data/config/assets.yml +46 -24
- data/doc/classes/AssetHat.html +183 -118
- data/doc/classes/AssetHat/CSS.html +21 -21
- data/doc/classes/AssetHat/CSS/Engines.html +10 -10
- data/doc/classes/AssetHat/JS.html +13 -13
- data/doc/classes/AssetHat/JS/Engines.html +10 -10
- data/doc/classes/AssetHat/JS/Vendors.html +85 -22
- data/doc/classes/AssetHatHelper.html +94 -19
- data/doc/created.rid +1 -1
- data/doc/files/HISTORY.html +20 -2
- data/doc/files/LICENSE.html +1 -1
- data/doc/files/README_rdoc.html +87 -31
- data/doc/files/lib/asset_hat/capistrano_rb.html +1 -1
- data/doc/files/lib/asset_hat/css_rb.html +1 -1
- data/doc/files/lib/asset_hat/initializers/action_view_rb.html +49 -0
- data/doc/files/lib/asset_hat/initializers/cache_last_commit_ids_rb.html +49 -0
- data/doc/files/lib/asset_hat/js/vendors_rb.html +1 -1
- data/doc/files/lib/asset_hat/js_rb.html +1 -1
- data/doc/files/lib/asset_hat/railtie_rb.html +61 -0
- data/doc/files/lib/asset_hat/tasks/css_rb.html +1 -1
- data/doc/files/lib/asset_hat/tasks/js_rb.html +1 -1
- data/doc/files/lib/asset_hat/tasks_rb.html +2 -1
- data/doc/files/lib/asset_hat/unicorn_rb.html +58 -0
- data/doc/files/lib/asset_hat/vcs_rb.html +1 -1
- data/doc/files/lib/asset_hat/version_rb.html +1 -1
- data/doc/files/{app/helpers → lib}/asset_hat_helper_rb.html +3 -3
- data/doc/files/lib/asset_hat_rb.html +9 -1
- data/doc/files/lib/tasks/asset_hat_rake.html +54 -0
- data/doc/fr_file_index.html +6 -1
- data/doc/fr_method_index.html +60 -52
- data/lib/asset_hat.rb +104 -59
- data/lib/asset_hat/initializers/action_view.rb +1 -0
- data/lib/asset_hat/initializers/cache_last_commit_ids.rb +1 -0
- data/lib/asset_hat/js/vendors.rb +198 -72
- data/lib/asset_hat/railtie.rb +19 -0
- data/lib/asset_hat/tasks.rb +5 -2
- data/lib/asset_hat/unicorn.rb +9 -0
- data/lib/asset_hat/vcs.rb +3 -2
- data/{app/helpers → lib}/asset_hat_helper.rb +184 -29
- data/{tasks → lib/tasks}/asset_hat.rake +0 -0
- data/rails/init.rb +2 -2
- data/test/asset_hat_helper_test.rb +731 -148
- data/test/asset_hat_test.rb +23 -2
- data/test/test_helper.rb +4 -8
- metadata +311 -30
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'asset_hat'
|
2
|
+
require 'asset_hat_helper'
|
3
|
+
require 'rails'
|
4
|
+
|
5
|
+
module AssetHat
|
6
|
+
class Railtie < Rails::Railtie #:nodoc:
|
7
|
+
initializer 'asset_hat.action_view' do |app|
|
8
|
+
require 'asset_hat/initializers/action_view'
|
9
|
+
end
|
10
|
+
|
11
|
+
initializer 'asset_hat.cache_last_commit_ids' do |app|
|
12
|
+
require 'asset_hat/initializers/cache_last_commit_ids'
|
13
|
+
end
|
14
|
+
|
15
|
+
rake_tasks do
|
16
|
+
load 'tasks/asset_hat.rake'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/asset_hat/tasks.rb
CHANGED
@@ -26,7 +26,9 @@ namespace :asset_hat do
|
|
26
26
|
end
|
27
27
|
|
28
28
|
desc 'Prepare configuration file'
|
29
|
-
task :config
|
29
|
+
task :config do
|
30
|
+
require 'asset_hat'
|
31
|
+
|
30
32
|
template_filepath = File.join(File.dirname(__FILE__), '..', '..',
|
31
33
|
AssetHat::RELATIVE_CONFIG_FILEPATH)
|
32
34
|
target_filepath = AssetHat::CONFIG_FILEPATH
|
@@ -40,7 +42,8 @@ namespace :asset_hat do
|
|
40
42
|
end
|
41
43
|
|
42
44
|
FileUtils.cp(template_filepath, target_filepath)
|
43
|
-
puts "
|
45
|
+
puts "\nWrote to #{target_filepath}. Next, open this file in your editor"
|
46
|
+
puts 'and set up your CSS/JS bundles.'
|
44
47
|
end
|
45
48
|
|
46
49
|
end # namespace :asset_hat
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# Add the code below to your app's unicorn.conf.rb or similar so that assets'
|
2
|
+
# commit IDs are precached only once by the Unicorn master, then propagated
|
3
|
+
# out to workers. (Otherwise, each worker will precache commit IDs, which
|
4
|
+
# wastes resources.) More on configuring Unicorn:
|
5
|
+
# http://unicorn.bogomips.org/Unicorn/Configurator.html
|
6
|
+
|
7
|
+
before_fork do |server, worker|
|
8
|
+
AssetHat.cache_last_commit_ids if defined?(AssetHat)
|
9
|
+
end
|
data/lib/asset_hat/vcs.rb
CHANGED
@@ -46,7 +46,7 @@ module AssetHat
|
|
46
46
|
# Process arguments
|
47
47
|
type = type.to_sym
|
48
48
|
unless TYPES.include?(type)
|
49
|
-
raise
|
49
|
+
raise %{Unknown type "#{type}"; should be one of: #{TYPES.join(', ')}.}
|
50
50
|
return
|
51
51
|
end
|
52
52
|
|
@@ -58,7 +58,8 @@ module AssetHat
|
|
58
58
|
dir = self.assets_dir(type)
|
59
59
|
filepaths = self.bundle_filepaths(bundle, type)
|
60
60
|
if filepaths.present?
|
61
|
-
@last_bundle_commit_ids[type][bundle] =
|
61
|
+
@last_bundle_commit_ids[type][bundle] =
|
62
|
+
self.last_commit_id(*filepaths)
|
62
63
|
end
|
63
64
|
end
|
64
65
|
|
@@ -20,33 +20,34 @@ module AssetHatHelper
|
|
20
20
|
end
|
21
21
|
|
22
22
|
options = args.extract_options!.symbolize_keys
|
23
|
-
filenames = []
|
23
|
+
filenames = [] # May or may not have proper extensions
|
24
24
|
sources = [] # The URLs that are ultimately included via HTML
|
25
25
|
source_commit_ids = {} # Last commit ID for each source
|
26
26
|
|
27
|
-
#
|
27
|
+
# If `use_caching` is `true`, bundles and minified code will be used:
|
28
28
|
use_caching = AssetHat.cache?
|
29
29
|
use_caching = options[:cache] unless options[:cache].nil?
|
30
30
|
options.delete :cache # Completely avoid Rails' built-in caching
|
31
31
|
|
32
|
+
# Gather list of filenames, which may not have proper extensions yet
|
33
|
+
filenames = args.dup
|
32
34
|
if options[:bundle].present? || options[:bundles].present?
|
33
35
|
bundles = [options.delete(:bundle), options.delete(:bundles)].
|
34
36
|
flatten.reject(&:blank?)
|
35
37
|
if use_caching
|
36
|
-
|
38
|
+
filenames += bundles.map do |bundle|
|
37
39
|
File.join(AssetHat.bundles_dir(options.slice(:ssl)),
|
38
40
|
"#{bundle}.min.#{type}")
|
39
41
|
end
|
40
42
|
else
|
41
43
|
config = AssetHat.config
|
42
|
-
filenames
|
44
|
+
filenames += bundles.map { |b| AssetHat.bundle_filenames(b, type) }.
|
43
45
|
flatten.reject(&:blank?)
|
44
46
|
end
|
45
|
-
else
|
46
|
-
filenames = args
|
47
47
|
end
|
48
48
|
|
49
|
-
#
|
49
|
+
# Build `sources`, adding extensions if needed, using minified file if it
|
50
|
+
# already exists
|
50
51
|
filenames.each do |filename|
|
51
52
|
if filename.match(/\.#{type}$/)
|
52
53
|
sources << filename
|
@@ -88,26 +89,34 @@ module AssetHatHelper
|
|
88
89
|
end
|
89
90
|
end
|
90
91
|
|
91
|
-
#
|
92
|
+
# Prepare return value
|
92
93
|
options.delete :ssl
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
94
|
+
if options[:only_url]
|
95
|
+
# Return only asset URLs, not HTML inclusions
|
96
|
+
source_urls = sources.map { |source| asset_path(type, source) }
|
97
|
+
source_urls.size == 1 ? source_urls.first : source_urls
|
98
|
+
else
|
99
|
+
html = sources.map do |src|
|
100
|
+
case type
|
101
|
+
when :css then stylesheet_link_tag(src, options)
|
102
|
+
when :js then javascript_include_tag(src, options)
|
103
|
+
else nil
|
104
|
+
end
|
105
|
+
end.join("\n")
|
106
|
+
html.respond_to?(:html_safe) ? html.html_safe : html
|
107
|
+
end
|
108
|
+
|
100
109
|
end # def include_assets
|
101
110
|
|
102
111
|
# <code>include_css</code> is a smart wrapper for Rails'
|
103
112
|
# <code>stylesheet_link_tag</code>. The two can be used together while
|
104
113
|
# migrating to AssetHat.
|
105
114
|
#
|
106
|
-
# Include a single stylesheet:
|
115
|
+
# Include a single, minified stylesheet:
|
107
116
|
# include_css 'diagnostics'
|
108
117
|
# => <link href="/stylesheets/diagnostics.min.css" media="screen,projection" rel="stylesheet" type="text/css" />
|
109
118
|
#
|
110
|
-
# Include a single unminified stylesheet:
|
119
|
+
# Include a single, unminified stylesheet:
|
111
120
|
# include_css 'diagnostics.css'
|
112
121
|
# => <link href="/stylesheets/diagnostics.css" media="screen,projection" rel="stylesheet" type="text/css" />
|
113
122
|
#
|
@@ -117,15 +126,36 @@ module AssetHatHelper
|
|
117
126
|
# => <link href="/stylesheets/bundles/application.min.css" ... />
|
118
127
|
#
|
119
128
|
# Include multiple stylesheets separately (not as cool):
|
120
|
-
# include_css 'reset', 'application'
|
129
|
+
# include_css 'reset', 'application'
|
121
130
|
# => <link href="/stylesheets/reset.min.css" ... />
|
122
131
|
# <link href="/stylesheets/application.min.css" ... />
|
123
|
-
# <link href="/stylesheets/clearfix.min.css" ... />
|
124
132
|
#
|
125
133
|
# Include a stylesheet with extra media types:
|
126
134
|
# include_css 'mobile', :media => 'handheld,screen,projection'
|
127
135
|
# => <link href="/stylesheets/mobile.min.css"
|
128
136
|
# media="handheld,screen,projection" ... />
|
137
|
+
#
|
138
|
+
# Get the URL for a single, minified stylesheet:
|
139
|
+
# include_css 'diagnostics', :only_url => true
|
140
|
+
# => '/stylesheets/diagnostics.min.css'
|
141
|
+
#
|
142
|
+
# Get the URL for a single, unminified stylesheet:
|
143
|
+
# include_css 'diagnostics.css', :only_url => true
|
144
|
+
# => '/stylesheets/diagnostics.css'
|
145
|
+
#
|
146
|
+
# Get the URL for a bundle of stylesheets when environment *enables* caching
|
147
|
+
# (e.g., staging, production):
|
148
|
+
# include_css :bundle => 'application', :only_url => true
|
149
|
+
# => '/stylesheets/bundles/application.min.css'
|
150
|
+
#
|
151
|
+
# Get URLs for a bundle of stylesheets when environment *disables* caching
|
152
|
+
# (e.g., development, test):
|
153
|
+
# include_css :bundle => 'application', :only_url => true
|
154
|
+
# => ['/stylesheets/reset.css', '/stylesheets/common.css', ...]
|
155
|
+
#
|
156
|
+
# Get URLs for multiple stylesheets manually:
|
157
|
+
# include_css 'reset', 'application', :only_url => true
|
158
|
+
# => ['/stylesheets/reset.css', '/stylesheets/application.css']
|
129
159
|
def include_css(*args)
|
130
160
|
return if args.blank?
|
131
161
|
|
@@ -145,18 +175,18 @@ module AssetHatHelper
|
|
145
175
|
end
|
146
176
|
|
147
177
|
html ||= AssetHat.html_cache[:css][cache_key]
|
148
|
-
html
|
178
|
+
html.respond_to?(:html_safe) ? html.html_safe : html
|
149
179
|
end
|
150
180
|
|
151
181
|
# <code>include_js</code> is a smart wrapper for Rails'
|
152
182
|
# <code>javascript_include_tag</code>. The two can be used together while
|
153
183
|
# migrating to AssetHat.
|
154
184
|
#
|
155
|
-
# Include a single JS file:
|
185
|
+
# Include a single, minified JS file:
|
156
186
|
# include_js 'application'
|
157
187
|
# => <script src="/javascripts/application.min.js" type="text/javascript"></script>
|
158
188
|
#
|
159
|
-
# Include a single JS
|
189
|
+
# Include a single, unminified JS file:
|
160
190
|
# include_js 'application.js'
|
161
191
|
# => <script src="/javascripts/application.js" type="text/javascript"></script>
|
162
192
|
#
|
@@ -169,7 +199,7 @@ module AssetHatHelper
|
|
169
199
|
# include_js :jquery
|
170
200
|
# => <script src="http://ajax.googleapis.com/.../jquery.min.js" ...></script>
|
171
201
|
# # Set jQuery versions either in `config/assets.yml`, or by using
|
172
|
-
# # `include_js :jquery, :version => '1.
|
202
|
+
# # `include_js :jquery, :version => '1.6.0'`.
|
173
203
|
#
|
174
204
|
# Include a bundle of JS files (i.e., a concatenated set of files;
|
175
205
|
# configure in <code>config/assets.yml</code>):
|
@@ -186,6 +216,82 @@ module AssetHatHelper
|
|
186
216
|
# => <script src="/javascripts/bloombox.min.js" ...></script>
|
187
217
|
# <script src="/javascripts/jquery.cookie.min.js" ...></script>
|
188
218
|
# <script src="/javascripts/jquery.json.min.js" ...></script>
|
219
|
+
#
|
220
|
+
# Get the URL for a single, minified JS file:
|
221
|
+
# include_js 'application', :only_url => true
|
222
|
+
# => '/javascripts/application.min.js'
|
223
|
+
#
|
224
|
+
# Get the URL for a single, unminified JS file:
|
225
|
+
# include_js 'application.js', :only_url => true
|
226
|
+
# => '/javascripts/application.js', :only_url => true
|
227
|
+
#
|
228
|
+
# Get the URL for jQuery:
|
229
|
+
# # Development/test environment:
|
230
|
+
# include_js :jquery, :only_url => true
|
231
|
+
# => '/javascripts/jquery-VERSION.min.js'
|
232
|
+
#
|
233
|
+
# # Staging/production environment:
|
234
|
+
# include_js :jquery, :only_url => true
|
235
|
+
# => 'http://ajax.googleapis.com/.../jquery.min.js'
|
236
|
+
#
|
237
|
+
# Get the URL for a bundle of JS files when environment *enables* caching
|
238
|
+
# (e.g., staging, production):
|
239
|
+
# include_js :bundle => 'application', :only_url => true
|
240
|
+
# => '/javascripts/bundles/application.min.js'
|
241
|
+
#
|
242
|
+
# Get URLs for a bundle of JS files when environment *disables* caching
|
243
|
+
# (e.g., development, test):
|
244
|
+
# include_js :bundle => 'application', :only_url => true
|
245
|
+
# => ['/javascripts/jquery.plugin-foo.js',
|
246
|
+
# '/javascripts/jquery.plugin-bar.min.js',
|
247
|
+
# '/javascripts/json2.js',
|
248
|
+
# ...]
|
249
|
+
#
|
250
|
+
# Get URLs for multiple JS files manually:
|
251
|
+
# include_js 'json2', 'application', :only_url => true
|
252
|
+
# => ['/javascripts/json2.js', '/javascripts/application.js']
|
253
|
+
#
|
254
|
+
# Load JS files with {LABjs}[http://labjs.com] (hosted either from cdnjs or
|
255
|
+
# your own web server, if found in <code>public/javascripts/</code>):
|
256
|
+
#
|
257
|
+
# # config/assets.yml:
|
258
|
+
# js:
|
259
|
+
# vendors:
|
260
|
+
# lab_js:
|
261
|
+
# version: 1.x.x
|
262
|
+
#
|
263
|
+
# # Usage:
|
264
|
+
# include_js :jquery, :bundle => 'application', :loader => :lab_js
|
265
|
+
# => <script src="http://ajax.cdnjs.com/.../1.x.x/LAB.min.js" ...></script>
|
266
|
+
# <script type="text/javascript">
|
267
|
+
# window.$LABinst=$LAB.
|
268
|
+
# script('http://ajax.googleapis.com/.../jquery.min.js').wait().
|
269
|
+
# script('/javascripts/bundles/application.min.js').wait();
|
270
|
+
# </script>
|
271
|
+
#
|
272
|
+
# # For advanced fine-tuning, build the LABjs calls manually (based on
|
273
|
+
# # example from http://labjs.com/documentation.php ):
|
274
|
+
# <script>
|
275
|
+
# window.$LABinst = $LAB.
|
276
|
+
# script('<%= include_js 'framework', :only_url => true %>').wait().
|
277
|
+
# script('<%= include_js 'plugin.framework.js',
|
278
|
+
# :only_url => true %>').
|
279
|
+
# script('<%= include_js 'myplugin.framework.js',
|
280
|
+
# :only_url => true %>').wait().
|
281
|
+
# script('<%= include_js 'init.js', :only_url => true %>').wait();
|
282
|
+
# </script>
|
283
|
+
#
|
284
|
+
# # If you want to execute an inline <script> block that relies on any
|
285
|
+
# # of these dependencies, use the JS variable `window.$LABinst`.
|
286
|
+
# # Example (using jQuery to handle when DOM is ready):
|
287
|
+
# <script>
|
288
|
+
# window.$LABinst(function(){
|
289
|
+
# console.log('JS dependencies are ready');
|
290
|
+
# $(function(){
|
291
|
+
# console.log('DOM is ready');
|
292
|
+
# });
|
293
|
+
# });
|
294
|
+
# </script>
|
189
295
|
def include_js(*args)
|
190
296
|
return if args.blank?
|
191
297
|
|
@@ -199,24 +305,73 @@ module AssetHatHelper
|
|
199
305
|
if !AssetHat.cache? || AssetHat.html_cache[:js][cache_key].blank?
|
200
306
|
# Generate HTML and write to cache
|
201
307
|
|
202
|
-
|
308
|
+
htmls = []
|
309
|
+
include_assets_options = options.except(:ssl, :version)
|
310
|
+
loader = nil
|
311
|
+
|
312
|
+
if options[:loader].present?
|
313
|
+
loader = options.delete(:loader)
|
314
|
+
include_assets_options.merge!(:only_url => true)
|
315
|
+
end
|
316
|
+
|
317
|
+
# Get vendor HTML/URLs
|
203
318
|
included_vendors = (args & AssetHat::JS::VENDORS)
|
319
|
+
|
320
|
+
# Add HTML inclusions for vendors
|
204
321
|
included_vendors.each do |vendor|
|
205
322
|
args.delete vendor
|
206
323
|
src = AssetHat::JS::Vendors.source_for(
|
207
324
|
vendor, options.slice(:ssl, :version))
|
208
|
-
|
325
|
+
htmls << include_assets(:js, src,
|
326
|
+
include_assets_options.merge(:cache => true).
|
327
|
+
except(:bundle, :bundles))
|
209
328
|
end
|
210
329
|
|
211
|
-
|
330
|
+
# Get non-vendor HTML/URLs
|
331
|
+
htmls << include_assets(:js, *(args + [include_assets_options]))
|
332
|
+
htmls.reject!(&:blank?)
|
212
333
|
|
213
|
-
|
214
|
-
|
334
|
+
if loader
|
335
|
+
# `htmls` actually contains URLs; convert to an HTML/JS block
|
336
|
+
urls = htmls.dup.flatten
|
337
|
+
htmls = []
|
338
|
+
|
339
|
+
case loader
|
340
|
+
when :lab_js
|
341
|
+
htmls << include_js(:lab_js)
|
342
|
+
htmls << '<script type="text/javascript">'
|
343
|
+
htmls << AssetHat::JS::Vendors.loader_js(:lab_js, :urls => urls)
|
344
|
+
htmls << '</script>'
|
345
|
+
end
|
346
|
+
end
|
347
|
+
|
348
|
+
# Convert to a URL (string), array of URLs, or one long HTML string
|
349
|
+
html = if options[:only_url]
|
350
|
+
# Return one URL (string) or multiple (array of strings).
|
351
|
+
# Not actually HTML.
|
352
|
+
htmls.flatten!
|
353
|
+
htmls.size == 1 ? htmls.first : htmls
|
354
|
+
else
|
355
|
+
# Return one long string of HTML
|
356
|
+
htmls.join("\n").strip
|
357
|
+
end
|
215
358
|
AssetHat.html_cache[:js][cache_key] = html
|
216
359
|
end
|
217
360
|
|
218
361
|
html ||= AssetHat.html_cache[:js][cache_key]
|
219
|
-
html
|
362
|
+
html.respond_to?(:html_safe) ? html.html_safe : html
|
363
|
+
end
|
364
|
+
|
365
|
+
# Returns the public URL path to the given source file.
|
366
|
+
#
|
367
|
+
# <code>type</code> argument: <code>:css</code> or <code>:js</code>
|
368
|
+
def asset_path(type, source)
|
369
|
+
case type.to_sym
|
370
|
+
when :css ; stylesheet_path(source)
|
371
|
+
when :js ; javascript_path(source)
|
372
|
+
else
|
373
|
+
raise %{Unknown type "#{type}"; should be one of: #{TYPES.join(', ')}.}
|
374
|
+
end
|
220
375
|
end
|
221
376
|
|
222
377
|
end
|
File without changes
|
data/rails/init.rb
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
require 'asset_hat/initializers/action_view'
|
2
|
+
require 'asset_hat/initializers/cache_last_commit_ids'
|
@@ -4,71 +4,116 @@ class AssetHatHelperTest < ActionView::TestCase
|
|
4
4
|
RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
|
5
5
|
|
6
6
|
context 'include_css' do
|
7
|
+
setup { flexmock_rails_app }
|
8
|
+
|
7
9
|
context 'with caching enabled' do
|
8
10
|
context 'with minified versions' do
|
9
11
|
setup do
|
10
12
|
@commit_id = '111'
|
11
|
-
flexmock(AssetHat
|
13
|
+
flexmock(AssetHat).should_receive(:last_commit_id => @commit_id).
|
14
|
+
by_default
|
12
15
|
end
|
13
16
|
|
14
17
|
should 'include one file by name, and ' +
|
15
18
|
'automatically use minified version' do
|
16
19
|
flexmock(AssetHat, :asset_exists? => true)
|
17
|
-
|
18
|
-
|
20
|
+
expected_html = css_tag("foo.min.css?#{@commit_id}")
|
21
|
+
expected_path =
|
22
|
+
AssetHat.assets_path(:css) + "/foo.min.css?#{@commit_id}"
|
23
|
+
|
24
|
+
assert_equal expected_html, include_css('foo', :cache => true)
|
25
|
+
assert_equal expected_path, include_css('foo', :cache => true,
|
26
|
+
:only_url => true)
|
19
27
|
end
|
20
28
|
|
21
29
|
should 'include one unminified file by name and extension' do
|
22
|
-
|
23
|
-
|
30
|
+
expected_html = css_tag("foo.css?#{@commit_id}")
|
31
|
+
expected_path =
|
32
|
+
AssetHat.assets_path(:css) + "/foo.css?#{@commit_id}"
|
33
|
+
|
34
|
+
assert_equal expected_html, include_css('foo.css', :cache => true)
|
35
|
+
assert_equal expected_path, include_css('foo.css', :cache => true,
|
36
|
+
:only_url => true)
|
24
37
|
end
|
25
38
|
|
26
39
|
should 'include one minified file by name and extension' do
|
27
|
-
|
28
|
-
|
40
|
+
expected_html = css_tag("foo.min.css?#{@commit_id}")
|
41
|
+
expected_path =
|
42
|
+
AssetHat.assets_path(:css) + "/foo.min.css?#{@commit_id}"
|
43
|
+
|
44
|
+
assert_equal expected_html,
|
45
|
+
include_css('foo.min.css', :cache => true)
|
46
|
+
assert_equal expected_path,
|
47
|
+
include_css('foo.min.css', :cache => true, :only_url => true)
|
29
48
|
end
|
30
49
|
|
31
50
|
should 'include multiple files by name' do
|
32
51
|
flexmock(AssetHat, :asset_exists? => true)
|
33
|
-
|
52
|
+
|
53
|
+
sources = %w[foo bar]
|
54
|
+
expected_html = sources.map do |source|
|
34
55
|
css_tag("#{source}.min.css?#{@commit_id}")
|
35
56
|
end.join("\n")
|
36
|
-
|
37
|
-
|
57
|
+
expected_paths = sources.map do |source|
|
58
|
+
AssetHat.assets_path(:css) + "/#{source}.min.css?#{@commit_id}"
|
59
|
+
end
|
60
|
+
|
61
|
+
assert_equal expected_html,
|
62
|
+
include_css('foo', 'bar', :cache => true)
|
63
|
+
assert_equal expected_paths,
|
64
|
+
include_css('foo', 'bar', :cache => true, :only_url => true)
|
38
65
|
end
|
39
66
|
|
40
67
|
should 'include multiple files as a bundle' do
|
41
68
|
bundle = 'css-bundle-1'
|
42
|
-
|
43
|
-
|
44
|
-
|
69
|
+
expected_html = css_tag("bundles/#{bundle}.min.css?#{@commit_id}")
|
70
|
+
expected_path =
|
71
|
+
AssetHat.bundles_path(:css) + "/#{bundle}.min.css?#{@commit_id}"
|
72
|
+
|
73
|
+
assert_equal expected_html,
|
74
|
+
include_css(:bundle => bundle, :cache => true)
|
75
|
+
assert_equal expected_path,
|
76
|
+
include_css(:bundle => bundle, :cache => true, :only_url => true)
|
45
77
|
end
|
46
78
|
|
47
79
|
context 'via SSL' do
|
48
80
|
setup do
|
49
|
-
@request =
|
50
|
-
flexmock(@controller
|
51
|
-
|
81
|
+
@request = test_request
|
82
|
+
flexmock(@controller).should_receive(:request => @request).
|
83
|
+
by_default
|
84
|
+
flexmock(@controller.request).should_receive(:ssl? => true).
|
85
|
+
by_default
|
52
86
|
assert @controller.request.ssl?,
|
53
87
|
'Precondition: Request should use SSL'
|
54
88
|
end
|
55
89
|
|
56
90
|
should 'include multiple files as a SSL bundle' do
|
57
91
|
flexmock(AssetHat, :ssl_asset_host_differs? => true)
|
58
|
-
|
59
92
|
bundle = 'css-bundle-1'
|
60
|
-
|
61
|
-
|
62
|
-
|
93
|
+
expected_html =
|
94
|
+
css_tag("bundles/ssl/#{bundle}.min.css?#{@commit_id}")
|
95
|
+
expected_path = AssetHat.bundles_path(:css, :ssl => true) +
|
96
|
+
"/#{bundle}.min.css?#{@commit_id}"
|
97
|
+
|
98
|
+
assert_equal expected_html,
|
99
|
+
include_css(:bundle => bundle, :cache => true)
|
100
|
+
assert_equal expected_path,
|
101
|
+
include_css(:bundle => bundle, :cache => true,
|
102
|
+
:only_url => true)
|
63
103
|
end
|
64
104
|
|
65
105
|
should 'use non-SSL CSS if SSL/non-SSL asset hosts are the same' do
|
66
106
|
flexmock(AssetHat, :ssl_asset_host_differs? => false)
|
67
|
-
|
68
107
|
bundle = 'css-bundle-1'
|
69
|
-
|
70
|
-
|
71
|
-
|
108
|
+
expected_html = css_tag("bundles/#{bundle}.min.css?#{@commit_id}")
|
109
|
+
expected_path = AssetHat.bundles_path(:css) +
|
110
|
+
"/#{bundle}.min.css?#{@commit_id}"
|
111
|
+
|
112
|
+
assert_equal expected_html,
|
113
|
+
include_css(:bundle => bundle, :cache => true)
|
114
|
+
assert_equal expected_path,
|
115
|
+
include_css(:bundle => bundle, :cache => true,
|
116
|
+
:only_url => true)
|
72
117
|
end
|
73
118
|
end # context 'via SSL'
|
74
119
|
|
@@ -77,8 +122,11 @@ class AssetHatHelperTest < ActionView::TestCase
|
|
77
122
|
context 'without minified versions' do
|
78
123
|
should 'include one file by name, and ' +
|
79
124
|
'automatically use original version' do
|
80
|
-
|
81
|
-
|
125
|
+
expected_html = css_tag('foo.css')
|
126
|
+
expected_path = AssetHat.assets_path(:css) + '/foo.css'
|
127
|
+
|
128
|
+
assert_equal expected_html, include_css('foo')
|
129
|
+
assert_equal expected_path, include_css('foo', :only_url => true)
|
82
130
|
end
|
83
131
|
end # context 'without minified versions'
|
84
132
|
end # context 'with caching enabled'
|
@@ -86,20 +134,35 @@ class AssetHatHelperTest < ActionView::TestCase
|
|
86
134
|
context 'with caching disabled' do
|
87
135
|
should 'include one file by name, and ' +
|
88
136
|
'automatically use original version' do
|
89
|
-
|
90
|
-
|
137
|
+
expected_html = css_tag('foo.css')
|
138
|
+
expected_path = AssetHat.assets_path(:css) + '/foo.css'
|
139
|
+
|
140
|
+
assert_equal expected_html, include_css('foo', :cache => false)
|
141
|
+
assert_equal expected_path, include_css('foo', :cache => false,
|
142
|
+
:only_url => true)
|
91
143
|
end
|
92
144
|
|
93
145
|
should 'include one unminified file by name and extension' do
|
94
|
-
|
95
|
-
|
146
|
+
expected_html = css_tag('foo.css')
|
147
|
+
expected_path = AssetHat.assets_path(:css) + '/foo.css'
|
148
|
+
|
149
|
+
assert_equal expected_html, include_css('foo.css', :cache => false)
|
150
|
+
assert_equal expected_path, include_css('foo.css', :cache => false,
|
151
|
+
:only_url => true)
|
96
152
|
end
|
97
153
|
|
98
154
|
should 'include multiple files by name' do
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
155
|
+
sources = %w[foo bar.min]
|
156
|
+
expected_html =
|
157
|
+
sources.map { |source| css_tag("#{source}.css") }.join("\n")
|
158
|
+
expected_paths = sources.map do |source|
|
159
|
+
AssetHat.assets_path(:css) + "/#{source}.css"
|
160
|
+
end
|
161
|
+
|
162
|
+
assert_equal expected_html,
|
163
|
+
include_css('foo', 'bar.min', :cache => false)
|
164
|
+
assert_equal expected_paths,
|
165
|
+
include_css('foo', 'bar.min', :cache => false, :only_url => true)
|
103
166
|
end
|
104
167
|
|
105
168
|
context 'with real bundle files' do
|
@@ -111,31 +174,70 @@ class AssetHatHelperTest < ActionView::TestCase
|
|
111
174
|
|
112
175
|
should 'include a bundle as separate files' do
|
113
176
|
bundle = 'css-bundle-1'
|
114
|
-
|
177
|
+
bundle_filenames = @config['css']['bundles'][bundle]
|
178
|
+
expected_html = bundle_filenames.map do |source|
|
115
179
|
css_tag("#{source}.css?#{@asset_id}")
|
116
180
|
end.join("\n")
|
117
|
-
|
118
|
-
|
181
|
+
expected_paths = bundle_filenames.map do |source|
|
182
|
+
AssetHat.assets_path(:css) + "/#{source}.css?#{@asset_id}"
|
183
|
+
end
|
184
|
+
|
185
|
+
assert_equal expected_html,
|
186
|
+
include_css(:bundle => bundle, :cache => false)
|
187
|
+
assert_equal expected_paths,
|
188
|
+
include_css(:bundle => bundle, :cache => false, :only_url => true)
|
119
189
|
end
|
120
190
|
|
121
191
|
should 'include a bundle as separate files ' +
|
122
192
|
'with a symbol bundle name' do
|
123
193
|
bundle = 'css-bundle-1'
|
124
|
-
expected = @config['css']['bundles'][bundle].map
|
194
|
+
expected = @config['css']['bundles'][bundle].map { |source|
|
125
195
|
css_tag("#{source}.css?#{@asset_id}")
|
126
|
-
|
196
|
+
}.join("\n")
|
127
197
|
output = include_css(:bundle => bundle.to_sym, :cache => false)
|
128
198
|
assert_equal expected, output
|
129
199
|
end
|
130
200
|
|
131
201
|
should 'include multiple bundles as separate files' do
|
132
|
-
bundles = [1,2
|
133
|
-
|
202
|
+
bundles = [1,2].map { |i| "css-bundle-#{i}" }
|
203
|
+
expected_html = bundles.map { |bundle|
|
134
204
|
sources = @config['css']['bundles'][bundle]
|
135
205
|
sources.map { |src| css_tag("#{src}.css?#{@asset_id}") }
|
136
|
-
|
137
|
-
|
138
|
-
|
206
|
+
}.flatten.uniq.join("\n")
|
207
|
+
expected_paths = bundles.map do |bundle|
|
208
|
+
sources = @config['css']['bundles'][bundle]
|
209
|
+
sources.map do |src|
|
210
|
+
AssetHat.assets_path(:css) + "/#{src}.css?#{@asset_id}"
|
211
|
+
end
|
212
|
+
end.flatten.uniq
|
213
|
+
|
214
|
+
assert_equal expected_html,
|
215
|
+
include_css(:bundles => bundles, :cache => false)
|
216
|
+
assert_equal expected_paths,
|
217
|
+
include_css(:bundles => bundles, :cache => false,
|
218
|
+
:only_url => true)
|
219
|
+
end
|
220
|
+
|
221
|
+
should 'include named files and bundles together' do
|
222
|
+
bundles = ['css-bundle-2']
|
223
|
+
expected_html = css_tag("css-file-1-1.css?#{@asset_id}") + "\n" +
|
224
|
+
bundles.map do |bundle|
|
225
|
+
sources = @config['css']['bundles'][bundle]
|
226
|
+
sources.map { |src| css_tag("#{src}.css?#{@asset_id}") }
|
227
|
+
end.flatten.uniq.join("\n")
|
228
|
+
expected_paths = ["/stylesheets/css-file-1-1.css?#{@asset_id}"] +
|
229
|
+
bundles.map do |bundle|
|
230
|
+
sources = @config['css']['bundles'][bundle]
|
231
|
+
sources.map do |src|
|
232
|
+
AssetHat.assets_path(:css) + "/#{src}.css?#{@asset_id}"
|
233
|
+
end
|
234
|
+
end.flatten.uniq
|
235
|
+
|
236
|
+
assert_equal expected_html,
|
237
|
+
include_css('css-file-1-1', :bundles => bundles, :cache => false)
|
238
|
+
assert_equal expected_paths,
|
239
|
+
include_css('css-file-1-1', :bundles => bundles, :cache => false,
|
240
|
+
:only_url => true)
|
139
241
|
end
|
140
242
|
end # context 'with real bundle files'
|
141
243
|
end # context 'with caching disabled'
|
@@ -143,78 +245,123 @@ class AssetHatHelperTest < ActionView::TestCase
|
|
143
245
|
|
144
246
|
context 'include_js' do
|
145
247
|
setup do
|
146
|
-
|
147
|
-
|
248
|
+
flexmock_rails_app
|
249
|
+
@request = test_request
|
250
|
+
flexmock(@controller).should_receive(:request => @request).by_default
|
148
251
|
end
|
149
252
|
|
150
253
|
context 'with caching enabled' do
|
151
254
|
context 'with minified versions' do
|
152
255
|
setup do
|
153
256
|
@commit_id = '111'
|
154
|
-
flexmock(AssetHat
|
155
|
-
:last_commit_id
|
257
|
+
flexmock(AssetHat).should_receive(
|
258
|
+
:last_commit_id => @commit_id,
|
156
259
|
:last_bundle_commit_id => @commit_id
|
157
|
-
)
|
260
|
+
).by_default
|
158
261
|
end
|
159
262
|
|
160
263
|
should 'include one file by name, and ' +
|
161
264
|
'automatically use minified version' do
|
162
265
|
flexmock(AssetHat, :asset_exists? => true)
|
163
|
-
|
164
|
-
|
165
|
-
|
266
|
+
expected_html = js_tag("jquery.some-plugin.min.js?#{@commit_id}")
|
267
|
+
expected_path = AssetHat.assets_path(:js) +
|
268
|
+
"/jquery.some-plugin.min.js?#{@commit_id}"
|
269
|
+
|
270
|
+
assert_equal expected_html,
|
271
|
+
include_js('jquery.some-plugin', :cache => true)
|
272
|
+
assert_equal expected_path,
|
273
|
+
include_js('jquery.some-plugin', :cache => true,
|
274
|
+
:only_url => true)
|
166
275
|
end
|
167
276
|
|
168
277
|
should 'include one unminified file by name and extension' do
|
169
|
-
|
170
|
-
|
278
|
+
filename = 'jquery.some-plugin.js'
|
279
|
+
expected_html = js_tag("#{filename}?#{@commit_id}")
|
280
|
+
expected_path =
|
281
|
+
AssetHat.assets_path(:js) + "/#{filename}?#{@commit_id}"
|
282
|
+
|
283
|
+
assert_equal expected_html, include_js(filename, :cache => true)
|
284
|
+
assert_equal expected_path, include_js(filename, :cache => true,
|
285
|
+
:only_url => true)
|
171
286
|
end
|
172
287
|
|
173
288
|
should 'include one minified file by name and extension' do
|
174
|
-
|
175
|
-
|
176
|
-
|
289
|
+
filename = 'jquery.some-plugin.min.js'
|
290
|
+
expected_html = js_tag("#{filename}?#{@commit_id}")
|
291
|
+
expected_path =
|
292
|
+
AssetHat.assets_path(:js) + "/#{filename}?#{@commit_id}"
|
293
|
+
|
294
|
+
assert_equal expected_html, include_js(filename, :cache => true)
|
295
|
+
assert_equal expected_path, include_js(filename, :cache => true,
|
296
|
+
:only_url => true)
|
177
297
|
end
|
178
298
|
|
179
299
|
context 'with vendors' do
|
180
300
|
should 'know where to find each vendor file' do
|
181
301
|
AssetHat::JS::VENDORS.each do |vendor|
|
182
302
|
assert include_js(vendor, :cache => true).present?
|
303
|
+
assert include_js(vendor, :cache => true,
|
304
|
+
:only_url => true).present?
|
183
305
|
end
|
184
306
|
end
|
185
307
|
|
186
|
-
should 'include jQuery and jQuery UI' do
|
187
|
-
flexmock(AssetHat, :config => @original_config)
|
308
|
+
should 'include jQuery and jQuery UI via local vendor files' do
|
188
309
|
[:jquery, :jquery_ui].each do |vendor|
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
310
|
+
vendor_filename = "#{vendor.to_s.dasherize}.min.js"
|
311
|
+
flexmock(AssetHat).should_receive(:asset_exists?).
|
312
|
+
with(vendor_filename, :js).and_return(true)
|
313
|
+
|
314
|
+
expected_html = js_tag("#{vendor_filename}?#{@commit_id}")
|
315
|
+
expected_path = AssetHat.assets_path(:js) +
|
316
|
+
"/#{vendor_filename}?#{@commit_id}"
|
317
|
+
|
318
|
+
assert_equal expected_html, include_js(vendor, :cache => true)
|
319
|
+
assert_equal expected_path, include_js(vendor, :cache => true,
|
320
|
+
:only_url => true)
|
193
321
|
end
|
194
322
|
end
|
195
323
|
|
196
|
-
should 'include Prototype and script.aculo.us'
|
324
|
+
should 'include Prototype and script.aculo.us ' +
|
325
|
+
'via local vendor files' do
|
197
326
|
[:prototype, :scriptaculous].each do |vendor|
|
198
|
-
|
199
|
-
|
327
|
+
vendor_filename = "#{vendor}.js"
|
328
|
+
flexmock(AssetHat).should_receive(:asset_exists?).
|
329
|
+
with(vendor_filename, :js).and_return(true)
|
330
|
+
|
331
|
+
expected_html = js_tag("#{vendor_filename}?#{@commit_id}")
|
200
332
|
# N.B.: Including only the regular, not minified, version
|
333
|
+
expected_path = AssetHat.assets_path(:js) +
|
334
|
+
"/#{vendor_filename}?#{@commit_id}"
|
335
|
+
|
336
|
+
assert_equal expected_html, include_js(vendor, :cache => true)
|
337
|
+
assert_equal expected_path, include_js(vendor, :cache => true,
|
338
|
+
:only_url => true)
|
201
339
|
end
|
202
340
|
end
|
203
341
|
|
342
|
+
should 'not use a remote URL fallback if version is unknown' do
|
343
|
+
output = include_js(:jquery, :cache => true)
|
344
|
+
assert_equal js_tag("jquery.min.js?#{@commit_id}"), output
|
345
|
+
end
|
346
|
+
|
204
347
|
context 'with remote requests via SSL' do
|
205
348
|
should 'include vendor JS via Google CDN' do
|
206
|
-
AssetHat::JS::
|
349
|
+
AssetHat::JS::Vendors::VENDORS_ON_GOOGLE_CDN.each do |vendor|
|
207
350
|
AssetHat.html_cache[:js] = {}
|
208
351
|
helper_opts = {:version => '1', :cache => true}
|
209
352
|
|
353
|
+
# Setup
|
210
354
|
flexmock_teardown
|
211
|
-
|
212
|
-
flexmock(
|
213
|
-
:
|
355
|
+
flexmock_rails_app
|
356
|
+
flexmock(AssetHat,
|
357
|
+
:cache? => true,
|
358
|
+
:consider_all_requests_local? => false
|
359
|
+
)
|
360
|
+
|
361
|
+
# Test inclusion via SSL
|
214
362
|
flexmock(@controller.request, :ssl? => true)
|
215
363
|
assert @controller.request.ssl?,
|
216
364
|
'Precondition: Request should use SSL'
|
217
|
-
|
218
365
|
https_html = include_js(vendor, helper_opts.dup)
|
219
366
|
assert_match(
|
220
367
|
%r{src="https://ajax\.googleapis\.com/}, https_html)
|
@@ -223,12 +370,17 @@ class AssetHatHelperTest < ActionView::TestCase
|
|
223
370
|
AssetHat.html_cache[:js].to_a.first[1],
|
224
371
|
'SSL HTML should be cached'
|
225
372
|
|
226
|
-
|
373
|
+
# Re-setup
|
227
374
|
flexmock_teardown
|
228
|
-
|
229
|
-
flexmock(
|
230
|
-
:
|
375
|
+
flexmock_rails_app
|
376
|
+
flexmock(AssetHat,
|
377
|
+
:cache? => true,
|
378
|
+
:consider_all_requests_local? => false
|
379
|
+
)
|
380
|
+
|
381
|
+
# Test caching of SSL inclusion HTML
|
231
382
|
flexmock(@controller.request, :ssl? => false)
|
383
|
+
http_cache_key = AssetHat.html_cache[:js].to_a.first[0]
|
232
384
|
assert !@controller.request.ssl?,
|
233
385
|
'Precondition: Request should not use SSL'
|
234
386
|
assert_equal 1, AssetHat.html_cache[:js].size
|
@@ -236,7 +388,8 @@ class AssetHatHelperTest < ActionView::TestCase
|
|
236
388
|
AssetHat.html_cache[:js][http_cache_key],
|
237
389
|
'SSL HTML should be still be cached'
|
238
390
|
|
239
|
-
|
391
|
+
# Test inclusion, and caching of inclusion HTML, via non-SSL
|
392
|
+
http_html = include_js(vendor, helper_opts.dup)
|
240
393
|
assert_match(
|
241
394
|
%r{src="http://ajax\.googleapis\.com/},
|
242
395
|
http_html,
|
@@ -251,53 +404,181 @@ class AssetHatHelperTest < ActionView::TestCase
|
|
251
404
|
'Non-SSL HTML should be cached'
|
252
405
|
end
|
253
406
|
end
|
407
|
+
|
408
|
+
should 'get vendor URLs pointing to Google CDN' do
|
409
|
+
AssetHat::JS::Vendors::VENDORS_ON_GOOGLE_CDN.each do |vendor|
|
410
|
+
AssetHat.html_cache[:js] = {}
|
411
|
+
helper_opts = {:version => '1', :cache => true}
|
412
|
+
|
413
|
+
# Setup
|
414
|
+
flexmock_teardown
|
415
|
+
flexmock_rails_app
|
416
|
+
flexmock(AssetHat,
|
417
|
+
:cache? => true,
|
418
|
+
:consider_all_requests_local? => false
|
419
|
+
)
|
420
|
+
|
421
|
+
# Test SSL URL and URL caching
|
422
|
+
flexmock(@controller.request, :ssl? => true)
|
423
|
+
assert @controller.request.ssl?,
|
424
|
+
'Precondition: Request should use SSL'
|
425
|
+
https_url = include_js(vendor,
|
426
|
+
helper_opts.dup.merge(:only_url => true))
|
427
|
+
assert_equal 1, AssetHat.html_cache[:js].size
|
428
|
+
assert_match %r{^https://ajax\.googleapis\.com/}, https_url
|
429
|
+
|
430
|
+
# Re-setup
|
431
|
+
flexmock_teardown
|
432
|
+
flexmock_rails_app
|
433
|
+
flexmock(AssetHat,
|
434
|
+
:cache? => true,
|
435
|
+
:consider_all_requests_local? => false
|
436
|
+
)
|
437
|
+
|
438
|
+
# Test non-SSL URL and URL caching
|
439
|
+
flexmock(@controller.request, :ssl? => false)
|
440
|
+
assert !@controller.request.ssl?,
|
441
|
+
'Precondition: Request should not use SSL'
|
442
|
+
http_url = include_js(vendor,
|
443
|
+
helper_opts.dup.merge(:only_url => true))
|
444
|
+
assert_equal 2, AssetHat.html_cache[:js].size
|
445
|
+
assert_match %r{^http://ajax\.googleapis\.com/}, http_url
|
446
|
+
end
|
447
|
+
end
|
254
448
|
end # context 'with remote requests via SSL'
|
255
449
|
end # context 'with vendor JS'
|
256
450
|
|
257
|
-
|
258
|
-
version = '1.4.1'
|
259
|
-
output = include_js(:jquery, :version => version, :cache => true)
|
260
|
-
assert_equal(
|
261
|
-
js_tag("jquery-#{version}.min.js?#{@commit_id}"), output)
|
262
|
-
end
|
263
|
-
|
264
|
-
context 'with a mock config' do
|
451
|
+
context 'with a mock config containing a version number' do
|
265
452
|
setup do
|
266
|
-
|
453
|
+
@vendor_version = '1.6.0'
|
267
454
|
config = AssetHat.config
|
268
455
|
config['js']['vendors'] = {
|
269
|
-
'jquery' => {
|
270
|
-
'version' => version,
|
271
|
-
'remote_url' => 'http://example.com/cdn/jquery.min.js',
|
272
|
-
'remote_ssl_url' => 'https://secure.example.com/cdn/jquery.min.js'
|
273
|
-
}
|
456
|
+
'jquery' => {'version' => @vendor_version}
|
274
457
|
}
|
275
|
-
flexmock(AssetHat
|
458
|
+
flexmock(AssetHat).should_receive(:config => config).by_default
|
276
459
|
end
|
277
460
|
|
278
|
-
should 'include
|
279
|
-
|
461
|
+
should 'include local copy of vendor with version in config file' do
|
462
|
+
vendor_filename = "jquery-#{@vendor_version}.min.js"
|
463
|
+
flexmock(AssetHat).should_receive(:asset_exists?).
|
464
|
+
with(vendor_filename, :js).and_return(true)
|
465
|
+
|
466
|
+
expected_html = js_tag("#{vendor_filename}?#{@commit_id}")
|
467
|
+
expected_path =
|
468
|
+
AssetHat.assets_path(:js) + "/#{vendor_filename}?#{@commit_id}"
|
469
|
+
|
470
|
+
assert_equal expected_html, include_js(:jquery, :cache => true)
|
471
|
+
assert_equal expected_path, include_js(:jquery, :cache => true,
|
472
|
+
:only_url => true)
|
473
|
+
end
|
474
|
+
|
475
|
+
should 'include local copy of vendor with ' +
|
476
|
+
'custom version in helper options' do
|
477
|
+
custom_version = '1.3.2'
|
478
|
+
vendor_filename = "jquery-#{custom_version}.min.js"
|
479
|
+
flexmock(AssetHat).should_receive(:asset_exists?).
|
480
|
+
with(vendor_filename, :js).and_return(true)
|
481
|
+
|
280
482
|
assert_equal(
|
281
|
-
js_tag("
|
282
|
-
include_js(:jquery, :cache => true)
|
283
|
-
)
|
483
|
+
js_tag("#{vendor_filename}?#{@commit_id}"),
|
484
|
+
include_js(:jquery, :version => custom_version, :cache => true))
|
284
485
|
end
|
285
486
|
|
286
|
-
context 'with
|
487
|
+
context 'with local requests but no local copy of vendor file' do
|
287
488
|
setup do
|
288
|
-
|
289
|
-
|
489
|
+
# Mock for version from config file:
|
490
|
+
flexmock(AssetHat).should_receive(:asset_exists?).
|
491
|
+
with("jquery-#{@vendor_version}.min.js", :js).
|
492
|
+
and_return(false).by_default
|
493
|
+
|
494
|
+
# Mock for version from helper options:
|
495
|
+
@custom_vendor_version = '1.3.2'
|
496
|
+
flexmock(AssetHat).should_receive(:asset_exists?).
|
497
|
+
with("jquery-#{@custom_vendor_version}.min.js", :js).
|
498
|
+
and_return(false).by_default
|
499
|
+
|
500
|
+
assert AssetHat.consider_all_requests_local?, 'Precondition'
|
501
|
+
end
|
502
|
+
|
503
|
+
should 'fall back to default remote vendor URL ' +
|
504
|
+
'with version in config file' do
|
505
|
+
src = "http://ajax.googleapis.com/ajax/libs/jquery/" +
|
506
|
+
"#{@vendor_version}/jquery.min.js"
|
507
|
+
|
508
|
+
assert_equal(
|
509
|
+
%{<script src="#{src}" type="text/javascript"></script>},
|
510
|
+
include_js(:jquery, :cache => true))
|
511
|
+
end
|
512
|
+
|
513
|
+
should 'fall back to default remote vendor URL ' +
|
514
|
+
'with custom version in helper options' do
|
515
|
+
src = "http://ajax.googleapis.com/ajax/libs/jquery/" +
|
516
|
+
"#{@custom_vendor_version}/jquery.min.js"
|
517
|
+
|
518
|
+
assert_equal(
|
519
|
+
%{<script src="#{src}" type="text/javascript"></script>},
|
520
|
+
include_js(:jquery, :version => @custom_vendor_version,
|
521
|
+
:cache => true))
|
522
|
+
end
|
523
|
+
|
524
|
+
should 'fall back to default remote vendor SSL URL ' +
|
525
|
+
'with version in config file' do
|
526
|
+
flexmock(@controller.request, :ssl? => true)
|
527
|
+
src = "https://ajax.googleapis.com/ajax/libs/jquery/" +
|
528
|
+
"#{@vendor_version}/jquery.min.js"
|
529
|
+
|
530
|
+
assert_equal(
|
531
|
+
%{<script src="#{src}" type="text/javascript"></script>},
|
532
|
+
include_js(:jquery, :cache => true))
|
533
|
+
end
|
534
|
+
|
535
|
+
should 'fall back to default remote vendor SSL URL ' +
|
536
|
+
'with custom version in helper options' do
|
537
|
+
flexmock(@controller.request, :ssl? => true)
|
538
|
+
src = "https://ajax.googleapis.com/ajax/libs/jquery/" +
|
539
|
+
"#{@custom_vendor_version}/jquery.min.js"
|
540
|
+
|
541
|
+
assert_equal(
|
542
|
+
%{<script src="#{src}" type="text/javascript"></script>},
|
543
|
+
include_js(:jquery, :version => @custom_vendor_version,
|
544
|
+
:cache => true))
|
290
545
|
end
|
291
546
|
|
292
|
-
|
547
|
+
end # context 'with local requests but no local copy of vendor file'
|
548
|
+
end # context 'with a mock config containing a version number'
|
549
|
+
|
550
|
+
context 'with a mock config containing custom CDN URLs' do
|
551
|
+
setup do
|
552
|
+
@vendor_version = '1.6.0'
|
553
|
+
config = AssetHat.config
|
554
|
+
config['js']['vendors'] = {
|
555
|
+
'jquery' => {
|
556
|
+
'version' => @vendor_version,
|
557
|
+
'remote_url' => 'http://example.com/cdn/' +
|
558
|
+
"jquery-#{@vendor_version}.min.js",
|
559
|
+
'remote_ssl_url' => 'https://secure.example.com/cdn/' +
|
560
|
+
"jquery-#{@vendor_version}.min.js"
|
561
|
+
}
|
562
|
+
}
|
563
|
+
flexmock(AssetHat).should_receive(:config => config).by_default
|
564
|
+
end
|
565
|
+
|
566
|
+
context 'with local requests but no local copy of vendor file' do
|
567
|
+
setup do
|
568
|
+
flexmock(AssetHat).should_receive(:asset_exists?).
|
569
|
+
with("jquery-#{@vendor_version}.min.js", :js).
|
570
|
+
and_return(false).by_default
|
571
|
+
assert AssetHat.consider_all_requests_local?, 'Precondition'
|
572
|
+
end
|
573
|
+
|
574
|
+
should 'fall back to configured remote vendor URL' do
|
293
575
|
src = AssetHat.config['js']['vendors']['jquery']['remote_url']
|
294
576
|
assert_equal(
|
295
577
|
%{<script src="#{src}" type="text/javascript"></script>},
|
296
|
-
include_js(:jquery, :cache => true)
|
297
|
-
)
|
578
|
+
include_js(:jquery, :cache => true))
|
298
579
|
end
|
299
580
|
|
300
|
-
should '
|
581
|
+
should 'fall back to configured remote vendor SSL URL' do
|
301
582
|
flexmock(@controller.request, :ssl? => true)
|
302
583
|
src =
|
303
584
|
AssetHat.config['js']['vendors']['jquery']['remote_ssl_url']
|
@@ -307,59 +588,123 @@ class AssetHatHelperTest < ActionView::TestCase
|
|
307
588
|
include_js(:jquery, :cache => true)
|
308
589
|
)
|
309
590
|
end
|
591
|
+
end # context 'with local requests but no local copy of vendor file'
|
592
|
+
|
593
|
+
context 'with remote requests' do
|
594
|
+
setup do
|
595
|
+
flexmock(AssetHat).
|
596
|
+
should_receive(:consider_all_requests_local? => false)
|
597
|
+
assert !AssetHat.consider_all_requests_local?, 'Precondition'
|
598
|
+
end
|
599
|
+
|
600
|
+
should 'use specified remote URL for vendor' do
|
601
|
+
src = AssetHat.config['js']['vendors']['jquery']['remote_url']
|
602
|
+
expected_html =
|
603
|
+
%{<script src="#{src}" type="text/javascript"></script>}
|
604
|
+
expected_path = src
|
605
|
+
|
606
|
+
assert_equal expected_html, include_js(:jquery, :cache => true)
|
607
|
+
assert_equal expected_path, include_js(:jquery, :cache => true,
|
608
|
+
:only_url => true)
|
609
|
+
end
|
610
|
+
|
611
|
+
should 'use specified remote SSL URL for vendor' do
|
612
|
+
flexmock(@controller.request, :ssl? => true)
|
613
|
+
src =
|
614
|
+
AssetHat.config['js']['vendors']['jquery']['remote_ssl_url']
|
615
|
+
expected_html =
|
616
|
+
%{<script src="#{src}" type="text/javascript"></script>}
|
617
|
+
expected_path = src
|
618
|
+
|
619
|
+
assert_equal expected_html, include_js(:jquery, :cache => true)
|
620
|
+
assert_equal expected_path, include_js(:jquery, :cache => true,
|
621
|
+
:only_url => true)
|
622
|
+
end
|
310
623
|
end # context 'with remote requests'
|
311
|
-
|
624
|
+
|
625
|
+
end # context 'with a mock config containing custom CDN URLs'
|
312
626
|
|
313
627
|
should 'include multiple files by name' do
|
314
628
|
flexmock(AssetHat, :asset_exists? => true)
|
315
|
-
|
629
|
+
sources = %w[foo jquery.plugin]
|
630
|
+
expected_html = sources.map do |source|
|
316
631
|
js_tag("#{source}.min.js?#{@commit_id}")
|
317
632
|
end.join("\n")
|
318
|
-
|
319
|
-
|
633
|
+
expected_paths = sources.map do |source|
|
634
|
+
AssetHat.assets_path(:js) + "/#{source}.min.js?#{@commit_id}"
|
635
|
+
end
|
636
|
+
|
637
|
+
assert_equal expected_html,
|
638
|
+
include_js('foo', 'jquery.plugin', :cache => true)
|
639
|
+
assert_equal expected_paths,
|
640
|
+
include_js('foo', 'jquery.plugin', :cache => true,
|
641
|
+
:only_url => true)
|
320
642
|
end
|
321
643
|
|
322
644
|
should 'include multiple files as a bundle' do
|
323
|
-
bundle
|
324
|
-
|
325
|
-
|
326
|
-
|
645
|
+
bundle = 'js-bundle-1'
|
646
|
+
filename = "#{bundle}.min.js"
|
647
|
+
expected_html = js_tag("bundles/#{filename}?#{@commit_id}")
|
648
|
+
expected_path =
|
649
|
+
AssetHat.bundles_path(:js) + "/#{filename}?#{@commit_id}"
|
650
|
+
|
651
|
+
assert_equal expected_html,
|
652
|
+
include_js(:bundle => bundle, :cache => true)
|
653
|
+
assert_equal expected_path,
|
654
|
+
include_js(:bundle => bundle, :cache => true, :only_url => true)
|
327
655
|
end
|
328
656
|
|
329
657
|
should 'include multiple bundles' do
|
330
658
|
flexmock(AssetHat, :asset_exists? => true)
|
331
|
-
|
659
|
+
bundles = %w[foo bar]
|
660
|
+
expected_html = bundles.map do |bundle|
|
332
661
|
js_tag("bundles/#{bundle}.min.js?#{@commit_id}")
|
333
662
|
end.join("\n")
|
334
|
-
|
335
|
-
|
663
|
+
expected_paths = bundles.map do |bundle|
|
664
|
+
AssetHat.bundles_path(:js) + "/#{bundle}.min.js?#{@commit_id}"
|
665
|
+
end
|
666
|
+
|
667
|
+
assert_equal expected_html,
|
668
|
+
include_js(:bundles => bundles, :cache => true)
|
669
|
+
assert_equal expected_paths,
|
670
|
+
include_js(:bundles => bundles, :cache => true, :only_url => true)
|
336
671
|
end
|
337
672
|
|
338
673
|
context 'via SSL' do
|
339
674
|
setup do
|
340
|
-
@request =
|
341
|
-
flexmock(@controller
|
342
|
-
|
675
|
+
@request = test_request
|
676
|
+
flexmock(@controller).should_receive(:request => @request).
|
677
|
+
by_default
|
678
|
+
flexmock(@controller.request).should_receive(:ssl? => true).
|
679
|
+
by_default
|
343
680
|
assert @controller.request.ssl?,
|
344
681
|
'Precondition: Request should use SSL'
|
345
682
|
end
|
346
683
|
|
347
684
|
should 'use non-SSL JS if SSL/non-SSL asset hosts differ' do
|
348
685
|
flexmock(AssetHat, :ssl_asset_host_differs? => true)
|
349
|
-
|
350
686
|
bundle = 'js-bundle-1'
|
351
|
-
|
352
|
-
|
353
|
-
|
687
|
+
expected_html = js_tag("bundles/#{bundle}.min.js?#{@commit_id}")
|
688
|
+
expected_path =
|
689
|
+
AssetHat.bundles_path(:js) + "/#{bundle}.min.js?#{@commit_id}"
|
690
|
+
|
691
|
+
assert_equal expected_html,
|
692
|
+
include_js(:bundle => bundle, :cache => true)
|
693
|
+
assert_equal expected_path,
|
694
|
+
include_js(:bundle => bundle, :cache => true, :only_url => true)
|
354
695
|
end
|
355
696
|
|
356
697
|
should 'use non-SSL JS if SSL/non-SSL asset hosts are the same' do
|
357
698
|
flexmock(AssetHat, :ssl_asset_host_differs? => false)
|
358
|
-
|
359
699
|
bundle = 'js-bundle-1'
|
360
|
-
|
361
|
-
|
362
|
-
|
700
|
+
expected_html = js_tag("bundles/#{bundle}.min.js?#{@commit_id}")
|
701
|
+
expected_path =
|
702
|
+
AssetHat.bundles_path(:js) + "/#{bundle}.min.js?#{@commit_id}"
|
703
|
+
|
704
|
+
assert_equal expected_html,
|
705
|
+
include_js(:bundle => bundle, :cache => true)
|
706
|
+
assert_equal expected_path,
|
707
|
+
include_js(:bundle => bundle, :cache => true, :only_url => true)
|
363
708
|
end
|
364
709
|
end # context 'via SSL'
|
365
710
|
end # context 'with minified versions'
|
@@ -367,8 +712,13 @@ class AssetHatHelperTest < ActionView::TestCase
|
|
367
712
|
context 'without minified versions' do
|
368
713
|
should 'include one file by name, and ' +
|
369
714
|
'automatically use original version' do
|
370
|
-
|
371
|
-
|
715
|
+
source = 'jquery.some-plugin'
|
716
|
+
expected_html = js_tag("#{source}.js")
|
717
|
+
expected_path = AssetHat.assets_path(:js) + "/#{source}.js"
|
718
|
+
|
719
|
+
assert_equal expected_html, include_js(source, :cache => true)
|
720
|
+
assert_equal expected_path, include_js(source, :cache => true,
|
721
|
+
:only_url => true)
|
372
722
|
end
|
373
723
|
end # context 'without minified versions'
|
374
724
|
end # context 'with caching enabled'
|
@@ -376,25 +726,48 @@ class AssetHatHelperTest < ActionView::TestCase
|
|
376
726
|
context 'with caching disabled' do
|
377
727
|
should 'include one file by name, and ' +
|
378
728
|
'automatically use original version' do
|
379
|
-
|
380
|
-
|
729
|
+
source = 'foo'
|
730
|
+
expected_html = js_tag("#{source}.js")
|
731
|
+
expected_path = AssetHat.assets_path(:js) + "/#{source}.js"
|
732
|
+
|
733
|
+
assert_equal expected_html, include_js(source, :cache => true)
|
734
|
+
assert_equal expected_path, include_js(source, :cache => true,
|
735
|
+
:only_url => true)
|
381
736
|
end
|
382
737
|
|
383
738
|
should 'include one unminified file by name and extension' do
|
384
|
-
|
385
|
-
|
739
|
+
filename = 'foo.js'
|
740
|
+
expected_html = js_tag(filename)
|
741
|
+
expected_path = AssetHat.assets_path(:js) + "/#{filename}"
|
742
|
+
|
743
|
+
assert_equal expected_html, include_js(filename, :cache => true)
|
744
|
+
assert_equal expected_path, include_js(filename, :cache => true,
|
745
|
+
:only_url => true)
|
386
746
|
end
|
387
747
|
|
388
748
|
should 'include one minified file by name and extension' do
|
389
|
-
|
390
|
-
|
749
|
+
filename = 'foo.min.js'
|
750
|
+
expected_html = js_tag(filename)
|
751
|
+
expected_path = AssetHat.assets_path(:js) + "/#{filename}"
|
752
|
+
|
753
|
+
assert_equal expected_html, include_js(filename, :cache => true)
|
754
|
+
assert_equal expected_path, include_js(filename, :cache => true,
|
755
|
+
:only_url => true)
|
391
756
|
end
|
392
757
|
|
393
758
|
should 'include multiple files by name' do
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
759
|
+
sources = %w[foo bar.min]
|
760
|
+
expected_html = sources.map do |source|
|
761
|
+
js_tag("#{source}.js")
|
762
|
+
end.join("\n")
|
763
|
+
expected_paths = sources.map do |source|
|
764
|
+
AssetHat.assets_path(:js) + "/#{source}.js"
|
765
|
+
end
|
766
|
+
|
767
|
+
assert_equal expected_html,
|
768
|
+
include_js('foo', 'bar.min', :cache => false)
|
769
|
+
assert_equal expected_paths,
|
770
|
+
include_js('foo', 'bar.min', :cache => false, :only_url => true)
|
398
771
|
end
|
399
772
|
|
400
773
|
context 'with real bundle files' do
|
@@ -407,16 +780,23 @@ class AssetHatHelperTest < ActionView::TestCase
|
|
407
780
|
should 'include a bundle as separate files' do
|
408
781
|
bundle = 'js-bundle-1'
|
409
782
|
sources = @config['js']['bundles'][bundle]
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
783
|
+
expected_html = sources.map do |source|
|
784
|
+
js_tag("#{source}.js?#{@asset_id}")
|
785
|
+
end.join("\n")
|
786
|
+
expected_paths = sources.map do |source|
|
787
|
+
AssetHat.assets_path(:js) + "/#{source}.js?#{@asset_id}"
|
788
|
+
end
|
789
|
+
|
790
|
+
assert_equal expected_html,
|
791
|
+
include_js(:bundle => bundle, :cache => false)
|
792
|
+
assert_equal expected_paths,
|
793
|
+
include_js(:bundle => bundle, :cache => false, :only_url => true)
|
414
794
|
end
|
415
795
|
|
416
796
|
should 'include a bundle as separate files ' +
|
417
797
|
'with a symbol bundle name' do
|
418
|
-
bundle
|
419
|
-
sources
|
798
|
+
bundle = 'js-bundle-1'
|
799
|
+
sources = @config['js']['bundles'][bundle]
|
420
800
|
expected = sources.
|
421
801
|
map { |src| js_tag("#{src}.js?#{@asset_id}") }.join("\n")
|
422
802
|
output = include_js(:bundle => bundle.to_sym, :cache => false)
|
@@ -424,19 +804,194 @@ class AssetHatHelperTest < ActionView::TestCase
|
|
424
804
|
end
|
425
805
|
|
426
806
|
should 'include multiple bundles as separate files' do
|
427
|
-
bundles = [1,2
|
428
|
-
|
807
|
+
bundles = [1,2].map { |i| "js-bundle-#{i}" }
|
808
|
+
expected_html = bundles.map { |bundle|
|
429
809
|
sources = @config['js']['bundles'][bundle]
|
430
810
|
sources.map { |src| js_tag("#{src}.js?#{@asset_id}") }
|
431
|
-
|
432
|
-
|
433
|
-
|
811
|
+
}.flatten.uniq.join("\n")
|
812
|
+
expected_paths = bundles.map do |bundle|
|
813
|
+
sources = @config['js']['bundles'][bundle]
|
814
|
+
sources.map do |src|
|
815
|
+
AssetHat.assets_path(:js) + "/#{src}.js?#{@asset_id}"
|
816
|
+
end
|
817
|
+
end.flatten.uniq
|
818
|
+
|
819
|
+
assert_equal expected_html,
|
820
|
+
include_js(:bundles => bundles, :cache => false)
|
821
|
+
assert_equal expected_paths,
|
822
|
+
include_js(:bundles => bundles, :cache => false,
|
823
|
+
:only_url => true)
|
824
|
+
end
|
825
|
+
|
826
|
+
should 'include vendors, named files and bundles together' do
|
827
|
+
bundles = ['js-bundle-2']
|
828
|
+
expected_html =
|
829
|
+
js_tag("jquery.min.js?#{@asset_id}") + "\n" +
|
830
|
+
js_tag("js-file-1-1.js?#{@asset_id}") + "\n" +
|
831
|
+
bundles.map do |bundle|
|
832
|
+
sources = @config['js']['bundles'][bundle]
|
833
|
+
sources.map { |src| js_tag("#{src}.js?#{@asset_id}") }
|
834
|
+
end.flatten.uniq.join("\n")
|
835
|
+
expected_paths =
|
836
|
+
[ "/javascripts/jquery.min.js?#{@asset_id}",
|
837
|
+
"/javascripts/js-file-1-1.js?#{@asset_id}" ] +
|
838
|
+
bundles.map do |bundle|
|
839
|
+
sources = @config['js']['bundles'][bundle]
|
840
|
+
sources.map do |src|
|
841
|
+
AssetHat.assets_path(:js) + "/#{src}.js?#{@asset_id}"
|
842
|
+
end
|
843
|
+
end.flatten.uniq
|
844
|
+
|
845
|
+
assert_equal expected_html,
|
846
|
+
include_js(:jquery, 'js-file-1-1', :bundles => bundles,
|
847
|
+
:cache => false)
|
848
|
+
assert_equal expected_paths,
|
849
|
+
include_js(:jquery, 'js-file-1-1', :bundles => bundles,
|
850
|
+
:cache => false, :only_url => true)
|
434
851
|
end
|
435
852
|
end # context 'with real bundle files'
|
436
853
|
end # context 'with caching disabled'
|
437
854
|
|
855
|
+
context 'with LABjs' do
|
856
|
+
should 'render with default config and basic URL arguments' do
|
857
|
+
urls = [ '/javascripts/foo.js',
|
858
|
+
'http://cdn.example.com/bar.js' ]
|
859
|
+
expected = %{<script src="/javascripts/LAB.min.js" } +
|
860
|
+
%{type="text/javascript"></script>\n}
|
861
|
+
expected << %{<script type="text/javascript">\n}
|
862
|
+
expected << %{window.$LABinst=$LAB.\n}
|
863
|
+
expected << %{ script('#{urls.first}').wait().\n}
|
864
|
+
expected << %{ script('#{urls.second}').wait();\n}
|
865
|
+
expected << %{</script>}
|
866
|
+
|
867
|
+
assert_equal expected,
|
868
|
+
include_js('foo', urls.second, :loader => :lab_js)
|
869
|
+
end
|
870
|
+
|
871
|
+
context 'with LABjs version config, vendor, and multiple bundles' do
|
872
|
+
setup do
|
873
|
+
@config = AssetHat.config
|
874
|
+
@config['js']['vendors'] = {
|
875
|
+
'jquery' => {'version' => '1.6.0'},
|
876
|
+
'lab_js' => {'version' => '1.2.0'}
|
877
|
+
}
|
878
|
+
flexmock(AssetHat).should_receive(:config => @config).by_default
|
879
|
+
|
880
|
+
@asset_id = ENV['RAILS_ASSET_ID'] = ''
|
881
|
+
flexmock(AssetHat).should_receive(
|
882
|
+
:asset_exists? => false,
|
883
|
+
:last_commit_id => ''
|
884
|
+
).by_default
|
885
|
+
|
886
|
+
@jquery_version = @config['js']['vendors']['jquery']['version']
|
887
|
+
@lab_js_version = @config['js']['vendors']['lab_js']['version']
|
888
|
+
end
|
889
|
+
teardown { ENV['RAILS_ASSET_ID'] = nil }
|
890
|
+
|
891
|
+
context 'with local requests' do
|
892
|
+
should 'render with caching disabled' do
|
893
|
+
loader_filename = "LAB-#{@lab_js_version}.min.js"
|
894
|
+
vendor_filename = "jquery-#{@jquery_version}.min.js"
|
895
|
+
|
896
|
+
flexmock(AssetHat).should_receive(:asset_exists?).
|
897
|
+
with(loader_filename, :js).and_return(true)
|
898
|
+
flexmock(AssetHat).should_receive(:asset_exists?).
|
899
|
+
with(vendor_filename, :js).and_return(true)
|
900
|
+
assert AssetHat.asset_exists?(vendor_filename, :js),
|
901
|
+
'Precondition'
|
902
|
+
|
903
|
+
expected = %{<script src="/javascripts/#{loader_filename}" } +
|
904
|
+
%{type="text/javascript"></script>\n}
|
905
|
+
expected << %{<script type="text/javascript">\n}
|
906
|
+
expected << "window.$LABinst=$LAB.\n"
|
907
|
+
expected << " script('/javascripts/#{vendor_filename}').wait().\n"
|
908
|
+
expected << " script('/javascripts/foo.js').wait().\n"
|
909
|
+
expected << " script('/javascripts/js-file-1-1.js').wait().\n"
|
910
|
+
expected << " script('/javascripts/js-file-1-2.js').wait().\n"
|
911
|
+
expected << " script('/javascripts/js-file-1-3.js').wait().\n"
|
912
|
+
expected << " script('/javascripts/js-file-2-1.js').wait().\n"
|
913
|
+
expected << " script('/javascripts/js-file-2-2.js').wait().\n"
|
914
|
+
expected << " script('/javascripts/js-file-2-3.js').wait();\n"
|
915
|
+
expected << '</script>'
|
916
|
+
|
917
|
+
assert_equal expected, include_js(:jquery, 'foo',
|
918
|
+
:bundles => %w[js-bundle-1 js-bundle-2],
|
919
|
+
:loader => :lab_js)
|
920
|
+
end
|
921
|
+
|
922
|
+
should 'render with caching disabled and remote vendor ' +
|
923
|
+
'if local loader vendor is missing' do
|
924
|
+
loader_filename = "LAB-#{@lab_js_version}.min.js"
|
925
|
+
vendor_filename = "jquery-#{@jquery_version}.min.js"
|
926
|
+
loader_url = 'http://ajax.cdnjs.com/ajax/libs/labjs/' +
|
927
|
+
@lab_js_version + '/LAB.min.js'
|
928
|
+
|
929
|
+
flexmock(AssetHat).should_receive(:asset_exists?).
|
930
|
+
with(loader_filename, :js).and_return(false)
|
931
|
+
flexmock(AssetHat).should_receive(:asset_exists?).
|
932
|
+
with(vendor_filename, :js).and_return(true)
|
933
|
+
assert AssetHat.asset_exists?(vendor_filename, :js),
|
934
|
+
'Precondition'
|
935
|
+
|
936
|
+
expected = %{<script src="#{loader_url}" } +
|
937
|
+
%{type="text/javascript"></script>\n}
|
938
|
+
expected << %{<script type="text/javascript">\n}
|
939
|
+
expected << "window.$LABinst=$LAB.\n"
|
940
|
+
expected << " script('/javascripts/#{vendor_filename}').wait().\n"
|
941
|
+
expected << " script('/javascripts/foo.js').wait();\n"
|
942
|
+
expected << '</script>'
|
943
|
+
|
944
|
+
assert_equal expected,
|
945
|
+
include_js(:jquery, 'foo', :loader => :lab_js)
|
946
|
+
end
|
947
|
+
end # context 'with local requests'
|
948
|
+
|
949
|
+
context 'with remote requests' do
|
950
|
+
setup do
|
951
|
+
flexmock(AssetHat, :consider_all_requests_local? => false)
|
952
|
+
end
|
953
|
+
|
954
|
+
should 'render with caching enabled and remote vendors' do
|
955
|
+
lab_js_url = 'http://ajax.cdnjs.com/ajax/libs/labjs/' +
|
956
|
+
@lab_js_version + '/LAB.min.js'
|
957
|
+
jquery_url = 'http://ajax.googleapis.com/ajax/libs/jquery/' +
|
958
|
+
@jquery_version + '/jquery.min.js'
|
959
|
+
|
960
|
+
expected = %{<script src="#{lab_js_url}" } +
|
961
|
+
%{type="text/javascript"></script>\n}
|
962
|
+
expected << %{<script type="text/javascript">\n}
|
963
|
+
expected << "window.$LABinst=$LAB.\n"
|
964
|
+
expected << " script('#{jquery_url}').wait().\n"
|
965
|
+
expected << " script('/javascripts/foo.js').wait().\n"
|
966
|
+
expected << " script('/javascripts/" +
|
967
|
+
"bundles/js-bundle-1.min.js').wait().\n"
|
968
|
+
expected << " script('/javascripts/" +
|
969
|
+
"bundles/js-bundle-2.min.js').wait();\n"
|
970
|
+
expected << '</script>'
|
971
|
+
|
972
|
+
assert_equal expected, include_js(:jquery, 'foo',
|
973
|
+
:bundles => %w[js-bundle-1 js-bundle-2],
|
974
|
+
:loader => :lab_js,
|
975
|
+
:cache => true)
|
976
|
+
end
|
977
|
+
end # context 'with remote requests'
|
978
|
+
end # context 'with LABjs version config, vendor, and multiple bundles'
|
979
|
+
end # context 'with LABjs'
|
980
|
+
|
438
981
|
end # context 'include_js'
|
439
982
|
|
983
|
+
should 'compute public asset paths' do
|
984
|
+
flexmock_rails_app
|
985
|
+
|
986
|
+
assert_equal '/stylesheets/foo.css', asset_path(:css, 'foo')
|
987
|
+
assert_equal '/stylesheets/bundles/foo.min.css',
|
988
|
+
asset_path(:css, 'bundles/foo.min.css')
|
989
|
+
|
990
|
+
assert_equal '/javascripts/foo.js', asset_path(:js, 'foo')
|
991
|
+
assert_equal '/javascripts/bundles/foo.min.js',
|
992
|
+
asset_path(:js, 'bundles/foo.min.js')
|
993
|
+
end
|
994
|
+
|
440
995
|
|
441
996
|
|
442
997
|
private
|
@@ -452,4 +1007,32 @@ class AssetHatHelperTest < ActionView::TestCase
|
|
452
1007
|
%{<script src="/javascripts/#{filename}" type="text/javascript"></script>}
|
453
1008
|
end
|
454
1009
|
|
1010
|
+
def flexmock_rails_app
|
1011
|
+
# Creates just enough hooks for a dummy Rails app.
|
1012
|
+
flexmock(Rails,
|
1013
|
+
:application => flexmock('dummy_app', :env_defaults => {}),
|
1014
|
+
:logger => flexmock('dummy_logger', :warn => nil)
|
1015
|
+
)
|
1016
|
+
|
1017
|
+
if defined?(config) # Rails 3.x
|
1018
|
+
config.assets_dir = AssetHat::ASSETS_DIR
|
1019
|
+
end
|
1020
|
+
|
1021
|
+
flexmock(AssetHat).should_receive(:consider_all_requests_local? => true).
|
1022
|
+
by_default
|
1023
|
+
end
|
1024
|
+
|
1025
|
+
# def flexmock_rails_app_config(opts)
|
1026
|
+
# flexmock(Rails.application.config, opts) # Rails 3.x
|
1027
|
+
# flexmock(ActionController::Base, opts) # Rails 2.x
|
1028
|
+
# end
|
1029
|
+
|
1030
|
+
def test_request
|
1031
|
+
if defined?(ActionDispatch) # Rails 3.x
|
1032
|
+
ActionDispatch::TestRequest.new
|
1033
|
+
else # Rails 2.x
|
1034
|
+
ActionController::TestRequest.new
|
1035
|
+
end
|
1036
|
+
end
|
1037
|
+
|
455
1038
|
end
|