pancake 0.1.8

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 (172) hide show
  1. data/LICENSE +20 -0
  2. data/README.textile +95 -0
  3. data/Rakefile +56 -0
  4. data/TODO +17 -0
  5. data/bin/jeweler +19 -0
  6. data/bin/pancake-gen +17 -0
  7. data/bin/rubyforge +19 -0
  8. data/lib/pancake/bootloaders.rb +180 -0
  9. data/lib/pancake/configuration.rb +145 -0
  10. data/lib/pancake/constants.rb +5 -0
  11. data/lib/pancake/core_ext/class.rb +44 -0
  12. data/lib/pancake/core_ext/object.rb +22 -0
  13. data/lib/pancake/core_ext/symbol.rb +15 -0
  14. data/lib/pancake/defaults/configuration.rb +22 -0
  15. data/lib/pancake/defaults/middlewares.rb +1 -0
  16. data/lib/pancake/errors.rb +61 -0
  17. data/lib/pancake/generators/base.rb +12 -0
  18. data/lib/pancake/generators/micro_generator.rb +17 -0
  19. data/lib/pancake/generators/short_generator.rb +17 -0
  20. data/lib/pancake/generators/stack_generator.rb +17 -0
  21. data/lib/pancake/generators/templates/common/dotgitignore +22 -0
  22. data/lib/pancake/generators/templates/common/dothtaccess +17 -0
  23. data/lib/pancake/generators/templates/micro/%stack_name%/%stack_name%.rb.tt +8 -0
  24. data/lib/pancake/generators/templates/micro/%stack_name%/config.ru.tt +12 -0
  25. data/lib/pancake/generators/templates/micro/%stack_name%/pancake.init.tt +1 -0
  26. data/lib/pancake/generators/templates/micro/%stack_name%/public/.empty_directory +0 -0
  27. data/lib/pancake/generators/templates/micro/%stack_name%/tmp/.empty_directory +0 -0
  28. data/lib/pancake/generators/templates/micro/%stack_name%/views/root.html.haml +1 -0
  29. data/lib/pancake/generators/templates/short/%stack_name%/LICENSE.tt +20 -0
  30. data/lib/pancake/generators/templates/short/%stack_name%/README.tt +7 -0
  31. data/lib/pancake/generators/templates/short/%stack_name%/Rakefile.tt +50 -0
  32. data/lib/pancake/generators/templates/short/%stack_name%/VERSION.tt +1 -0
  33. data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/%stack_name%.rb.tt +6 -0
  34. data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/config.ru.tt +10 -0
  35. data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/mounts/.empty_directory +0 -0
  36. data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/public/.empty_directory +0 -0
  37. data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/tmp/.empty_directory +0 -0
  38. data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%/views/root.html.haml +2 -0
  39. data/lib/pancake/generators/templates/short/%stack_name%/lib/%stack_name%.rb.tt +5 -0
  40. data/lib/pancake/generators/templates/short/%stack_name%/pancake.init.tt +1 -0
  41. data/lib/pancake/generators/templates/short/%stack_name%/spec/%stack_name%_spec.rb.tt +7 -0
  42. data/lib/pancake/generators/templates/short/%stack_name%/spec/spec_helper.rb.tt +9 -0
  43. data/lib/pancake/generators/templates/stack/%stack_name%/LICENSE.tt +20 -0
  44. data/lib/pancake/generators/templates/stack/%stack_name%/README.tt +7 -0
  45. data/lib/pancake/generators/templates/stack/%stack_name%/Rakefile.tt +50 -0
  46. data/lib/pancake/generators/templates/stack/%stack_name%/VERSION.tt +1 -0
  47. data/lib/pancake/generators/templates/stack/%stack_name%/lib/%stack_name%/config/environments/development.rb.tt +18 -0
  48. data/lib/pancake/generators/templates/stack/%stack_name%/lib/%stack_name%/config/environments/production.rb.tt +18 -0
  49. data/lib/pancake/generators/templates/stack/%stack_name%/lib/%stack_name%/config/router.rb.tt +6 -0
  50. data/lib/pancake/generators/templates/stack/%stack_name%/lib/%stack_name%/config.ru.tt +12 -0
  51. data/lib/pancake/generators/templates/stack/%stack_name%/lib/%stack_name%/gems/cache/.empty_directory +0 -0
  52. data/lib/pancake/generators/templates/stack/%stack_name%/lib/%stack_name%/mounts/.empty_directory +0 -0
  53. data/lib/pancake/generators/templates/stack/%stack_name%/lib/%stack_name%/public/.empty_directory +0 -0
  54. data/lib/pancake/generators/templates/stack/%stack_name%/lib/%stack_name%/tmp/.empty_directory +0 -0
  55. data/lib/pancake/generators/templates/stack/%stack_name%/lib/%stack_name%.rb.tt +3 -0
  56. data/lib/pancake/generators/templates/stack/%stack_name%/pancake.init.tt +1 -0
  57. data/lib/pancake/generators/templates/stack/%stack_name%/spec/%stack_name%_spec.rb.tt +7 -0
  58. data/lib/pancake/generators/templates/stack/%stack_name%/spec/spec_helper.rb.tt +9 -0
  59. data/lib/pancake/generators.rb +8 -0
  60. data/lib/pancake/hooks/inheritable_inner_classes.rb +60 -0
  61. data/lib/pancake/hooks/on_inherit.rb +34 -0
  62. data/lib/pancake/logger.rb +200 -0
  63. data/lib/pancake/master.rb +123 -0
  64. data/lib/pancake/middleware.rb +347 -0
  65. data/lib/pancake/middlewares/logger.rb +16 -0
  66. data/lib/pancake/middlewares/static.rb +38 -0
  67. data/lib/pancake/mime_types.rb +265 -0
  68. data/lib/pancake/mixins/publish/action_options.rb +104 -0
  69. data/lib/pancake/mixins/publish.rb +125 -0
  70. data/lib/pancake/mixins/render/render.rb +168 -0
  71. data/lib/pancake/mixins/render/template.rb +23 -0
  72. data/lib/pancake/mixins/render/view_context.rb +21 -0
  73. data/lib/pancake/mixins/render.rb +109 -0
  74. data/lib/pancake/mixins/request_helper.rb +100 -0
  75. data/lib/pancake/mixins/stack_helper.rb +46 -0
  76. data/lib/pancake/mixins/url.rb +10 -0
  77. data/lib/pancake/paths.rb +218 -0
  78. data/lib/pancake/router.rb +99 -0
  79. data/lib/pancake/stack/app.rb +10 -0
  80. data/lib/pancake/stack/bootloader.rb +79 -0
  81. data/lib/pancake/stack/configuration.rb +44 -0
  82. data/lib/pancake/stack/middleware.rb +0 -0
  83. data/lib/pancake/stack/router.rb +21 -0
  84. data/lib/pancake/stack/stack.rb +66 -0
  85. data/lib/pancake/stacks/short/bootloaders.rb +13 -0
  86. data/lib/pancake/stacks/short/controller.rb +116 -0
  87. data/lib/pancake/stacks/short/default/views/base.html.haml +5 -0
  88. data/lib/pancake/stacks/short/stack.rb +187 -0
  89. data/lib/pancake/stacks/short.rb +3 -0
  90. data/lib/pancake.rb +58 -0
  91. data/spec/helpers/helpers.rb +20 -0
  92. data/spec/helpers/matchers.rb +25 -0
  93. data/spec/pancake/bootloaders_spec.rb +109 -0
  94. data/spec/pancake/configuration_spec.rb +177 -0
  95. data/spec/pancake/constants_spec.rb +7 -0
  96. data/spec/pancake/defaults/configuration_spec.rb +58 -0
  97. data/spec/pancake/fixtures/foo_stack/pancake.init +0 -0
  98. data/spec/pancake/fixtures/middlewares/other_public/two.html +1 -0
  99. data/spec/pancake/fixtures/middlewares/public/foo#bar.html +1 -0
  100. data/spec/pancake/fixtures/middlewares/public/one.html +1 -0
  101. data/spec/pancake/fixtures/paths/controllers/controller1.rb +0 -0
  102. data/spec/pancake/fixtures/paths/controllers/controller2.rb +0 -0
  103. data/spec/pancake/fixtures/paths/controllers/controller3.rb +0 -0
  104. data/spec/pancake/fixtures/paths/models/model1.rb +0 -0
  105. data/spec/pancake/fixtures/paths/models/model2.rb +0 -0
  106. data/spec/pancake/fixtures/paths/models/model3.rb +0 -0
  107. data/spec/pancake/fixtures/paths/stack/controllers/controller1.rb +0 -0
  108. data/spec/pancake/fixtures/paths/stack/models/model3.rb +0 -0
  109. data/spec/pancake/fixtures/paths/stack/views/view1.erb +0 -0
  110. data/spec/pancake/fixtures/paths/stack/views/view1.rb +0 -0
  111. data/spec/pancake/fixtures/paths/stack/views/view2.erb +0 -0
  112. data/spec/pancake/fixtures/paths/stack/views/view2.haml +0 -0
  113. data/spec/pancake/fixtures/render_templates/context_template.html.erb +2 -0
  114. data/spec/pancake/fixtures/render_templates/erb_template.html.erb +1 -0
  115. data/spec/pancake/fixtures/render_templates/erb_template.json.erb +1 -0
  116. data/spec/pancake/fixtures/render_templates/haml_template.html.haml +1 -0
  117. data/spec/pancake/fixtures/render_templates/haml_template.xml.haml +1 -0
  118. data/spec/pancake/fixtures/render_templates/templates/context.erb +2 -0
  119. data/spec/pancake/fixtures/render_templates/view_context/capture_erb.erb +5 -0
  120. data/spec/pancake/fixtures/render_templates/view_context/capture_haml.haml +4 -0
  121. data/spec/pancake/fixtures/render_templates/view_context/concat_erb.erb +2 -0
  122. data/spec/pancake/fixtures/render_templates/view_context/concat_haml.haml +2 -0
  123. data/spec/pancake/fixtures/render_templates/view_context/context.erb +3 -0
  124. data/spec/pancake/fixtures/render_templates/view_context/context2.erb +3 -0
  125. data/spec/pancake/fixtures/render_templates/view_context/helper_methods.erb +3 -0
  126. data/spec/pancake/fixtures/render_templates/view_context/inherited_erb_from_haml.erb +5 -0
  127. data/spec/pancake/fixtures/render_templates/view_context/inherited_erb_level_0.erb +5 -0
  128. data/spec/pancake/fixtures/render_templates/view_context/inherited_erb_level_1.erb +5 -0
  129. data/spec/pancake/fixtures/render_templates/view_context/inherited_haml_from_erb.haml +4 -0
  130. data/spec/pancake/fixtures/render_templates/view_context/inherited_haml_level_0.haml +4 -0
  131. data/spec/pancake/fixtures/render_templates/view_context/inherited_haml_level_1.haml +4 -0
  132. data/spec/pancake/fixtures/render_templates/view_context/nested_content_level_0.haml +6 -0
  133. data/spec/pancake/fixtures/render_templates/view_context/nested_content_level_1.haml +4 -0
  134. data/spec/pancake/fixtures/render_templates/view_context/nested_inner.erb +1 -0
  135. data/spec/pancake/fixtures/render_templates/view_context/nested_outer.erb +3 -0
  136. data/spec/pancake/fixtures/render_templates/view_context/super_erb_from_erb_0.erb +5 -0
  137. data/spec/pancake/fixtures/render_templates/view_context/super_erb_from_erb_1.erb +6 -0
  138. data/spec/pancake/fixtures/render_templates/view_context/super_erb_from_haml_0.erb +5 -0
  139. data/spec/pancake/fixtures/render_templates/view_context/super_erb_from_haml_1.erb +6 -0
  140. data/spec/pancake/fixtures/render_templates/view_context/super_haml_from_erb_0.haml +4 -0
  141. data/spec/pancake/fixtures/render_templates/view_context/super_haml_from_erb_1.haml +5 -0
  142. data/spec/pancake/fixtures/render_templates/view_context/super_haml_from_haml_0.haml +5 -0
  143. data/spec/pancake/fixtures/render_templates/view_context/super_haml_from_haml_1.haml +5 -0
  144. data/spec/pancake/fixtures/stacks/short/foobar/other_root/views/base.html.haml +4 -0
  145. data/spec/pancake/fixtures/stacks/short/foobar/views/basic.html.haml +1 -0
  146. data/spec/pancake/fixtures/stacks/short/foobar/views/inherited_from_base.html.haml +5 -0
  147. data/spec/pancake/hooks/on_inherit_spec.rb +65 -0
  148. data/spec/pancake/inheritance_spec.rb +100 -0
  149. data/spec/pancake/middleware_spec.rb +401 -0
  150. data/spec/pancake/middlewares/logger_spec.rb +29 -0
  151. data/spec/pancake/middlewares/static_spec.rb +83 -0
  152. data/spec/pancake/mime_types_spec.rb +234 -0
  153. data/spec/pancake/mixins/publish_spec.rb +94 -0
  154. data/spec/pancake/mixins/render/template_spec.rb +69 -0
  155. data/spec/pancake/mixins/render/view_context_spec.rb +248 -0
  156. data/spec/pancake/mixins/render_spec.rb +56 -0
  157. data/spec/pancake/mixins/request_helper_spec.rb +27 -0
  158. data/spec/pancake/mixins/stack_helper_spec.rb +46 -0
  159. data/spec/pancake/pancake_spec.rb +90 -0
  160. data/spec/pancake/paths_spec.rb +210 -0
  161. data/spec/pancake/stack/app_spec.rb +28 -0
  162. data/spec/pancake/stack/bootloader_spec.rb +41 -0
  163. data/spec/pancake/stack/middleware_spec.rb +0 -0
  164. data/spec/pancake/stack/router_spec.rb +282 -0
  165. data/spec/pancake/stack/stack_configuration_spec.rb +101 -0
  166. data/spec/pancake/stack/stack_spec.rb +60 -0
  167. data/spec/pancake/stacks/short/controller_spec.rb +322 -0
  168. data/spec/pancake/stacks/short/middlewares_spec.rb +22 -0
  169. data/spec/pancake/stacks/short/router_spec.rb +136 -0
  170. data/spec/pancake/stacks/short/stack_spec.rb +64 -0
  171. data/spec/spec_helper.rb +23 -0
  172. metadata +294 -0
@@ -0,0 +1,322 @@
1
+ require File.join(File.expand_path(File.dirname(__FILE__)),'..', '..', '..', 'spec_helper')
2
+
3
+ describe Pancake::Stacks::Short::Controller do
4
+
5
+ before do
6
+ class ::ShortFoo < Pancake::Stacks::Short
7
+ add_root(__FILE__)
8
+ add_root(File.expand_path(File.dirname(__FILE__)), "..", "fixtures", "stacks", "short", "foobar")
9
+ class Controller
10
+ def do_dispatch!
11
+ dispatch!
12
+ end
13
+
14
+ publish
15
+ def show; "show"; end
16
+
17
+ publish
18
+ def index; "index"; end
19
+
20
+ protected
21
+ def a_protected_method; "protected"; end
22
+
23
+ private
24
+ def a_private_method; "private"; end
25
+ end
26
+ end
27
+ end
28
+
29
+ after do
30
+ clear_constants "ShortFoo", :ShortBar
31
+ end
32
+
33
+ def app
34
+ ShortFoo.stackup
35
+ end
36
+
37
+ it "should have a Controller" do
38
+ Pancake::Stacks::Short.constants.map(&:to_s).should include("Controller")
39
+ end
40
+
41
+ it "should inherit the subclass controller from the parent controller" do
42
+ ShortFoo::Controller.should inherit_from(Pancake::Stacks::Short::Controller)
43
+ end
44
+
45
+ describe "dispatching an action" do
46
+ before do
47
+ @controller = ShortFoo::Controller.new(env_for)
48
+ end
49
+
50
+ it "should call the 'show' action" do
51
+ @controller.params["action"] = "show"
52
+ result = @controller.do_dispatch!
53
+ result[0].should == 200
54
+ result[2].body.join.should == "show"
55
+ end
56
+
57
+ it "should raise a Pancake::Response::NotFound exception when an action is now found" do
58
+ @controller.params["action"] = :does_not_exist
59
+ result = @controller.do_dispatch!
60
+ result[0].should == 404
61
+ end
62
+
63
+ it "should not dispatch to a protected method" do
64
+ @controller.params["action"] = "a_protected_method"
65
+ result = @controller.do_dispatch!
66
+ result[0].should == 404
67
+ end
68
+
69
+ it "should not dispatch to a private method" do
70
+ @controller.params["action"] = "a_private_method"
71
+ result = @controller.do_dispatch!
72
+ result[0].should == 404
73
+ end
74
+
75
+ it "should raise an exception if pancake has told it not to handle errors" do
76
+ Pancake.should_receive(:handle_errors?).and_return(false)
77
+ @controller.params["action"] = "a_private_method"
78
+ lambda do
79
+ @controller.do_dispatch!
80
+ end.should raise_error
81
+ end
82
+
83
+ describe "helper in methods" do
84
+ before do
85
+ module PancakeTestHelper
86
+ def some_helper_method
87
+ "foo"
88
+ end
89
+ end
90
+
91
+ class ShortFoo
92
+ class Controller
93
+ include PancakeTestHelper
94
+ end
95
+ end
96
+ end
97
+ after do
98
+ clear_constants "PancakeTestHelper"
99
+ end
100
+
101
+ it "should not call a helper method" do
102
+ @controller.params["action"] = "some_helper_method"
103
+ result = @controller.do_dispatch!
104
+ result[0].should == 404
105
+ end
106
+
107
+ end
108
+ end
109
+
110
+ describe "accept type negotiations" do
111
+ before do
112
+ class ::ShortBar < Pancake::Stacks::Short
113
+ roots << Pancake.get_root(__FILE__)
114
+ # makes the dispatch method public
115
+ def do_dispatch!
116
+ dispatch!
117
+ end
118
+
119
+ provides :json, :xml, :text
120
+
121
+ get "/foo/bar(.:format)" do
122
+ "format #{content_type.inspect}"
123
+ end
124
+ end # ShortBar
125
+ end # before
126
+
127
+ def app
128
+ ShortBar.stackup
129
+ end
130
+
131
+ it "should get json by default" do
132
+ result = get "/foo/bar", {}, "HTTP_ACCEPT" => "application/json"
133
+ result.status.should == 200
134
+ result.headers["Content-Type"].should == "application/json"
135
+ result.body.to_s.should == "format :json"
136
+ end
137
+
138
+ it "should get xml when specified" do
139
+ result = get "/foo/bar.xml"
140
+ result.status.should == 200
141
+ result.headers["Content-Type"].should == "application/xml"
142
+ result.body.to_s.should == "format :xml"
143
+ end
144
+
145
+ it "should get json when specified with */*" do
146
+ result = get "/foo/bar", {}, "HTTP_ACCEPT" => "*/*"
147
+ result.status.should == 200
148
+ result.body.to_s.should == "format :json"
149
+ result.headers["Content-Type"].should == "application/json"
150
+ end
151
+
152
+ it "should get the default when specified with */*" do
153
+ result = get "/foo/bar", {}, "HTTP_ACCEPT" => "application/xml,*/*"
154
+ result.status.should == 200
155
+ result.body.to_s.should == "format :json"
156
+ result.headers["Content-Type"].should == "application/json"
157
+ end
158
+
159
+ it "should use the format in preference to the content type" do
160
+ result = get "/foo/bar.xml", {}, "HTTP_ACCEPT" => "*/*"
161
+ result.status.should == 200
162
+ result.body.to_s.should == "format :xml"
163
+ result.headers["Content-Type"].should == "application/xml"
164
+ end
165
+
166
+ it "should get json by default" do
167
+ result = get "/foo/bar"
168
+ result.status.should == 200
169
+ result.body.to_s.should == "format :json"
170
+ result.headers["Content-Type"].should == "application/json"
171
+ end
172
+
173
+ it "should correctly negotiate different scenarios" do
174
+ r = get "/foo/bar", {}, {}
175
+ r.body.should == "format :json"
176
+ r = get "/foo/bar.xml", {}, {}
177
+ r.body.should == "format :xml"
178
+ r = get "/foo/bar", {}, {}
179
+ r.body.should == "format :json"
180
+ r = get "/foo/bar", {}, "HTTP_ACCEPT" => "application/xml"
181
+ r.body.should == "format :xml"
182
+ r = get "/foo/bar.json"
183
+ r.body.should == "format :json"
184
+ end
185
+
186
+ it "should negotiate based on extension" do
187
+ r = get "/foo/bar"
188
+ r.body.should == "format :json"
189
+ r = get "/foo/bar.text"
190
+ r.body.should == "format :text"
191
+ r = get "/foo/bar.xml"
192
+ r.body.should == "format :xml"
193
+ r = get "/foo/bar.txt"
194
+ r.body.should == "format :text"
195
+ end
196
+
197
+ it "should not provide a response to a format that is not provided" do
198
+ r = get "/foo/bar.svg"
199
+ r.status.should == 406
200
+ end
201
+ end # Accept type negotiations
202
+
203
+ describe "error handling" do
204
+ before do
205
+ class ::ShortFoo
206
+ provides :html, :xml
207
+
208
+ get "/foo(.:format)" do
209
+ "HERE"
210
+ end
211
+
212
+ get "/bad" do
213
+ raise "This is bad"
214
+ end
215
+
216
+ get "/template/:name" do
217
+ render params[:name]
218
+ end
219
+
220
+ end
221
+ end
222
+
223
+ describe "default error handling" do
224
+ def app
225
+ ShortFoo.stackup
226
+ end
227
+
228
+ it "should handle a NotFound by default" do
229
+ result = get "/does_not_exist"
230
+ result.status.should == 404
231
+ result.body.should include(Pancake::Errors::NotFound.description)
232
+ end
233
+
234
+ it "should return a 500 status for a Random Error by wrapping it in a Pancake::Errors::Server" do
235
+ result = get "/bad"
236
+ result.status.should == 500
237
+ result.body.should include(Pancake::Errors::Server.description)
238
+ end
239
+
240
+ it "should handle a NotAcceptable error" do
241
+ result = get "/foo.no_format_i_know_of"
242
+ result.status.should == 406
243
+ result.body.should include(Pancake::Errors::NotAcceptable.description)
244
+ end
245
+
246
+ it "should return 406 for a format that is in pancake but not in the group" do
247
+ r = get "/foo.svg"
248
+ r.status.should == 406
249
+ end
250
+
251
+
252
+ end
253
+
254
+ describe "custom error handling" do
255
+ before do
256
+ ShortFoo.handle_exception do |error|
257
+ out = ""
258
+ out << "CUSTOM "
259
+ out << error.name
260
+ out << ": "
261
+ out << error.description
262
+ end
263
+
264
+ ShortFoo.get "/bad" do
265
+ raise "Really Bad"
266
+ end
267
+ end
268
+
269
+ after do
270
+ ShortFoo.handle_exception(&Pancake::Stacks::Short::Controller::DEFAULT_EXCEPTION_HANDLER)
271
+ end
272
+
273
+ it "should handle Pancake::Errors::NotFound errors" do
274
+ r = get "/not_a_thing"
275
+ r.status.should == 404
276
+ r.body.should include("CUSTOM")
277
+ r.body.should include(Pancake::Errors::NotFound.description)
278
+ end
279
+
280
+ it "should handle an unknown server error" do
281
+ r = get "/bad"
282
+ r.status.should == 500
283
+ r.body.should include("CUSTOM")
284
+ r.body.should include(Pancake::Errors::Server.description)
285
+ end
286
+
287
+ it "should let me do stuff on an instance level inside the handle exception" do
288
+ ShortFoo.handle_exception do |error|
289
+ self.status = 123
290
+ "BOOO!"
291
+ end
292
+
293
+ r = get "/bad"
294
+ r.status.should == 123
295
+ r.body.should == "BOOO!"
296
+ end
297
+
298
+ end
299
+
300
+ describe "rendering" do
301
+
302
+ it "should render a template" do
303
+ result = get "/template/basic"
304
+ result.body.should include("basic template")
305
+ end
306
+
307
+ it "should inherit from a base view provided by short stacks" do
308
+ File.file?(File.join(File.expand_path(File.dirname(__FILE__)), "..", "fixtures", "stacks", "short", "foobar", "views", "base.html.haml")).should be_false
309
+ result = get "/template/inherited_from_base"
310
+ result.body.should include("inherited from base")
311
+ result.body.should include("Pancake")
312
+ end
313
+
314
+ it "should allow me to overwrite the base tempalte in later roots" do
315
+ ShortFoo.add_root(File.expand_path(File.dirname(__FILE__)), "..", "fixtures", "stacks", "short", "foobar", "other_root")
316
+ result = get "/template/inherited_from_base"
317
+ result.body.should include("inherited from base")
318
+ result.body.should include("Not the default pancake")
319
+ end
320
+ end
321
+ end
322
+ end
@@ -0,0 +1,22 @@
1
+ require File.dirname(__FILE__) + '/../../../spec_helper'
2
+
3
+ describe "short stack middleware" do
4
+ before do
5
+ class ::FooBar < Pancake::Stacks::Short
6
+ add_root(__FILE__)
7
+ end
8
+ end
9
+
10
+ after do
11
+ clear_constants :FooBar
12
+ end
13
+
14
+ it "should include the Pancake::Middlewares::Static middleware" do
15
+ FooBar.stackup
16
+ middleware = FooBar.middlewares.detect do |m|
17
+ m.middleware == Pancake::Middlewares::Static
18
+ end
19
+ middleware.should_not be_nil
20
+ middleware.args.should == [FooBar]
21
+ end
22
+ end
@@ -0,0 +1,136 @@
1
+ require File.join(File.expand_path(File.dirname(__FILE__)),'..', '..', '..', 'spec_helper')
2
+
3
+ describe Pancake::Stacks::Short, "routes" do
4
+ before do
5
+ class ::RoutedShortStack < Pancake::Stacks::Short
6
+ roots << Pancake.get_root(__FILE__)
7
+
8
+ get "/", :_name => :root do
9
+ "get - /"
10
+ end
11
+
12
+ get "/foo", :_name => :foo do
13
+ "get - foo"
14
+ end
15
+
16
+ get "/bar", :_name => :bar do
17
+ "get - bar"
18
+ end
19
+
20
+ post "/foo" do
21
+ "post - foo"
22
+ end
23
+
24
+ post "/bar" do
25
+ "post - bar"
26
+ end
27
+
28
+ put "/foo" do
29
+ "put - foo"
30
+ end
31
+
32
+ put "/bar" do
33
+ "put - bar"
34
+ end
35
+
36
+ delete "/foo" do
37
+ "delete - foo"
38
+ end
39
+
40
+ delete "/bar" do
41
+ "delete - bar"
42
+ end
43
+
44
+ get "/baz/:var(/:date)" do
45
+ "done: var == #{params[:var]} : date == #{params[:date]}"
46
+ end.name(:baz)
47
+ end
48
+ @app = RoutedShortStack.stackup
49
+ end
50
+ after do
51
+ clear_constants "RoutedShortStack", "FooApp", "BarApp"
52
+ end
53
+
54
+ def app
55
+ @app
56
+ end
57
+
58
+ %w(foo bar).each do |item|
59
+ %w(get post put delete).each do |method|
60
+ it "should #{method} /#{item}" do
61
+ result = self.send(method, "/#{item}")
62
+ result.status.should == 200
63
+ result.body.should == "#{method} - #{item}"
64
+ end
65
+ end # get post put delete
66
+ end # foo bar
67
+
68
+ it "should return a not found if we try to get an action that has not been defined" do
69
+ result = get "/blah"
70
+ result.status.should == 404
71
+ end
72
+
73
+
74
+ it "should handle tricky routes" do
75
+ result = get "/baz/hassox"
76
+ result.status.should == 200
77
+ result.body.should == "done: var == hassox : date == "
78
+ end
79
+
80
+ it "should handle tricky routes with optional parameters" do
81
+ result = get "/baz/hassox/2009-08-21"
82
+ result.status.should == 200
83
+ result.body.should == "done: var == hassox : date == 2009-08-21"
84
+ end
85
+
86
+ describe "url generation" do
87
+ it "should generate a simple named url" do
88
+ Pancake.url(RoutedShortStack, :foo).should == "/foo"
89
+ end
90
+
91
+ it "should generate a complex named url" do
92
+ Pancake.url(RoutedShortStack, :baz, :var => "bar").should == "/baz/bar"
93
+ Pancake.url(RoutedShortStack, :baz, :var => "bar", :date => "today").should == "/baz/bar/today"
94
+ end
95
+
96
+ it "should generate it's url when it's nested" do
97
+ class ::FooApp < Pancake::Stack; end
98
+ FooApp.router.mount(RoutedShortStack.stackup, "/short/stack")
99
+ Pancake.url(RoutedShortStack, :foo).should == "/short/stack/foo"
100
+ Pancake.url(RoutedShortStack, :baz, :var => "var", :date => "today").should == "/short/stack/baz/var/today"
101
+ end
102
+ end
103
+
104
+ describe "inherited route generation" do
105
+ before do
106
+ class ::FooApp < RoutedShortStack; end
107
+ @app = FooApp.stackup
108
+ end
109
+
110
+ it "should generate an inherited simple url" do
111
+ Pancake.url(FooApp, :foo).should == "/foo"
112
+ end
113
+
114
+ it "should generate a complex url" do
115
+ Pancake.url(FooApp, :baz, :var => "the_var", :date => "today").should == "/baz/the_var/today"
116
+ end
117
+
118
+ %w(foo bar).each do |item|
119
+ %w(get post put delete).each do |method|
120
+ it "should #{method} /#{item}" do
121
+ result = self.send(method, "/#{item}")
122
+ result.status.should == 200
123
+ result.body.should == "#{method} - #{item}"
124
+ end
125
+ end # get post put delete
126
+ end # foo bar
127
+
128
+ it "should match the nested route without affecting the parent" do
129
+ class ::BarApp < Pancake::Stack; end
130
+ BarApp.router.mount(FooApp.stackup, "/mount/point")
131
+
132
+ Pancake.url(FooApp, :foo).should == "/mount/point/foo"
133
+ Pancake.url(RoutedShortStack, :foo).should == "/foo"
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,64 @@
1
+ require File.dirname(__FILE__) + '/../../../spec_helper'
2
+
3
+ describe Pancake::Stacks::Short do
4
+
5
+ before do
6
+ $captures = []
7
+ class ::ShortMiddle
8
+ def initialize(app)
9
+ @app = app
10
+ end
11
+
12
+ def call(env)
13
+ $captures << ShortMiddle
14
+ @app.call(env)
15
+ end
16
+ end
17
+
18
+ class ::ShortFoo < Pancake::Stacks::Short
19
+ roots << Pancake.get_root(__FILE__)
20
+ add_root(__FILE__, "..", "..", "fixtures", "stacks", "short", "foobar")
21
+ add_root(__FILE__, "..", "..", "fixtures", "stacks", "short", "foobar", "other_root")
22
+ use ShortMiddle
23
+
24
+
25
+ get "/foo" do
26
+ "HERE"
27
+ end
28
+
29
+ get "/" do
30
+ $captures << self.class
31
+ render :inherited_from_base
32
+ end
33
+ end
34
+ end
35
+
36
+ after do
37
+ clear_constants :ShortFoo, :ShortMiddle, :OtherFoo
38
+ end
39
+
40
+ def app
41
+ ShortFoo.stackup
42
+ end
43
+
44
+ it "should go through the middleware to get to the actions" do
45
+ get "/foo"
46
+ $captures.should == [ShortMiddle]
47
+ end
48
+
49
+ describe "inheritance" do
50
+ before do
51
+ class ::OtherFoo < ShortFoo; end
52
+ ShortFoo.router.mount(OtherFoo.stackup, "/other")
53
+ end
54
+
55
+ it "should render the same template in the child as it does in the parent" do
56
+ get "/"
57
+ $captures.pop.should == ShortFoo::Controller
58
+ last_response.should match(/inherited from base/)
59
+ get "/other/"
60
+ $captures.pop.should == OtherFoo::Controller
61
+ last_response.should match(/inherited from base/)
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,23 @@
1
+ $TESTING=true
2
+ require 'rubygems'
3
+ require 'date'
4
+ require 'rack'
5
+ require 'rack/test'
6
+ require 'spec/rake/spectask'
7
+ require 'spec'
8
+ require 'haml'
9
+ require 'json'
10
+
11
+ ENV['RACK_ENV'] = "test"
12
+
13
+ $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
14
+ require 'pancake'
15
+
16
+ Dir[File.join(File.dirname(__FILE__), "helpers", "**/*.rb")].each{|f| require f}
17
+
18
+
19
+ Spec::Runner.configure do |config|
20
+ config.include(Pancake::Matchers)
21
+ config.include(Pancake::Spec::Helpers)
22
+ config.include(Rack::Test::Methods)
23
+ end