bpm 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (213) hide show
  1. data/.gitmodules +3 -0
  2. data/Gemfile +0 -13
  3. data/TODO.md +1 -0
  4. data/bpm.gemspec +8 -3
  5. data/lib/bpm/cli/base.rb +22 -20
  6. data/lib/bpm/generator.rb +3 -3
  7. data/lib/bpm/libgems_ext/dependency_installer.rb +4 -4
  8. data/lib/bpm/libgems_ext/installer.rb +1 -1
  9. data/lib/bpm/package.rb +13 -9
  10. data/lib/bpm/pipeline/generated_asset.rb +30 -3
  11. data/lib/bpm/pipeline/transport_processor.rb +20 -12
  12. data/lib/bpm/pipeline.rb +17 -9
  13. data/lib/bpm/project.rb +42 -10
  14. data/lib/bpm/server.rb +5 -0
  15. data/lib/bpm/version.rb +1 -1
  16. data/lib/bpm.rb +2 -0
  17. data/lib/vendored_sprockets.rb +7 -0
  18. data/spec/cli/add_spec.rb +40 -37
  19. data/spec/cli/build_spec.rb +5 -5
  20. data/spec/cli/new_spec.rb +49 -23
  21. data/spec/cli/push_spec.rb +5 -5
  22. data/spec/cli/unpack_spec.rb +14 -14
  23. data/spec/fixtures/{badrake-0.8.7.spd → badrake-0.8.7.bpkg} +0 -0
  24. data/spec/fixtures/{builder-3.0.0.spd → builder-3.0.0.bpkg} +0 -0
  25. data/spec/fixtures/{bundler-1.1.pre.spd → bundler-1.1.pre.bpkg} +0 -0
  26. data/spec/fixtures/{coffee-1.0.1.pre.spd → coffee-1.0.1.pre.bpkg} +0 -0
  27. data/spec/fixtures/{core-test-0.4.9.spd → core-test-0.4.9.bpkg} +0 -0
  28. data/spec/fixtures/{custom_generator-1.0.spd → custom_generator-1.0.bpkg} +0 -0
  29. data/spec/fixtures/custom_name/MyProject.json +4 -0
  30. data/spec/fixtures/hello_world/css/dummy.css +3 -0
  31. data/spec/fixtures/{highline-1.6.1.spd → highline-1.6.1.bpkg} +0 -0
  32. data/spec/fixtures/{ivory-0.0.1.spd → ivory-0.0.1.bpkg} +0 -0
  33. data/spec/fixtures/{jquery-1.4.3.spd → jquery-1.4.3.bpkg} +0 -0
  34. data/spec/fixtures/minitest/assets/bpm_packages.js +1 -0
  35. data/spec/fixtures/minitest/assets/bpm_styles.css +0 -0
  36. data/spec/fixtures/minitest/assets/minitest/app_package.js +1 -0
  37. data/spec/fixtures/minitest/lib/main.js +1 -0
  38. data/spec/fixtures/minitest/minitest.json +22 -0
  39. data/spec/fixtures/minitest/packages/uglyduck/lib/main.js +1 -0
  40. data/spec/fixtures/minitest/packages/uglyduck/minifier/main.js +4 -0
  41. data/spec/fixtures/minitest/packages/uglyduck/package.json +21 -0
  42. data/spec/fixtures/{optparse-1.0.1.spd → optparse-1.0.1.bpkg} +0 -0
  43. data/spec/fixtures/{rake-0.8.6.spd → rake-0.8.6.bpkg} +0 -0
  44. data/spec/fixtures/{rake-0.8.7.spd → rake-0.8.7.bpkg} +0 -0
  45. data/spec/fixtures/{spade-0.5.0.spd → spade-0.5.0.bpkg} +0 -0
  46. data/spec/fixtures/transporter/packages/transport/lib/main.js +1 -0
  47. data/spec/fixtures/transporter/packages/transport/package.json +1 -1
  48. data/spec/fixtures/transporter/packages/transport/transports/wrapper.js +5 -0
  49. data/spec/gauntlet_spec.rb +2 -2
  50. data/spec/package_spec.rb +3 -3
  51. data/spec/pipeline_spec.rb +175 -54
  52. data/spec/project_spec.rb +19 -3
  53. data/spec/support/fake_gem_server.rb +4 -4
  54. data/templates/init/project.json +3 -1
  55. data/templates/project/index.html +1 -1
  56. data/vendor/sprockets/.gitignore +7 -0
  57. data/vendor/sprockets/.travis.yml +6 -0
  58. data/vendor/sprockets/Gemfile +8 -0
  59. data/vendor/sprockets/LICENSE +20 -0
  60. data/vendor/sprockets/README.md +22 -0
  61. data/vendor/sprockets/Rakefile +8 -0
  62. data/vendor/sprockets/lib/sprockets/asset.rb +203 -0
  63. data/vendor/sprockets/lib/sprockets/asset_attributes.rb +161 -0
  64. data/vendor/sprockets/lib/sprockets/base.rb +147 -0
  65. data/vendor/sprockets/lib/sprockets/bundled_asset.rb +222 -0
  66. data/vendor/sprockets/lib/sprockets/cache/file_store.rb +41 -0
  67. data/vendor/sprockets/lib/sprockets/caching.rb +121 -0
  68. data/vendor/sprockets/lib/sprockets/charset_normalizer.rb +41 -0
  69. data/vendor/sprockets/lib/sprockets/context.rb +191 -0
  70. data/vendor/sprockets/lib/sprockets/digest.rb +73 -0
  71. data/vendor/sprockets/lib/sprockets/directive_processor.rb +380 -0
  72. data/vendor/sprockets/lib/sprockets/eco_template.rb +39 -0
  73. data/vendor/sprockets/lib/sprockets/ejs_template.rb +38 -0
  74. data/vendor/sprockets/lib/sprockets/engines.rb +92 -0
  75. data/vendor/sprockets/lib/sprockets/environment.rb +93 -0
  76. data/vendor/sprockets/lib/sprockets/errors.rb +17 -0
  77. data/vendor/sprockets/lib/sprockets/index.rb +80 -0
  78. data/vendor/sprockets/lib/sprockets/jst_processor.rb +26 -0
  79. data/vendor/sprockets/lib/sprockets/processing.rb +310 -0
  80. data/vendor/sprockets/lib/sprockets/processor.rb +32 -0
  81. data/vendor/sprockets/lib/sprockets/safety_colons.rb +28 -0
  82. data/vendor/sprockets/lib/sprockets/server.rb +270 -0
  83. data/vendor/sprockets/lib/sprockets/static_asset.rb +87 -0
  84. data/vendor/sprockets/lib/sprockets/static_compilation.rb +82 -0
  85. data/vendor/sprockets/lib/sprockets/trail.rb +122 -0
  86. data/vendor/sprockets/lib/sprockets/utils.rb +67 -0
  87. data/vendor/sprockets/lib/sprockets/version.rb +3 -0
  88. data/vendor/sprockets/lib/sprockets.rb +31 -0
  89. data/vendor/sprockets/sprockets.gemspec +30 -0
  90. data/vendor/sprockets/test/fixtures/asset/POW.png +0 -0
  91. data/vendor/sprockets/test/fixtures/asset/application.js +6 -0
  92. data/vendor/sprockets/test/fixtures/asset/bar-utf8.css +2 -0
  93. data/vendor/sprockets/test/fixtures/asset/charset.css +2 -0
  94. data/vendor/sprockets/test/fixtures/asset/circle/a.js +2 -0
  95. data/vendor/sprockets/test/fixtures/asset/circle/b.js +2 -0
  96. data/vendor/sprockets/test/fixtures/asset/circle/c.js +2 -0
  97. data/vendor/sprockets/test/fixtures/asset/compat.js +4 -0
  98. data/vendor/sprockets/test/fixtures/asset/constants.js +2 -0
  99. data/vendor/sprockets/test/fixtures/asset/constants.yml +1 -0
  100. data/vendor/sprockets/test/fixtures/asset/default_mime_type.js +1 -0
  101. data/vendor/sprockets/test/fixtures/asset/filename.js.erb +1 -0
  102. data/vendor/sprockets/test/fixtures/asset/foo-utf8.css +2 -0
  103. data/vendor/sprockets/test/fixtures/asset/included_header.js +4 -0
  104. data/vendor/sprockets/test/fixtures/asset/jquery.tmpl.min.js +1 -0
  105. data/vendor/sprockets/test/fixtures/asset/mismatch.js +1 -0
  106. data/vendor/sprockets/test/fixtures/asset/multiple.js +2 -0
  107. data/vendor/sprockets/test/fixtures/asset/multipleengine.js +1 -0
  108. data/vendor/sprockets/test/fixtures/asset/noengine.js +1 -0
  109. data/vendor/sprockets/test/fixtures/asset/noformat.coffee +1 -0
  110. data/vendor/sprockets/test/fixtures/asset/one.css +1 -0
  111. data/vendor/sprockets/test/fixtures/asset/oneengine.js +1 -0
  112. data/vendor/sprockets/test/fixtures/asset/project.css +1 -0
  113. data/vendor/sprockets/test/fixtures/asset/project.js.erb +4 -0
  114. data/vendor/sprockets/test/fixtures/asset/relative/include.js +4 -0
  115. data/vendor/sprockets/test/fixtures/asset/relative/require.js +1 -0
  116. data/vendor/sprockets/test/fixtures/asset/relative/require_outside_path.js +1 -0
  117. data/vendor/sprockets/test/fixtures/asset/require_self.css +9 -0
  118. data/vendor/sprockets/test/fixtures/asset/require_self_twice.css +8 -0
  119. data/vendor/sprockets/test/fixtures/asset/semicolons/bar.js +1 -0
  120. data/vendor/sprockets/test/fixtures/asset/semicolons/index.js +5 -0
  121. data/vendor/sprockets/test/fixtures/asset/sprite.css.erb +12 -0
  122. data/vendor/sprockets/test/fixtures/asset/tree/all/b/c/d.js +2 -0
  123. data/vendor/sprockets/test/fixtures/asset/tree/all/b/c/e.js +1 -0
  124. data/vendor/sprockets/test/fixtures/asset/tree/all/b/c.js +1 -0
  125. data/vendor/sprockets/test/fixtures/asset/tree/all/b.css +2 -0
  126. data/vendor/sprockets/test/fixtures/asset/tree/all/b.js.erb +1 -0
  127. data/vendor/sprockets/test/fixtures/asset/tree/all/d/c.js.coffee +1 -0
  128. data/vendor/sprockets/test/fixtures/asset/tree/all/d/e.js +1 -0
  129. data/vendor/sprockets/test/fixtures/asset/tree/all_with_require.js +7 -0
  130. data/vendor/sprockets/test/fixtures/asset/tree/all_with_require_directory.js +1 -0
  131. data/vendor/sprockets/test/fixtures/asset/tree/all_with_require_tree.js +2 -0
  132. data/vendor/sprockets/test/fixtures/asset/tree/directory/application.js +2 -0
  133. data/vendor/sprockets/test/fixtures/asset/tree/directory/bar.js +1 -0
  134. data/vendor/sprockets/test/fixtures/asset/tree/directory/foo.js +1 -0
  135. data/vendor/sprockets/test/fixtures/asset/tree/tree/application.js +2 -0
  136. data/vendor/sprockets/test/fixtures/asset/tree/tree/bar.js +1 -0
  137. data/vendor/sprockets/test/fixtures/asset/tree/tree/foo.js +1 -0
  138. data/vendor/sprockets/test/fixtures/asset/tree/with_logical_path/a/a.js +1 -0
  139. data/vendor/sprockets/test/fixtures/asset/tree/with_logical_path/require_tree_with_logical_path.js +1 -0
  140. data/vendor/sprockets/test/fixtures/asset/tree/without_argument/a.js +1 -0
  141. data/vendor/sprockets/test/fixtures/asset/tree/without_argument/b.js +1 -0
  142. data/vendor/sprockets/test/fixtures/asset/tree/without_argument/require_tree_without_argument.js +1 -0
  143. data/vendor/sprockets/test/fixtures/asset/two.css +1 -0
  144. data/vendor/sprockets/test/fixtures/asset/unicode.js +2 -0
  145. data/vendor/sprockets/test/fixtures/asset/unknownexts.min.js +2 -0
  146. data/vendor/sprockets/test/fixtures/asset/users.js.erb.str +4 -0
  147. data/vendor/sprockets/test/fixtures/context/POW.png +0 -0
  148. data/vendor/sprockets/test/fixtures/context/application.js.yml +3 -0
  149. data/vendor/sprockets/test/fixtures/context/bar.js +1 -0
  150. data/vendor/sprockets/test/fixtures/context/foo.js +2 -0
  151. data/vendor/sprockets/test/fixtures/context/helpers.css.erb +3 -0
  152. data/vendor/sprockets/test/fixtures/context/properties.js.erb +7 -0
  153. data/vendor/sprockets/test/fixtures/context/require_glob.js +1 -0
  154. data/vendor/sprockets/test/fixtures/context/resolve_content_type.js.erb +4 -0
  155. data/vendor/sprockets/test/fixtures/context/sprite.css.embed +3 -0
  156. data/vendor/sprockets/test/fixtures/default/application.js.coffee +4 -0
  157. data/vendor/sprockets/test/fixtures/default/coffee/foo.coffee +1 -0
  158. data/vendor/sprockets/test/fixtures/default/coffee/index.js +3 -0
  159. data/vendor/sprockets/test/fixtures/default/empty +0 -0
  160. data/vendor/sprockets/test/fixtures/default/gallery.css.erb +3 -0
  161. data/vendor/sprockets/test/fixtures/default/gallery.js +1 -0
  162. data/vendor/sprockets/test/fixtures/default/goodbye.jst.eco +1 -0
  163. data/vendor/sprockets/test/fixtures/default/hello.jst.ejs +1 -0
  164. data/vendor/sprockets/test/fixtures/default/hello.txt +1 -0
  165. data/vendor/sprockets/test/fixtures/default/interpolation.js +1 -0
  166. data/vendor/sprockets/test/fixtures/default/missing_require.js +1 -0
  167. data/vendor/sprockets/test/fixtures/default/mobile/a.js +1 -0
  168. data/vendor/sprockets/test/fixtures/default/mobile/b.js +1 -0
  169. data/vendor/sprockets/test/fixtures/default/mobile/c.css +1 -0
  170. data/vendor/sprockets/test/fixtures/default/mobile/d.css +1 -0
  171. data/vendor/sprockets/test/fixtures/default/mobile/index.css +3 -0
  172. data/vendor/sprockets/test/fixtures/default/mobile/index.js +1 -0
  173. data/vendor/sprockets/test/fixtures/default/noreturn.js +1 -0
  174. data/vendor/sprockets/test/fixtures/default/project.js.coffee.erb +2 -0
  175. data/vendor/sprockets/test/fixtures/directives/code_before_comment +3 -0
  176. data/vendor/sprockets/test/fixtures/directives/comment_without_directives +6 -0
  177. data/vendor/sprockets/test/fixtures/directives/directive_word_splitting +6 -0
  178. data/vendor/sprockets/test/fixtures/directives/directives_after_header +16 -0
  179. data/vendor/sprockets/test/fixtures/directives/double_slash +9 -0
  180. data/vendor/sprockets/test/fixtures/directives/hash +8 -0
  181. data/vendor/sprockets/test/fixtures/directives/no_header +2 -0
  182. data/vendor/sprockets/test/fixtures/directives/slash_star +10 -0
  183. data/vendor/sprockets/test/fixtures/directives/slash_star_single +4 -0
  184. data/vendor/sprockets/test/fixtures/directives/space_between_directive_word +2 -0
  185. data/vendor/sprockets/test/fixtures/directives/triple_hash +10 -0
  186. data/vendor/sprockets/test/fixtures/encoding/ascii.js +1 -0
  187. data/vendor/sprockets/test/fixtures/encoding/ascii_utf8.js +2 -0
  188. data/vendor/sprockets/test/fixtures/encoding/utf16.js +0 -0
  189. data/vendor/sprockets/test/fixtures/encoding/utf8.js +1 -0
  190. data/vendor/sprockets/test/fixtures/encoding/utf8_bom.js +1 -0
  191. data/vendor/sprockets/test/fixtures/engines/hello.alert +1 -0
  192. data/vendor/sprockets/test/fixtures/engines/moo.js.str +1 -0
  193. data/vendor/sprockets/test/fixtures/public/compiled-digest-0aa2105d29558f3eb790d411d7d8fb66.js +3 -0
  194. data/vendor/sprockets/test/fixtures/public/compiled-digest-1c41eb0cf934a0c76babe875f982f9d1.js +1 -0
  195. data/vendor/sprockets/test/fixtures/server/app/javascripts/application.js +5 -0
  196. data/vendor/sprockets/test/fixtures/server/app/javascripts/bar.js +1 -0
  197. data/vendor/sprockets/test/fixtures/server/app/javascripts/foo.js +1 -0
  198. data/vendor/sprockets/test/fixtures/server/app/javascripts/hello.txt +2 -0
  199. data/vendor/sprockets/test/fixtures/server/app/javascripts/tree.js +1 -0
  200. data/vendor/sprockets/test/fixtures/server/vendor/javascripts/missing_require.js +1 -0
  201. data/vendor/sprockets/test/fixtures/server/vendor/stylesheets/missing_require.css +1 -0
  202. data/vendor/sprockets/test/sprockets_test.rb +56 -0
  203. data/vendor/sprockets/test/test_asset.rb +593 -0
  204. data/vendor/sprockets/test/test_asset_attributes.rb +86 -0
  205. data/vendor/sprockets/test/test_caching.rb +62 -0
  206. data/vendor/sprockets/test/test_context.rb +115 -0
  207. data/vendor/sprockets/test/test_directive_processor.rb +124 -0
  208. data/vendor/sprockets/test/test_encoding.rb +65 -0
  209. data/vendor/sprockets/test/test_engines.rb +73 -0
  210. data/vendor/sprockets/test/test_environment.rb +610 -0
  211. data/vendor/sprockets/test/test_server.rb +227 -0
  212. metadata +258 -54
  213. data/spec/fixtures/transporter/packages/transport/lib/wrapper.js +0 -5
@@ -0,0 +1,227 @@
1
+ require "sprockets_test"
2
+
3
+ require 'rack/builder'
4
+ require 'rack/test'
5
+
6
+ class TestServer < Sprockets::TestCase
7
+ include Rack::Test::Methods
8
+
9
+ def setup
10
+ @env = Sprockets::Environment.new
11
+ @env.append_path(fixture_path("server/app/javascripts"))
12
+ @env.append_path(fixture_path("server/vendor/javascripts"))
13
+ @env.append_path(fixture_path("server/vendor/stylesheets"))
14
+ end
15
+
16
+ def default_app
17
+ env = @env
18
+
19
+ Rack::Builder.new do
20
+ map "/assets" do
21
+ run env
22
+ end
23
+
24
+ map "/cached/javascripts" do
25
+ run env.index
26
+ end
27
+ end
28
+ end
29
+
30
+ def app
31
+ @app ||= default_app
32
+ end
33
+
34
+ test "serve single source file" do
35
+ get "/assets/foo.js"
36
+ assert_equal "var foo;\n", last_response.body
37
+ end
38
+
39
+ test "serve single source file body" do
40
+ get "/assets/foo.js?body=1"
41
+ assert_equal 200, last_response.status
42
+ assert_equal "var foo;\n", last_response.body
43
+ assert_equal "9", last_response.headers['Content-Length']
44
+ end
45
+
46
+ test "serve single source file from indexed environment" do
47
+ get "/cached/javascripts/foo.js"
48
+ assert_equal "var foo;\n", last_response.body
49
+ end
50
+
51
+ test "serve source with dependencies" do
52
+ get "/assets/application.js"
53
+ assert_equal "var foo;\n\n(function() {\n application.boot();\n})();\n",
54
+ last_response.body
55
+ end
56
+
57
+ test "serve source file body that has dependencies" do
58
+ get "/assets/application.js?body=true"
59
+ assert_equal 200, last_response.status
60
+ assert_equal "\n(function() {\n application.boot();\n})();\n",
61
+ last_response.body
62
+ assert_equal "43", last_response.headers['Content-Length']
63
+ end
64
+
65
+ test "serve source with content type headers" do
66
+ get "/assets/application.js"
67
+ assert_equal "application/javascript", last_response.headers['Content-Type']
68
+ end
69
+
70
+ test "serve source with etag headers" do
71
+ digest = @env['application.js'].digest
72
+
73
+ get "/assets/application.js"
74
+ assert_equal "\"#{digest}\"",
75
+ last_response.headers['ETag']
76
+ end
77
+
78
+ test "updated file updates the last modified header" do
79
+ time = Time.now
80
+ path = fixture_path "server/app/javascripts/foo.js"
81
+
82
+ sandbox path do
83
+ File.utime(time, time, path)
84
+
85
+ get "/assets/application.js"
86
+ time_before_modifying = last_response.headers['Last-Modified']
87
+
88
+ get "/assets/application.js"
89
+ time_after_modifying = last_response.headers['Last-Modified']
90
+
91
+ assert_equal time_before_modifying, time_after_modifying
92
+
93
+ mtime = Time.now + 60
94
+ File.open(path, 'w') { |f| f.write "(change)" }
95
+ File.utime(mtime, mtime, path)
96
+
97
+ get "/assets/application.js"
98
+ time_after_modifying = last_response.headers['Last-Modified']
99
+
100
+ assert_not_equal time_before_modifying, time_after_modifying
101
+ end
102
+ end
103
+
104
+ test "file updates do not update last modified header for indexed environments" do
105
+ time = Time.now
106
+ path = fixture_path "server/app/javascripts/foo.js"
107
+ File.utime(time, time, path)
108
+
109
+ get "/cached/javascripts/application.js"
110
+ time_before_touching = last_response.headers['Last-Modified']
111
+
112
+ get "/cached/javascripts/application.js"
113
+ time_after_touching = last_response.headers['Last-Modified']
114
+
115
+ assert_equal time_before_touching, time_after_touching
116
+
117
+ mtime = Time.now + 60
118
+ File.utime(mtime, mtime, path)
119
+
120
+ get "/cached/javascripts/application.js"
121
+ time_after_touching = last_response.headers['Last-Modified']
122
+
123
+ assert_equal time_before_touching, time_after_touching
124
+ end
125
+
126
+ test "not modified response when headers match" do
127
+ get "/assets/application.js"
128
+ assert_equal 200, last_response.status
129
+
130
+ path = fixture_path "server/app/javascripts/bar.js"
131
+ mtime = Time.now + 1
132
+ File.utime(mtime, mtime, path)
133
+
134
+ get "/assets/bar.js", {},
135
+ 'HTTP_IF_MODIFIED_SINCE' =>
136
+ File.mtime(fixture_path("server/app/javascripts/bar.js")).httpdate
137
+
138
+ assert_equal 304, last_response.status
139
+ assert_equal nil, last_response.headers['Content-Type']
140
+ assert_equal nil, last_response.headers['Content-Length']
141
+ end
142
+
143
+ test "not modified partial response when etags match" do
144
+ get "/assets/application.js?body=1"
145
+ assert_equal 200, last_response.status
146
+ etag = last_response.headers['ETag']
147
+
148
+ get "/assets/application.js?body=1", {},
149
+ 'HTTP_IF_NONE_MATCH' => etag
150
+
151
+ assert_equal 304, last_response.status
152
+ assert_equal nil, last_response.headers['Content-Type']
153
+ assert_equal nil, last_response.headers['Content-Length']
154
+ end
155
+
156
+ test "if sources didnt change the server shouldnt rebundle" do
157
+ get "/assets/application.js"
158
+ asset_before = @env["application.js"]
159
+ assert asset_before
160
+
161
+ get "/assets/application.js"
162
+ asset_after = @env["application.js"]
163
+ assert asset_after
164
+
165
+ assert asset_before.equal?(asset_after)
166
+ end
167
+
168
+ test "fingerprint digest sets expiration to the future" do
169
+ get "/assets/application.js"
170
+ digest = last_response.headers['ETag'][/"(.+)"/, 1]
171
+
172
+ get "/assets/application-#{digest}.js"
173
+ assert_match %r{max-age}, last_response.headers['Cache-Control']
174
+ end
175
+
176
+ test "missing source" do
177
+ get "/assets/none.js"
178
+ assert_equal 404, last_response.status
179
+ assert_equal "pass", last_response.headers['X-Cascade']
180
+ end
181
+
182
+ test "re-throw JS exceptions in the browser" do
183
+ get "/assets/missing_require.js"
184
+ assert_equal 200, last_response.status
185
+ assert_equal "throw Error(\"Sprockets::FileNotFound: couldn't find file 'notfound'\\n (in #{fixture_path("server/vendor/javascripts/missing_require.js")}:1)\")", last_response.body
186
+ end
187
+
188
+ test "display CSS exceptions in the browser" do
189
+ get "/assets/missing_require.css"
190
+ assert_equal 200, last_response.status
191
+ assert_match %r{content: ".*?Sprockets::FileNotFound}, last_response.body
192
+ end
193
+
194
+ test "illegal require outside load path" do
195
+ get "/assets/../config/passwd"
196
+ assert_equal 403, last_response.status
197
+ end
198
+
199
+ test "add new source to tree" do
200
+ filename = fixture_path("server/app/javascripts/baz.js")
201
+
202
+ sandbox filename do
203
+ get "/assets/tree.js"
204
+ assert_equal "var foo;\n\n(function() {\n application.boot();\n})();\nvar bar;\n",
205
+ last_response.body
206
+
207
+ File.open(filename, "w") do |f|
208
+ f.puts "var baz;"
209
+ end
210
+
211
+ path = fixture_path "server/app/javascripts"
212
+ mtime = Time.now + 60
213
+ File.utime(mtime, mtime, path)
214
+
215
+ get "/assets/tree.js"
216
+ assert_equal "var foo;\n\n(function() {\n application.boot();\n})();\nvar bar;\nvar baz;\n",
217
+ last_response.body
218
+ end
219
+ end
220
+
221
+ test "serving static assets" do
222
+ get "/assets/hello.txt"
223
+ assert_equal 200, last_response.status
224
+ assert_equal "text/plain", last_response.content_type
225
+ assert_equal File.read(fixture_path("server/app/javascripts/hello.txt")), last_response.body
226
+ end
227
+ end