middleman 2.0.4 → 2.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (172) hide show
  1. data/CHANGELOG +8 -0
  2. data/lib/middleman.rb +7 -1
  3. data/lib/middleman/vendor/padrino-core-0.10.0/.document +5 -0
  4. data/lib/middleman/vendor/padrino-core-0.10.0/.gitignore +22 -0
  5. data/lib/middleman/vendor/padrino-core-0.10.0/LICENSE +20 -0
  6. data/lib/middleman/vendor/padrino-core-0.10.0/README.rdoc +294 -0
  7. data/lib/middleman/vendor/padrino-core-0.10.0/Rakefile +5 -0
  8. data/lib/middleman/vendor/padrino-core-0.10.0/bin/padrino +9 -0
  9. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core.rb +119 -0
  10. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/application.rb +259 -0
  11. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/application/rendering.rb +228 -0
  12. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/application/routing.rb +821 -0
  13. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/application/showexceptions.rb +18 -0
  14. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/caller.rb +45 -0
  15. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/cli/adapter.rb +24 -0
  16. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/cli/base.rb +152 -0
  17. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/cli/console.rb +20 -0
  18. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/cli/rake.rb +24 -0
  19. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/cli/rake_tasks.rb +59 -0
  20. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/command.rb +27 -0
  21. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/images/404.png +0 -0
  22. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/images/500.png +0 -0
  23. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/loader.rb +182 -0
  24. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/cz.yml +30 -0
  25. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/da.yml +30 -0
  26. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/de.yml +30 -0
  27. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/en.yml +30 -0
  28. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/es.yml +30 -0
  29. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/fr.yml +30 -0
  30. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/hu.yml +30 -0
  31. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/it.yml +37 -0
  32. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/ja.yml +30 -0
  33. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/nl.yml +30 -0
  34. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/no.yml +31 -0
  35. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/pl.yml +30 -0
  36. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/pt_br.yml +37 -0
  37. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/ru.yml +30 -0
  38. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/tr.yml +30 -0
  39. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/uk.yml +30 -0
  40. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/zh_cn.yml +30 -0
  41. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/locale/zh_tw.yml +30 -0
  42. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/logger.rb +344 -0
  43. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/mounter.rb +192 -0
  44. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/reloader.rb +247 -0
  45. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/router.rb +79 -0
  46. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/server.rb +70 -0
  47. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/support_lite.rb +135 -0
  48. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/tasks.rb +23 -0
  49. data/lib/middleman/vendor/padrino-core-0.10.0/lib/padrino-core/version.rb +15 -0
  50. data/lib/middleman/vendor/padrino-core-0.10.0/padrino-core.gemspec +38 -0
  51. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/apps/.components +6 -0
  52. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/apps/.gitignore +7 -0
  53. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/apps/complex.rb +27 -0
  54. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/apps/simple.rb +33 -0
  55. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/dependencies/a.rb +9 -0
  56. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/dependencies/b.rb +4 -0
  57. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/dependencies/c.rb +1 -0
  58. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/dependencies/circular/e.rb +13 -0
  59. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/dependencies/circular/f.rb +2 -0
  60. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/dependencies/circular/g.rb +2 -0
  61. data/lib/middleman/vendor/padrino-core-0.10.0/test/fixtures/dependencies/d.rb +4 -0
  62. data/lib/middleman/vendor/padrino-core-0.10.0/test/helper.rb +101 -0
  63. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_application.rb +83 -0
  64. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_core.rb +79 -0
  65. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_dependencies.rb +44 -0
  66. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_filters.rb +266 -0
  67. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_logger.rb +91 -0
  68. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_mounter.rb +176 -0
  69. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_reloader_complex.rb +66 -0
  70. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_reloader_simple.rb +97 -0
  71. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_rendering.rb +437 -0
  72. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_router.rb +146 -0
  73. data/lib/middleman/vendor/padrino-core-0.10.0/test/test_routing.rb +1491 -0
  74. data/lib/middleman/vendor/padrino-helpers-0.10.0/.document +5 -0
  75. data/lib/middleman/vendor/padrino-helpers-0.10.0/.gitignore +21 -0
  76. data/lib/middleman/vendor/padrino-helpers-0.10.0/LICENSE +20 -0
  77. data/lib/middleman/vendor/padrino-helpers-0.10.0/README.rdoc +239 -0
  78. data/lib/middleman/vendor/padrino-helpers-0.10.0/Rakefile +5 -0
  79. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers.rb +51 -0
  80. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/asset_tag_helpers.rb +288 -0
  81. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/form_builder/abstract_form_builder.rb +220 -0
  82. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/form_builder/standard_form_builder.rb +43 -0
  83. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/form_helpers.rb +446 -0
  84. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/format_helpers.rb +260 -0
  85. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/cz.yml +103 -0
  86. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/da.yml +91 -0
  87. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/de.yml +78 -0
  88. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/en.yml +103 -0
  89. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/es.yml +103 -0
  90. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/fr.yml +79 -0
  91. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/hu.yml +103 -0
  92. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/it.yml +85 -0
  93. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/ja.yml +103 -0
  94. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/nl.yml +78 -0
  95. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/no.yml +91 -0
  96. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/pl.yml +95 -0
  97. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/pt_br.yml +103 -0
  98. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/ru.yml +103 -0
  99. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/tr.yml +103 -0
  100. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/uk.yml +103 -0
  101. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/zh_cn.yml +103 -0
  102. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/locale/zh_tw.yml +103 -0
  103. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/number_helpers.rb +273 -0
  104. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/output_helpers.rb +128 -0
  105. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/output_helpers/abstract_handler.rb +103 -0
  106. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/output_helpers/erb_handler.rb +79 -0
  107. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/output_helpers/haml_handler.rb +64 -0
  108. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/output_helpers/slim_handler.rb +82 -0
  109. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/render_helpers.rb +40 -0
  110. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/tag_helpers.rb +59 -0
  111. data/lib/middleman/vendor/padrino-helpers-0.10.0/lib/padrino-helpers/translation_helpers.rb +21 -0
  112. data/lib/middleman/vendor/padrino-helpers-0.10.0/padrino-helpers.gemspec +27 -0
  113. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/app.rb +73 -0
  114. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/capture_concat.erb +14 -0
  115. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/capture_concat.haml +12 -0
  116. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/capture_concat.slim +13 -0
  117. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/content_for.erb +11 -0
  118. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/content_for.haml +9 -0
  119. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/content_for.slim +9 -0
  120. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/content_tag.erb +11 -0
  121. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/content_tag.haml +9 -0
  122. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/content_tag.slim +9 -0
  123. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/current_engine.erb +5 -0
  124. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/current_engine.haml +5 -0
  125. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/current_engine.slim +5 -0
  126. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/fields_for.erb +20 -0
  127. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/fields_for.haml +15 -0
  128. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/fields_for.slim +15 -0
  129. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/form_for.erb +56 -0
  130. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/form_for.haml +47 -0
  131. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/form_for.slim +47 -0
  132. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/form_tag.erb +56 -0
  133. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/form_tag.haml +45 -0
  134. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/form_tag.slim +45 -0
  135. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/link_to.erb +5 -0
  136. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/link_to.haml +4 -0
  137. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/link_to.slim +4 -0
  138. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/mail_to.erb +3 -0
  139. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/mail_to.haml +3 -0
  140. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/mail_to.slim +3 -0
  141. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/meta_tag.erb +3 -0
  142. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/meta_tag.haml +3 -0
  143. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/meta_tag.slim +3 -0
  144. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/partials/_erb.erb +1 -0
  145. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/partials/_haml.haml +1 -0
  146. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/partials/_slim.slim +1 -0
  147. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/simple_partial.erb +1 -0
  148. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/simple_partial.haml +1 -0
  149. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/markup_app/views/simple_partial.slim +1 -0
  150. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/app.rb +45 -0
  151. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/current_engine.haml +5 -0
  152. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/current_engines/_erb.erb +1 -0
  153. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/current_engines/_haml.haml +1 -0
  154. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/current_engines/_slim.slim +1 -0
  155. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/erb/test.erb +1 -0
  156. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/explicit_engine.haml +5 -0
  157. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/haml/test.haml +1 -0
  158. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/template/_user.haml +7 -0
  159. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/template/haml_template.haml +1 -0
  160. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/fixtures/render_app/views/template/some_template.haml +2 -0
  161. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/helper.rb +78 -0
  162. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_asset_tag_helpers.rb +320 -0
  163. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_form_builder.rb +998 -0
  164. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_form_helpers.rb +645 -0
  165. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_format_helpers.rb +227 -0
  166. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_number_helpers.rb +136 -0
  167. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_output_helpers.rb +133 -0
  168. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_render_helpers.rb +69 -0
  169. data/lib/middleman/vendor/padrino-helpers-0.10.0/test/test_tag_helpers.rb +100 -0
  170. data/lib/middleman/version.rb +1 -1
  171. data/middleman.gemspec +6 -2
  172. metadata +218 -67
@@ -0,0 +1,146 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/helper')
2
+ require File.expand_path(File.dirname(__FILE__) + '/fixtures/apps/simple')
3
+
4
+ class TestRouter < Test::Unit::TestCase
5
+
6
+ def setup
7
+ Padrino.clear!
8
+ end
9
+
10
+ should "dispatch paths correctly" do
11
+ app = lambda { |env|
12
+ [200, {
13
+ 'X-ScriptName' => env['SCRIPT_NAME'],
14
+ 'X-PathInfo' => env['PATH_INFO'],
15
+ 'Content-Type' => 'text/plain'
16
+ }, [""]]
17
+ }
18
+ map = Padrino::Router.new(
19
+ { :path => '/bar', :to => app },
20
+ { :path => '/foo', :to => app },
21
+ { :path => '/foo/bar', :to => app }
22
+ )
23
+
24
+ res = Rack::MockRequest.new(map).get("/")
25
+ assert res.not_found?
26
+
27
+ res = Rack::MockRequest.new(map).get("/qux")
28
+ assert res.not_found?
29
+
30
+ res = Rack::MockRequest.new(map).get("/foo")
31
+ assert res.ok?
32
+ assert_equal "/foo", res["X-ScriptName"]
33
+ assert_equal "/", res["X-PathInfo"]
34
+
35
+ res = Rack::MockRequest.new(map).get("/foo/")
36
+ assert res.ok?
37
+ assert_equal "/foo", res["X-ScriptName"]
38
+ assert_equal "/", res["X-PathInfo"]
39
+
40
+ res = Rack::MockRequest.new(map).get("/foo/bar")
41
+ assert res.ok?
42
+ assert_equal "/foo/bar", res["X-ScriptName"]
43
+ assert_equal "/", res["X-PathInfo"]
44
+
45
+ res = Rack::MockRequest.new(map).get("/foo/bar/")
46
+ assert res.ok?
47
+ assert_equal "/foo/bar", res["X-ScriptName"]
48
+ assert_equal "/", res["X-PathInfo"]
49
+
50
+ res = Rack::MockRequest.new(map).get("/foo///bar//quux")
51
+ assert_equal 200, res.status
52
+ assert res.ok?
53
+ assert_equal "/foo/bar", res["X-ScriptName"]
54
+ assert_equal "//quux", res["X-PathInfo"]
55
+
56
+ res = Rack::MockRequest.new(map).get("/foo/quux", "SCRIPT_NAME" => "/bleh")
57
+ assert res.ok?
58
+ assert_equal "/bleh/foo", res["X-ScriptName"]
59
+ assert_equal "/quux", res["X-PathInfo"]
60
+
61
+ res = Rack::MockRequest.new(map).get("/bar", 'HTTP_HOST' => 'foo.org')
62
+ assert res.ok?
63
+ assert_equal "/bar", res["X-ScriptName"]
64
+ assert_equal "/", res["X-PathInfo"]
65
+
66
+ res = Rack::MockRequest.new(map).get("/bar/", 'HTTP_HOST' => 'foo.org')
67
+ assert res.ok?
68
+ assert_equal "/bar", res["X-ScriptName"]
69
+ assert_equal "/", res["X-PathInfo"]
70
+ end
71
+
72
+ should "dispatches hosts correctly" do
73
+ map = Padrino::Router.new(
74
+ { :host => "foo.org", :to => lambda { |env|
75
+ [200,
76
+ { "Content-Type" => "text/plain",
77
+ "X-Position" => "foo.org",
78
+ "X-Host" => env["HTTP_HOST"] || env["SERVER_NAME"],
79
+ }, [""]]}},
80
+ { :host => "subdomain.foo.org", :to => lambda { |env|
81
+ [200,
82
+ { "Content-Type" => "text/plain",
83
+ "X-Position" => "subdomain.foo.org",
84
+ "X-Host" => env["HTTP_HOST"] || env["SERVER_NAME"],
85
+ }, [""]]}},
86
+ { :host => /.*\.bar.org/, :to => lambda { |env|
87
+ [200,
88
+ { "Content-Type" => "text/plain",
89
+ "X-Position" => "bar.org",
90
+ "X-Host" => env["HTTP_HOST"] || env["SERVER_NAME"],
91
+ }, [""]]}}
92
+ )
93
+
94
+ res = Rack::MockRequest.new(map).get("/", "HTTP_HOST" => "bar.org")
95
+ assert res.not_found?
96
+
97
+ res = Rack::MockRequest.new(map).get("/", "HTTP_HOST" => "at.bar.org")
98
+ assert res.ok?
99
+ assert_equal "bar.org", res["X-Position"]
100
+
101
+ res = Rack::MockRequest.new(map).get("/", "HTTP_HOST" => "foo.org")
102
+ assert res.ok?
103
+ assert_equal "foo.org", res["X-Position"]
104
+
105
+ res = Rack::MockRequest.new(map).get("/", "HTTP_HOST" => "subdomain.foo.org", "SERVER_NAME" => "foo.org")
106
+ assert res.ok?
107
+ assert_equal "subdomain.foo.org", res["X-Position"]
108
+ end
109
+
110
+ should "works with padrino core applications" do
111
+ Padrino.mount("simple_demo").host("padrino.org")
112
+ assert_equal ["simple_demo"], Padrino.mounted_apps.map(&:name)
113
+ assert_equal ["padrino.org"], Padrino.mounted_apps.map(&:app_host)
114
+
115
+ res = Rack::MockRequest.new(Padrino.application).get("/")
116
+ assert res.not_found?
117
+
118
+ res = Rack::MockRequest.new(Padrino.application).get("/", "HTTP_HOST" => "bar.org")
119
+ assert res.not_found?
120
+
121
+ res = Rack::MockRequest.new(Padrino.application).get("/", "HTTP_HOST" => "padrino.org")
122
+ assert res.ok?
123
+ end
124
+
125
+ should "works with padrino applications" do
126
+ Padrino.mount("simple_demo").to("/foo").host(/.*\.padrino.org/)
127
+
128
+ res = Rack::MockRequest.new(Padrino.application).get("/")
129
+ assert res.not_found?
130
+
131
+ res = Rack::MockRequest.new(Padrino.application).get("/", "HTTP_HOST" => "bar.org")
132
+ assert res.not_found?
133
+
134
+ res = Rack::MockRequest.new(Padrino.application).get("/", "HTTP_HOST" => "padrino.org")
135
+ assert res.not_found?
136
+
137
+ res = Rack::MockRequest.new(Padrino.application).get("/none", "HTTP_HOST" => "foo.padrino.org")
138
+ assert res.not_found?
139
+
140
+ res = Rack::MockRequest.new(Padrino.application).get("/foo", "HTTP_HOST" => "bar.padrino.org")
141
+ assert res.ok?
142
+
143
+ res = Rack::MockRequest.new(Padrino.application).get("/foo/", "HTTP_HOST" => "bar.padrino.org")
144
+ assert res.ok?
145
+ end
146
+ end
@@ -0,0 +1,1491 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/helper')
2
+
3
+ class FooError < RuntimeError; end
4
+
5
+
6
+ class TestRouting < Test::Unit::TestCase
7
+ should 'ignore trailing delimiters for basic route' do
8
+ mock_app do
9
+ get("/foo"){ "okey" }
10
+ get(:test) { "tester" }
11
+ end
12
+ get "/foo"
13
+ assert_equal "okey", body
14
+ get "/foo/"
15
+ assert_equal "okey", body
16
+ get "/test"
17
+ assert_equal "tester", body
18
+ get "/test/"
19
+ assert_equal "tester", body
20
+ end
21
+
22
+ should 'fail with unrecognized route exception when not found' do
23
+ mock_app do
24
+ get(:index){ "okey" }
25
+ end
26
+ assert_nothing_raised { get @app.url_for(:index) }
27
+ assert_equal "okey", body
28
+ assert_raises(Padrino::Routing::UnrecognizedException) {
29
+ get @app.url_for(:fake)
30
+ }
31
+ end
32
+
33
+ should 'accept regexp routes' do
34
+ mock_app do
35
+ get(%r{/fob|/baz}) { "regexp" }
36
+ get("/foo") { "str" }
37
+ get %r{/([0-9]+)/} do |num|
38
+ "Your lucky number: #{num} #{params[:captures].first}"
39
+ end
40
+ end
41
+ get "/foo"
42
+ assert_equal "str", body
43
+ get "/fob"
44
+ assert_equal "regexp", body
45
+ get "/baz"
46
+ assert_equal "regexp", body
47
+ get "/1234/"
48
+ assert_equal "Your lucky number: 1234 1234", body
49
+ end
50
+
51
+ should "parse routes with question marks" do
52
+ mock_app do
53
+ get("/foo/?"){ "okey" }
54
+ post('/unauthenticated/?') { "no access" }
55
+ end
56
+ get "/foo"
57
+ assert_equal "okey", body
58
+ get "/foo/"
59
+ assert_equal "okey", body
60
+ post "/unauthenticated"
61
+ assert_equal "no access", body
62
+ post "/unauthenticated/"
63
+ assert_equal "no access", body
64
+ end
65
+
66
+ should 'match correctly similar paths' do
67
+ mock_app do
68
+ get("/my/:foo_id"){ params[:foo_id] }
69
+ get("/my/:bar_id/bar"){ params[:bar_id] }
70
+ end
71
+ get "/my/1"
72
+ assert_equal "1", body
73
+ get "/my/2/bar"
74
+ assert_equal "2", body
75
+ end
76
+
77
+ should "match user agents" do
78
+ app = mock_app do
79
+ get("/main", :agent => /IE/){ "hello IE" }
80
+ get("/main"){ "hello" }
81
+ end
82
+ get "/main"
83
+ assert_equal "hello", body
84
+ get "/main", {}, {'HTTP_USER_AGENT' => 'This is IE'}
85
+ assert_equal "hello IE", body
86
+ end
87
+
88
+ should "use regex for parts of a route" do
89
+ app = mock_app do
90
+ get("/main/:id", :id => /\d+/){ "hello #{params[:id]}" }
91
+ end
92
+ get "/main/123"
93
+ assert_equal "hello 123", body
94
+ get "/main/asd"
95
+ assert_equal 404, status
96
+ end
97
+
98
+ should "not generate overlapping head urls" do
99
+ app = mock_app do
100
+ get("/main"){ "hello" }
101
+ post("/main"){ "hello" }
102
+ end
103
+ assert_equal 3, app.routes.size, "should generate GET, HEAD and PUT"
104
+ assert_equal ["GET"], app.routes[0].conditions[:request_method]
105
+ assert_equal ["HEAD"], app.routes[1].conditions[:request_method]
106
+ assert_equal ["POST"], app.routes[2].conditions[:request_method]
107
+ end
108
+
109
+ should 'generate basic urls' do
110
+ mock_app do
111
+ get(:foo){ "/foo" }
112
+ get(:foo, :with => :id){ |id| "/foo/#{id}" }
113
+ get([:foo, :id]){ |id| "/foo/#{id}" }
114
+ get(:hash, :with => :id){ url(:hash, :id => 1) }
115
+ get([:hash, :id]){ url(:hash, :id => 1) }
116
+ get(:array, :with => :id){ url(:array, 23) }
117
+ get([:array, :id]){ url(:array, 23) }
118
+ get(:hash_with_extra, :with => :id){ url(:hash_with_extra, :id => 1, :query => 'string') }
119
+ get([:hash_with_extra, :id]){ url(:hash_with_extra, :id => 1, :query => 'string') }
120
+ get(:array_with_extra, :with => :id){ url(:array_with_extra, 23, :query => 'string') }
121
+ get([:array_with_extra, :id]){ url(:array_with_extra, 23, :query => 'string') }
122
+ get("/old-bar/:id"){ params[:id] }
123
+ post(:mix, :map => "/mix-bar/:id"){ params[:id] }
124
+ get(:mix, :map => "/mix-bar/:id"){ params[:id] }
125
+ end
126
+ get "/foo"
127
+ assert_equal "/foo", body
128
+ get "/foo/123"
129
+ assert_equal "/foo/123", body
130
+ get "/hash/2"
131
+ assert_equal "/hash/1", body
132
+ get "/array/23"
133
+ assert_equal "/array/23", body
134
+ get "/hash_with_extra/1"
135
+ assert_equal "/hash_with_extra/1?query=string", body
136
+ get "/array_with_extra/23"
137
+ assert_equal "/array_with_extra/23?query=string", body
138
+ get "/old-bar/3"
139
+ assert_equal "3", body
140
+ post "/mix-bar/4"
141
+ assert_equal "4", body
142
+ get "/mix-bar/4"
143
+ assert_equal "4", body
144
+ end
145
+
146
+ should 'generate url with format' do
147
+ mock_app do
148
+ get(:a, :provides => :any){ url(:a, :format => :json) }
149
+ get(:b, :provides => :js){ url(:b, :format => :js) }
150
+ get(:c, :provides => [:js, :json]){ url(:c, :format => :json) }
151
+ get(:d, :provides => [:html, :js]){ url(:d, :format => :js, :foo => :bar) }
152
+ end
153
+ get "/a.js"
154
+ assert_equal "/a.json", body
155
+ get "/b.js"
156
+ assert_equal "/b.js", body
157
+ get "/b.ru"
158
+ assert_equal 405, status
159
+ get "/c.js"
160
+ assert_equal "/c.json", body
161
+ get "/c.json"
162
+ assert_equal "/c.json", body
163
+ get "/c.ru"
164
+ assert_equal 405, status
165
+ get "/d"
166
+ assert_equal "/d.js?foo=bar", body
167
+ get "/d.js"
168
+ assert_equal "/d.js?foo=bar", body
169
+ get "/e.xml"
170
+ assert_equal 404, status
171
+ end
172
+
173
+ should 'use padrino url method' do
174
+ mock_app do
175
+ end
176
+
177
+ assert_equal @app.method(:url).owner, Padrino::Routing::ClassMethods
178
+ end
179
+
180
+ should 'work correctly with sinatra redirects' do
181
+ mock_app do
182
+ get(:index) { redirect url(:index) }
183
+ get(:google) { redirect "http://google.com" }
184
+ get("/foo") { redirect "/bar" }
185
+ get("/bar") { "Bar" }
186
+ end
187
+
188
+ get "/"
189
+ assert_equal "http://example.org/", headers['Location']
190
+ get "/google"
191
+ assert_equal "http://google.com", headers['Location']
192
+ get "/foo"
193
+ assert_equal "http://example.org/bar", headers['Location']
194
+ end
195
+
196
+ should "return 406 on Accept-Headers it does not provide" do
197
+ mock_app do
198
+ get(:a, :provides => [:html, :js]){ content_type }
199
+ end
200
+
201
+ get "/a", {}, {"HTTP_ACCEPT" => "application/yaml"}
202
+ assert_equal 406, status
203
+ end
204
+
205
+ should "return 406 on file extensions it does not provide and flag is set" do
206
+ mock_app do
207
+ enable :treat_format_as_accept
208
+ get(:a, :provides => [:html, :js]){ content_type }
209
+ end
210
+
211
+ get "/a.xml", {}, {}
212
+ assert_equal 406, status
213
+ end
214
+
215
+ should "return 404 on file extensions it does not provide and flag is not set" do
216
+ mock_app do
217
+ get(:a, :provides => [:html, :js]){ content_type }
218
+ end
219
+
220
+ get "/a.xml", {}, {}
221
+ assert_equal 405, status
222
+ end
223
+
224
+ should "not set content_type to :html if Accept */* and html not in provides" do
225
+ mock_app do
226
+ get("/foo", :provides => [:json, :xml]) { content_type.to_s }
227
+ end
228
+
229
+ get '/foo', {}, { 'HTTP_ACCEPT' => '*/*;q=0.5' }
230
+ assert_equal 'json', body
231
+ end
232
+
233
+ should "set content_type to :json if Accept contains */*" do
234
+ mock_app do
235
+ get("/foo", :provides => [:json]) { content_type.to_s }
236
+ end
237
+
238
+ get '/foo', {}, { 'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' }
239
+ assert_equal 'json', body
240
+ end
241
+
242
+ should "send the appropriate number of params" do
243
+ mock_app do
244
+ get('/id/:user_id', :provides => [:json]) { |user_id| user_id}
245
+ end
246
+ get '/id/5.json'
247
+ assert_equal '5', body
248
+ end
249
+
250
+ should "allow .'s in param values" do
251
+ mock_app do
252
+ get('/id/:email', :provides => [:json]) { |email, format| [email, format] * '/' }
253
+ end
254
+ get '/id/foo@bar.com.json'
255
+ assert_equal 'foo@bar.com/json', body
256
+ end
257
+
258
+ should "set correct content_type for Accept not equal to */* even if */* also provided" do
259
+ mock_app do
260
+ get("/foo", :provides => [:html, :js, :xml]) { content_type.to_s }
261
+ end
262
+
263
+ get '/foo', {}, { 'HTTP_ACCEPT' => 'application/javascript, */*;q=0.5' }
264
+ assert_equal 'js', body
265
+ end
266
+
267
+ should "return the first content type in provides if accept header is empty" do
268
+ mock_app do
269
+ get(:a, :provides => [:js]){ content_type.to_s }
270
+ end
271
+
272
+ get "/a", {}, {}
273
+ assert_equal "js", body
274
+ end
275
+
276
+ should "not default to HTML if HTML is not provided and no type is given" do
277
+ mock_app do
278
+ get(:a, :provides => [:js]){ content_type }
279
+ end
280
+
281
+ get "/a", {}, {}
282
+ assert_equal "application/javascript;charset=utf-8", content_type
283
+ end
284
+
285
+ should "not match routes if url_format and http_accept is provided but not included" do
286
+ mock_app do
287
+ get(:a, :provides => [:js, :html]){ content_type }
288
+ end
289
+
290
+ get "/a.xml", {}, {"HTTP_ACCEPT" => "text/html"}
291
+ assert_equal 405, status
292
+ end
293
+
294
+ should "generate routes for format simple" do
295
+ mock_app do
296
+ get(:foo, :provides => [:html, :rss]) { render :haml, "Test" }
297
+ end
298
+ get "/foo"
299
+ assert_equal "Test\n", body
300
+ get "/foo.rss"
301
+ assert_equal "Test\n", body
302
+ end
303
+
304
+ should "should inject the controller name into the request" do
305
+ mock_app do
306
+ controller :posts do
307
+ get(:index) { request.controller }
308
+ controller :mini do
309
+ get(:index) { request.controller }
310
+ end
311
+ end
312
+ end
313
+ get "/posts"
314
+ assert_equal "posts", body
315
+ get "/mini"
316
+ assert_equal "mini", body
317
+ end
318
+
319
+ should "support not_found" do
320
+ mock_app do
321
+ not_found do
322
+ response.status = 404
323
+ 'whatever'
324
+ end
325
+
326
+ get :index, :map => "/" do
327
+ 'index'
328
+ end
329
+ end
330
+ get '/something'
331
+ assert_equal 'whatever', body
332
+ assert_equal 404, status
333
+ get '/'
334
+ assert_equal 'index', body
335
+ assert_equal 200, status
336
+ end
337
+
338
+ should "should inject the route into the request" do
339
+ mock_app do
340
+ controller :posts do
341
+ get(:index) { request.route_obj.named.to_s }
342
+ end
343
+ end
344
+ get "/posts"
345
+ assert_equal "posts_index", body
346
+ end
347
+
348
+ should "preserve the format if you set it manually" do
349
+ mock_app do
350
+ before do
351
+ params[:format] = :json
352
+ end
353
+
354
+ get "test", :provides => [:html, :json] do
355
+ params[:format].inspect
356
+ end
357
+ end
358
+ get "/test"
359
+ assert_equal ":json", body
360
+ get "/test.html"
361
+ assert_equal ":json", body
362
+ end
363
+
364
+ should "generate routes for format with controller" do
365
+ mock_app do
366
+ controller :posts do
367
+ get(:index, :provides => [:html, :rss, :atom, :js]) { render :haml, "Index.#{content_type}" }
368
+ get(:show, :with => :id, :provides => [:html, :rss, :atom]) { render :haml, "Show.#{content_type}" }
369
+ end
370
+ end
371
+ get "/posts"
372
+ assert_equal "Index.html\n", body
373
+ get "/posts.rss"
374
+ assert_equal "Index.rss\n", body
375
+ get "/posts.atom"
376
+ assert_equal "Index.atom\n", body
377
+ get "/posts.js"
378
+ assert_equal "Index.js\n", body
379
+ get "/posts/show/5"
380
+ assert_equal "Show.html\n", body
381
+ get "/posts/show/5.rss"
382
+ assert_equal "Show.rss\n", body
383
+ get "/posts/show/10.atom"
384
+ assert_equal "Show.atom\n", body
385
+ end
386
+
387
+ should 'map routes' do
388
+ mock_app do
389
+ get(:bar){ "bar" }
390
+ end
391
+ get "/bar"
392
+ assert_equal "bar", body
393
+ assert_equal "/bar", @app.url(:bar)
394
+ end
395
+
396
+ should 'remove index from path' do
397
+ mock_app do
398
+ get(:index){ "index" }
399
+ get("/accounts/index"){ "accounts" }
400
+ end
401
+ get "/"
402
+ assert_equal "index", body
403
+ assert_equal "/", @app.url(:index)
404
+ get "/accounts"
405
+ assert_equal "accounts", body
406
+ end
407
+
408
+ should 'remove index from path with params' do
409
+ mock_app do
410
+ get(:index, :with => :name){ "index with #{params[:name]}" }
411
+ end
412
+ get "/bobby"
413
+ assert_equal "index with bobby", body
414
+ assert_equal "/john", @app.url(:index, :name => "john")
415
+ end
416
+
417
+ should 'parse named params' do
418
+ mock_app do
419
+ get(:print, :with => :id){ "Im #{params[:id]}" }
420
+ end
421
+ get "/print/9"
422
+ assert_equal "Im 9", body
423
+ assert_equal "/print/9", @app.url(:print, :id => 9)
424
+ end
425
+
426
+ should '405 on wrong request_method' do
427
+ mock_app do
428
+ post('/bar'){ "bar" }
429
+ end
430
+ get "/bar"
431
+ assert_equal 405, status
432
+ end
433
+
434
+ should 'respond to' do
435
+ mock_app do
436
+ get(:a, :provides => :js){ "js" }
437
+ get(:b, :provides => :any){ "any" }
438
+ get(:c, :provides => [:js, :json]){ "js,json" }
439
+ get(:d, :provides => [:html, :js]){ "html,js"}
440
+ end
441
+ get "/a"
442
+ assert_equal 200, status
443
+ assert_equal "js", body
444
+ get "/a.js"
445
+ assert_equal "js", body
446
+ get "/b"
447
+ assert_equal "any", body
448
+ assert_raise(RuntimeError) { get "/b.foo" }
449
+ get "/c"
450
+ assert_equal 200, status
451
+ assert_equal "js,json", body
452
+ get "/c.js"
453
+ assert_equal "js,json", body
454
+ get "/c.json"
455
+ assert_equal "js,json", body
456
+ get "/d"
457
+ assert_equal "html,js", body
458
+ get "/d.js"
459
+ assert_equal "html,js", body
460
+ end
461
+
462
+ should 'respond_to and set content_type' do
463
+ Rack::Mime::MIME_TYPES['.foo'] = 'application/foo'
464
+ mock_app do
465
+ get :a, :provides => :any do
466
+ case content_type
467
+ when :js then "js"
468
+ when :json then "json"
469
+ when :foo then "foo"
470
+ when :html then "html"
471
+ end
472
+ end
473
+ end
474
+ get "/a.js"
475
+ assert_equal "js", body
476
+ assert_equal 'application/javascript;charset=utf-8', response["Content-Type"]
477
+ get "/a.json"
478
+ assert_equal "json", body
479
+ assert_equal 'application/json;charset=utf-8', response["Content-Type"]
480
+ get "/a.foo"
481
+ assert_equal "foo", body
482
+ assert_equal 'application/foo;charset=utf-8', response["Content-Type"]
483
+ get "/a"
484
+ assert_equal "html", body
485
+ assert_equal 'text/html;charset=utf-8', response["Content-Type"]
486
+ end
487
+
488
+ should 'use controllers' do
489
+ mock_app do
490
+ controller "/admin" do
491
+ get("/"){ "index" }
492
+ get("/show/:id"){ "show #{params[:id]}" }
493
+ end
494
+ end
495
+ get "/admin"
496
+ assert_equal "index", body
497
+ get "/admin/show/1"
498
+ assert_equal "show 1", body
499
+ end
500
+
501
+ should 'use named controllers' do
502
+ mock_app do
503
+ controller :admin do
504
+ get(:index, :with => :id){ params[:id] }
505
+ get(:show, :with => :id){ "show #{params[:id]}" }
506
+ end
507
+ controllers :foo, :bar do
508
+ get(:index){ "foo_bar_index" }
509
+ end
510
+ end
511
+ get "/admin/1"
512
+ assert_equal "1", body
513
+ get "/admin/show/1"
514
+ assert_equal "show 1", body
515
+ assert_equal "/admin/1", @app.url(:admin_index, :id => 1)
516
+ assert_equal "/admin/show/1", @app.url(:admin_show, :id => 1)
517
+ get "/foo/bar"
518
+ assert_equal "foo_bar_index", body
519
+ end
520
+
521
+ should 'use map and with' do
522
+ mock_app do
523
+ get :index, :map => '/bugs', :with => :id do
524
+ params[:id]
525
+ end
526
+ end
527
+ get '/bugs/4'
528
+ assert_equal '4', body
529
+ assert_equal "/bugs/4", @app.url(:index, :id => 4)
530
+ end
531
+
532
+ should "ignore trailing delimiters within a named controller" do
533
+ mock_app do
534
+ controller :posts do
535
+ get(:index, :provides => [:html, :js]){ "index" }
536
+ get(:new) { "new" }
537
+ get(:show, :with => :id){ "show #{params[:id]}" }
538
+ end
539
+ end
540
+ get "/posts"
541
+ assert_equal "index", body
542
+ get "/posts/"
543
+ assert_equal "index", body
544
+ get "/posts.js"
545
+ assert_equal "index", body
546
+ get "/posts.js/"
547
+ assert_equal "index", body
548
+ get "/posts/new"
549
+ assert_equal "new", body
550
+ get "/posts/new/"
551
+ assert_equal "new", body
552
+ end
553
+
554
+ should "ignore trailing delimiters within a named controller for unnamed actions" do
555
+ mock_app do
556
+ controller :accounts do
557
+ get("/") { "account_index" }
558
+ get("/new") { "new" }
559
+ end
560
+ controller :votes do
561
+ get("/") { "vote_index" }
562
+ end
563
+ end
564
+ get "/accounts"
565
+ assert_equal "account_index", body
566
+ get "/accounts/"
567
+ assert_equal "account_index", body
568
+ get "/accounts/new"
569
+ assert_equal "new", body
570
+ get "/accounts/new/"
571
+ assert_equal "new", body
572
+ get "/votes"
573
+ assert_equal "vote_index", body
574
+ get "/votes/"
575
+ assert_equal "vote_index", body
576
+ end
577
+
578
+ should 'use named controllers with array routes' do
579
+ mock_app do
580
+ controller :admin do
581
+ get(:index){ "index" }
582
+ get(:show, :with => :id){ "show #{params[:id]}" }
583
+ end
584
+ controllers :foo, :bar do
585
+ get(:index){ "foo_bar_index" }
586
+ end
587
+ end
588
+ get "/admin"
589
+ assert_equal "index", body
590
+ get "/admin/show/1"
591
+ assert_equal "show 1", body
592
+ assert_equal "/admin", @app.url(:admin, :index)
593
+ assert_equal "/admin/show/1", @app.url(:admin, :show, :id => 1)
594
+ get "/foo/bar"
595
+ assert_equal "foo_bar_index", body
596
+ end
597
+
598
+ should 'use uri_root' do
599
+ mock_app do
600
+ get(:foo){ "foo" }
601
+ end
602
+ @app.uri_root = '/'
603
+ assert_equal "/foo", @app.url(:foo)
604
+ @app.uri_root = '/testing'
605
+ assert_equal "/testing/foo", @app.url(:foo)
606
+ @app.uri_root = '/testing/'
607
+ assert_equal "/testing/foo", @app.url(:foo)
608
+ @app.uri_root = 'testing/bar///'
609
+ assert_equal "/testing/bar/foo", @app.url(:foo)
610
+ end
611
+
612
+ should 'use uri_root with controllers' do
613
+ mock_app do
614
+ controller :foo do
615
+ get(:bar){ "bar" }
616
+ end
617
+ end
618
+ @app.uri_root = '/testing'
619
+ assert_equal "/testing/foo/bar", @app.url(:foo, :bar)
620
+ end
621
+
622
+ should 'use RACK_BASE_URI' do
623
+ mock_app do
624
+ get(:foo){ "foo" }
625
+ end
626
+ # Wish there was a side-effect free way to test this...
627
+ ENV['RACK_BASE_URI'] = '/'
628
+ assert_equal "/foo", @app.url(:foo)
629
+ ENV['RACK_BASE_URI'] = '/testing'
630
+ assert_equal "/testing/foo", @app.url(:foo)
631
+ ENV['RACK_BASE_URI'] = nil
632
+ end
633
+
634
+ should 'reset routes' do
635
+ mock_app do
636
+ get("/"){ "foo" }
637
+ reset_router!
638
+ end
639
+ get "/"
640
+ assert_equal 404, status
641
+ end
642
+
643
+ should 'respect priorities' do
644
+ route_order = []
645
+ mock_app do
646
+ get(:index, :priority => :normal) { route_order << :normal; pass }
647
+ get(:index, :priority => :low) { route_order << :low; "hello" }
648
+ get(:index, :priority => :high) { route_order << :high; pass }
649
+ end
650
+ get '/'
651
+ assert_equal [:high, :normal, :low], route_order
652
+ assert_equal "hello", body
653
+ end
654
+
655
+ should 'allow optionals' do
656
+ mock_app do
657
+ get(:show, :map => "/stories/:type(/:category)") do
658
+ "#{params[:type]}/#{params[:category]}"
659
+ end
660
+ end
661
+ get "/stories/foo"
662
+ assert_equal "foo/", body
663
+ get "/stories/foo/bar"
664
+ assert_equal "foo/bar", body
665
+ end
666
+
667
+ should 'apply maps' do
668
+ mock_app do
669
+ controllers :admin do
670
+ get(:index, :map => "/"){ "index" }
671
+ get(:show, :with => :id, :map => "/show"){ "show #{params[:id]}" }
672
+ get(:edit, :map => "/edit/:id/product"){ "edit #{params[:id]}" }
673
+ get(:wacky, :map => "/wacky-:id-:product_id"){ "wacky #{params[:id]}-#{params[:product_id]}" }
674
+ end
675
+ end
676
+ get "/"
677
+ assert_equal "index", body
678
+ get @app.url(:admin, :index)
679
+ assert_equal "index", body
680
+ get "/show/1"
681
+ assert_equal "show 1", body
682
+ get "/edit/1/product"
683
+ assert_equal "edit 1", body
684
+ get "/wacky-1-2"
685
+ assert_equal "wacky 1-2", body
686
+ end
687
+
688
+ should 'apply maps when given path is kind of hash' do
689
+ mock_app do
690
+ controllers :admin do
691
+ get(:foobar, "/foo/bar"){ "foobar" }
692
+ end
693
+ end
694
+ get "/foo/bar"
695
+ assert_equal "foobar", body
696
+ end
697
+
698
+ should "apply parent to route" do
699
+ mock_app do
700
+ controllers :project do
701
+ get(:index, :parent => :user) { "index #{params[:user_id]}" }
702
+ get(:index, :parent => [:user, :section]) { "index #{params[:user_id]} #{params[:section_id]}" }
703
+ get(:edit, :with => :id, :parent => :user) { "edit #{params[:id]} #{params[:user_id]}"}
704
+ get(:show, :with => :id, :parent => [:user, :product]) { "show #{params[:id]} #{params[:user_id]} #{params[:product_id]}"}
705
+ end
706
+ end
707
+ get "/user/1/project"
708
+ assert_equal "index 1", body
709
+ get "/user/1/section/3/project"
710
+ assert_equal "index 1 3", body
711
+ get "/user/1/project/edit/2"
712
+ assert_equal "edit 2 1", body
713
+ get "/user/1/product/2/project/show/3"
714
+ assert_equal "show 3 1 2", body
715
+ end
716
+
717
+ should "apply parent to controller" do
718
+ mock_app do
719
+ controller :project, :parent => :user do
720
+ get(:index) { "index #{params[:user_id]}"}
721
+ get(:edit, :with => :id, :parent => :user) { "edit #{params[:id]} #{params[:user_id]}"}
722
+ get(:show, :with => :id, :parent => :product) { "show #{params[:id]} #{params[:user_id]} #{params[:product_id]}"}
723
+ end
724
+ end
725
+
726
+ user_project_url = "/user/1/project"
727
+ get user_project_url
728
+ assert_equal "index 1", body
729
+ assert_equal user_project_url, @app.url(:project, :index, :user_id => 1)
730
+
731
+ user_project_edit_url = "/user/1/project/edit/2"
732
+ get user_project_edit_url
733
+ assert_equal "edit 2 1", body
734
+ assert_equal user_project_edit_url, @app.url(:project, :edit, :user_id => 1, :id => 2)
735
+
736
+ user_product_project_url = "/user/1/product/2/project/show/3"
737
+ get user_product_project_url
738
+ assert_equal "show 3 1 2", body
739
+ assert_equal user_product_project_url, @app.url(:project, :show, :user_id => 1, :product_id => 2, :id => 3)
740
+ end
741
+
742
+ should "apply parent with shallowing to controller" do
743
+ mock_app do
744
+ controller :project do
745
+ parent :user
746
+ parent :shop, :optional => true
747
+ get(:index) { "index #{params[:user_id]} #{params[:shop_id]}" }
748
+ get(:edit, :with => :id) { "edit #{params[:id]} #{params[:user_id]} #{params[:shop_id]}" }
749
+ get(:show, :with => :id, :parent => :product) { "show #{params[:id]} #{params[:user_id]} #{params[:product_id]} #{params[:shop_id]}" }
750
+ end
751
+ end
752
+
753
+ assert_equal "/user/1/project", @app.url(:project, :index, :user_id => 1, :shop_id => nil)
754
+ assert_equal "/user/1/shop/23/project", @app.url(:project, :index, :user_id => 1, :shop_id => 23)
755
+
756
+ user_project_url = "/user/1/project"
757
+ get user_project_url
758
+ assert_equal "index 1 ", body
759
+ assert_equal user_project_url, @app.url(:project, :index, :user_id => 1)
760
+
761
+ user_project_edit_url = "/user/1/project/edit/2"
762
+ get user_project_edit_url
763
+ assert_equal "edit 2 1 ", body
764
+ assert_equal user_project_edit_url, @app.url(:project, :edit, :user_id => 1, :id => 2)
765
+
766
+ user_product_project_url = "/user/1/product/2/project/show/3"
767
+ get user_product_project_url
768
+ assert_equal "show 3 1 2 ", body
769
+ assert_equal user_product_project_url, @app.url(:project, :show, :user_id => 1, :product_id => 2, :id => 3)
770
+
771
+ user_project_url = "/user/1/shop/1/project"
772
+ get user_project_url
773
+ assert_equal "index 1 1", body
774
+ assert_equal user_project_url, @app.url(:project, :index, :user_id => 1, :shop_id => 1)
775
+
776
+ user_project_edit_url = "/user/1/shop/1/project/edit/2"
777
+ get user_project_edit_url
778
+ assert_equal "edit 2 1 1", body
779
+ assert_equal user_project_edit_url, @app.url(:project, :edit, :user_id => 1, :id => 2, :shop_id => 1)
780
+
781
+ user_product_project_url = "/user/1/shop/1/product/2/project/show/3"
782
+ get user_product_project_url
783
+ assert_equal "show 3 1 2 1", body
784
+ assert_equal user_product_project_url, @app.url(:project, :show, :user_id => 1, :product_id => 2, :id => 3, :shop_id => 1)
785
+ end
786
+
787
+ should "respect map in parents with shallowing" do
788
+ mock_app do
789
+ controller :project do
790
+ parent :shop, :map => "/foo/bar"
791
+ get(:index) { "index #{params[:shop_id]}" }
792
+ end
793
+ end
794
+
795
+ shop_project_url = "/foo/bar/1/project"
796
+ get shop_project_url
797
+ assert_equal "index 1", body
798
+ assert_equal shop_project_url, @app.url(:project, :index, :shop_id => 1)
799
+ end
800
+
801
+ should "use default values" do
802
+ mock_app do
803
+ controller :lang => :it do
804
+ get(:index, :map => "/:lang") { "lang is #{params[:lang]}" }
805
+ end
806
+ assert_equal "/it", url(:index)
807
+ # This is only for be sure that default values
808
+ # work only for the given controller
809
+ get(:foo, :map => "/foo") {}
810
+ assert_equal "/foo", url(:foo)
811
+ end
812
+ get "/en"
813
+ assert_equal "lang is en", body
814
+ end
815
+
816
+ should "transitions to the next matching route on pass" do
817
+ mock_app do
818
+ get '/:foo' do
819
+ pass
820
+ 'Hello Foo'
821
+ end
822
+ get '/:bar' do
823
+ 'Hello World'
824
+ end
825
+ end
826
+
827
+ get '/za'
828
+ assert_equal 'Hello World', body
829
+ end
830
+
831
+ should "filters by accept header" do
832
+ mock_app do
833
+ get '/foo', :provides => [:xml, :js] do
834
+ request.env['HTTP_ACCEPT']
835
+ end
836
+ end
837
+
838
+ get '/foo', {}, { 'HTTP_ACCEPT' => 'application/xml' }
839
+ assert ok?
840
+ assert_equal 'application/xml', body
841
+ assert_equal 'application/xml;charset=utf-8', response.headers['Content-Type']
842
+
843
+ get '/foo.xml'
844
+ assert ok?
845
+ assert_equal 'application/xml;charset=utf-8', response.headers['Content-Type']
846
+
847
+ get '/foo', {}, { 'HTTP_ACCEPT' => 'application/javascript' }
848
+ assert ok?
849
+ assert_equal 'application/javascript', body
850
+ assert_equal 'application/javascript;charset=utf-8', response.headers['Content-Type']
851
+
852
+ get '/foo.js'
853
+ assert ok?
854
+ assert_equal 'application/javascript;charset=utf-8', response.headers['Content-Type']
855
+
856
+ get '/foo', {}, { "HTTP_ACCEPT" => 'text/html' }
857
+ assert_equal 406, status
858
+ end
859
+
860
+ should "works allow global provides" do
861
+ mock_app do
862
+ provides :xml
863
+
864
+ get("/foo"){ "Foo in #{content_type}" }
865
+ get("/bar"){ "Bar in #{content_type}" }
866
+ end
867
+
868
+ get '/foo', {}, { 'HTTP_ACCEPT' => 'application/xml' }
869
+ assert_equal 'Foo in xml', body
870
+ get '/foo'
871
+ assert_equal 'Foo in xml', body
872
+
873
+ get '/bar', {}, { 'HTTP_ACCEPT' => 'application/xml' }
874
+ assert_equal 'Bar in html', body
875
+ end
876
+
877
+ should "set content_type to :html for both empty Accept as well as Accept text/html" do
878
+ mock_app do
879
+ provides :html
880
+
881
+ get("/foo"){ content_type.to_s }
882
+ end
883
+
884
+ get '/foo', {}, {}
885
+ assert_equal 'html', body
886
+
887
+ get '/foo', {}, { 'HTTP_ACCEPT' => 'text/html' }
888
+ assert_equal 'html', body
889
+ end
890
+
891
+ should "set content_type to :html if Accept */*" do
892
+ mock_app do
893
+ get("/foo", :provides => [:html, :js]) { content_type.to_s }
894
+ end
895
+ get '/foo', {}, {}
896
+ assert_equal 'html', body
897
+
898
+ get '/foo', {}, { 'HTTP_ACCEPT' => '*/*;q=0.5' }
899
+ assert_equal 'html', body
900
+ end
901
+
902
+ should "set content_type to :js if Accept includes both application/javascript and */*;q=0.5" do
903
+ mock_app do
904
+ get("/foo", :provides => [:html, :js]) { content_type.to_s }
905
+ end
906
+ get '/foo', {}, { 'HTTP_ACCEPT' => 'application/javascript, */*;q=0.5' }
907
+ assert_equal 'js', body
908
+ end
909
+
910
+ should 'allows custom route-conditions to be set via route options and halt' do
911
+ protector = Module.new do
912
+ def protect(*args)
913
+ condition {
914
+ unless authorize(params["user"], params["password"])
915
+ halt 403, "go away"
916
+ end
917
+ }
918
+ end
919
+ end
920
+
921
+ mock_app do
922
+ register protector
923
+
924
+ helpers do
925
+ def authorize(username, password)
926
+ username == "foo" && password == "bar"
927
+ end
928
+ end
929
+
930
+ get "/", :protect => true do
931
+ "hey"
932
+ end
933
+ end
934
+
935
+ get "/"
936
+ assert forbidden?
937
+ assert_equal "go away", body
938
+
939
+ get "/", :user => "foo", :password => "bar"
940
+ assert ok?
941
+ assert_equal "hey", body
942
+ end
943
+
944
+ should 'allows custom route-conditions to be set via route options using two routes' do
945
+ protector = Module.new do
946
+ def protect(*args)
947
+ condition { authorize(params["user"], params["password"]) }
948
+ end
949
+ end
950
+
951
+ mock_app do
952
+ register protector
953
+
954
+ helpers do
955
+ def authorize(username, password)
956
+ username == "foo" && password == "bar"
957
+ end
958
+ end
959
+
960
+ get "/", :protect => true do
961
+ "hey"
962
+ end
963
+
964
+ get "/" do
965
+ "go away"
966
+ end
967
+ end
968
+
969
+ get "/"
970
+ assert_equal "go away", body
971
+
972
+ get "/", :user => "foo", :password => "bar"
973
+ assert ok?
974
+ assert_equal "hey", body
975
+ end
976
+
977
+ should "allow concise routing" do
978
+ mock_app do
979
+ get :index, ":id" do
980
+ params[:id]
981
+ end
982
+
983
+ get :map, "route/:id" do
984
+ params[:id]
985
+ end
986
+ end
987
+
988
+ get "/123"
989
+ assert_equal "123", body
990
+
991
+ get "/route/123"
992
+ assert_equal "123", body
993
+ end
994
+
995
+ should "allow passing & halting in before filters" do
996
+ mock_app do
997
+ controller do
998
+ before { env['QUERY_STRING'] == 'secret' or pass }
999
+ get :index do
1000
+ "secret index"
1001
+ end
1002
+ end
1003
+
1004
+ controller do
1005
+ before { env['QUERY_STRING'] == 'halt' and halt 401, 'go away!' }
1006
+ get :index do
1007
+ "index"
1008
+ end
1009
+ end
1010
+ end
1011
+
1012
+ get "/?secret"
1013
+ assert_equal "secret index", body
1014
+
1015
+ get "/?halt"
1016
+ assert_equal "go away!", body
1017
+ assert_equal 401, status
1018
+
1019
+ get "/"
1020
+ assert_equal "index", body
1021
+ end
1022
+
1023
+ should 'scope filters in the given controller' do
1024
+ mock_app do
1025
+ before { @global = 'global' }
1026
+ after { @global = nil }
1027
+
1028
+ controller :foo do
1029
+ before { @foo = :foo }
1030
+ after { @foo = nil }
1031
+ get("/") { [@foo, @bar, @global].compact.join(" ") }
1032
+ end
1033
+
1034
+ get("/") { [@foo, @bar, @global].compact.join(" ") }
1035
+
1036
+ controller :bar do
1037
+ before { @bar = :bar }
1038
+ after { @bar = nil }
1039
+ get("/") { [@foo, @bar, @global].compact.join(" ") }
1040
+ end
1041
+ end
1042
+
1043
+ get "/bar"
1044
+ assert_equal "bar global", body
1045
+
1046
+ get "/foo"
1047
+ assert_equal "foo global", body
1048
+
1049
+ get "/"
1050
+ assert_equal "global", body
1051
+ end
1052
+
1053
+ should 'works with optionals params' do
1054
+ mock_app do
1055
+ get("/foo(/:bar)") { params[:bar] }
1056
+ end
1057
+
1058
+ get "/foo/bar"
1059
+ assert_equal "bar", body
1060
+
1061
+ get "/foo"
1062
+ assert_equal "", body
1063
+ end
1064
+
1065
+ should 'work with multiple dashed params' do
1066
+ mock_app do
1067
+ get "/route/:foo/:bar/:baz", :provides => :html do
1068
+ "#{params[:foo]};#{params[:bar]};#{params[:baz]}"
1069
+ end
1070
+ end
1071
+
1072
+ get "/route/foo/bar/baz"
1073
+ assert_equal 'foo;bar;baz', body
1074
+
1075
+ get "/route/foo/bar-whatever/baz"
1076
+ assert_equal 'foo;bar-whatever;baz', body
1077
+ end
1078
+
1079
+ should 'work with arbitrary params' do
1080
+ mock_app do
1081
+ get(:testing) { params[:foo] }
1082
+ end
1083
+
1084
+ url = @app.url(:testing, :foo => 'bar')
1085
+ assert_equal "/testing?foo=bar", url
1086
+ get url
1087
+ assert_equal "bar", body
1088
+ end
1089
+
1090
+ should 'ignore nil params' do
1091
+ mock_app do
1092
+ get(:testing, :provides => [:html, :json]) do
1093
+ end
1094
+ end
1095
+ assert_equal '/testing.html', @app.url(:testing, :format => :html)
1096
+ assert_equal '/testing', @app.url(:testing, :format => nil)
1097
+ end
1098
+
1099
+ should 'be able to access params in a before filter' do
1100
+ username_from_before_filter = nil
1101
+
1102
+ mock_app do
1103
+ before do
1104
+ username_from_before_filter = params[:username]
1105
+ end
1106
+
1107
+ get :users, :with => :username do
1108
+ end
1109
+ end
1110
+ get '/users/josh'
1111
+ assert_equal 'josh', username_from_before_filter
1112
+ end
1113
+
1114
+ should "be able to access params normally when a before filter is specified" do
1115
+ mock_app do
1116
+ before { }
1117
+ get :index do
1118
+ params.inspect
1119
+ end
1120
+ end
1121
+ get '/?test=what'
1122
+ assert_equal '{"test"=>"what"}', body
1123
+ end
1124
+
1125
+ should 'work with controller and arbitrary params' do
1126
+ mock_app do
1127
+ get(:testing) { params[:foo] }
1128
+ controller :test1 do
1129
+ get(:url1) { params[:foo] }
1130
+ get(:url2, :provides => [:html, :json]) { params[:foo] }
1131
+ end
1132
+ end
1133
+
1134
+ url = @app.url(:test1, :url1, :foo => 'bar1')
1135
+ assert_equal "/test1/url1?foo=bar1", url
1136
+ get url
1137
+ assert_equal "bar1", body
1138
+
1139
+ url = @app.url(:test1, :url2, :foo => 'bar2')
1140
+ assert_equal "/test1/url2?foo=bar2", url
1141
+ get url
1142
+ assert_equal "bar2", body
1143
+ end
1144
+
1145
+ should "parse two routes with the same path but different http verbs" do
1146
+ mock_app do
1147
+ get(:index) { "This is the get index" }
1148
+ post(:index) { "This is the post index" }
1149
+ end
1150
+ get "/"
1151
+ assert_equal "This is the get index", body
1152
+ post "/"
1153
+ assert_equal "This is the post index", body
1154
+ end
1155
+
1156
+ should "use optionals params" do
1157
+ mock_app do
1158
+ get(:index, :map => "/(:foo(/:bar))") { "#{params[:foo]}-#{params[:bar]}" }
1159
+ end
1160
+ get "/foo"
1161
+ assert_equal "foo-", body
1162
+ get "/foo/bar"
1163
+ assert_equal "foo-bar", body
1164
+ end
1165
+
1166
+ should "parse two routes with the same path but different http verbs and provides" do
1167
+ mock_app do
1168
+ get(:index, :provides => [:html, :json]) { "This is the get index.#{content_type}" }
1169
+ post(:index, :provides => [:html, :json]) { "This is the post index.#{content_type}" }
1170
+ end
1171
+ get "/"
1172
+ assert_equal "This is the get index.html", body
1173
+ post "/"
1174
+ assert_equal "This is the post index.html", body
1175
+ get "/.json"
1176
+ assert_equal "This is the get index.json", body
1177
+ get "/.js"
1178
+ assert_equal 405, status
1179
+ post "/.json"
1180
+ assert_equal "This is the post index.json", body
1181
+ post "/.js"
1182
+ assert_equal 405, status
1183
+ end
1184
+
1185
+ should "allow controller level mapping" do
1186
+ mock_app do
1187
+ controller :map => "controller-:id" do
1188
+ get(:url3) { "#{params[:id]}" }
1189
+ get(:url4, :map => 'test-:id2') { "#{params[:id]}, #{params[:id2]}" }
1190
+ end
1191
+ end
1192
+
1193
+ url = @app.url(:url3, :id => 1)
1194
+ assert_equal "/controller-1/url3", url
1195
+ get url
1196
+ assert_equal "1", body
1197
+
1198
+ url = @app.url(:url4, 1, 2)
1199
+ assert_equal "/controller-1/test-2", url
1200
+ get url
1201
+ assert_equal "1, 2", body
1202
+ end
1203
+
1204
+ should 'use absolute and relative maps' do
1205
+ mock_app do
1206
+ controller :one do
1207
+ parent :three
1208
+ get :index, :map => 'one' do; end
1209
+ get :index2, :map => '/one' do; end
1210
+ end
1211
+
1212
+ controller :two, :map => 'two' do
1213
+ parent :three
1214
+ get :index, :map => 'two' do; end
1215
+ get :index2, :map => '/two', :with => :id do; end
1216
+ end
1217
+ end
1218
+ assert_equal "/three/three_id/one", @app.url(:one, :index, 'three_id')
1219
+ assert_equal "/one", @app.url(:one, :index2)
1220
+ assert_equal "/two/three/three_id/two", @app.url(:two, :index, 'three_id')
1221
+ assert_equal "/two/four_id", @app.url(:two, :index2, 'four_id')
1222
+ end
1223
+
1224
+ should "work with params and parent options" do
1225
+ mock_app do
1226
+ controller :test2, :parent => :parent1, :parent1_id => 1 do
1227
+ get(:url3) { params[:foo] }
1228
+ get(:url4, :with => :with1) { params[:foo] }
1229
+ get(:url5, :with => :with2, :provides => [:html]) { params[:foo] }
1230
+ end
1231
+ end
1232
+
1233
+ url = @app.url(:test2, :url3, :foo => 'bar3')
1234
+ assert_equal "/parent1/1/test2/url3?foo=bar3", url
1235
+ get url
1236
+ assert_equal "bar3", body
1237
+
1238
+ url = @app.url(:test2, :url4, :with1 => 'awith1', :foo => 'bar4')
1239
+ assert_equal "/parent1/1/test2/url4/awith1?foo=bar4", url
1240
+ get url
1241
+ assert_equal "bar4", body
1242
+
1243
+ url = @app.url(:test2, :url5, :with2 => 'awith1', :foo => 'bar5')
1244
+ assert_equal "/parent1/1/test2/url5/awith1?foo=bar5", url
1245
+ get url
1246
+ assert_equal "bar5", body
1247
+ end
1248
+
1249
+ should "parse params without explicit provides for every matching route" do
1250
+ mock_app do
1251
+ get(:index, :map => "/foos/:bar") { "get bar = #{params[:bar]}" }
1252
+ post :create, :map => "/foos/:bar", :provides => [:html, :js] do
1253
+ "post bar = #{params[:bar]}"
1254
+ end
1255
+ end
1256
+
1257
+ get "/foos/hello"
1258
+ assert_equal "get bar = hello", body
1259
+ post "/foos/hello"
1260
+ assert_equal "post bar = hello", body
1261
+ post "/foos/hello.js"
1262
+ assert_equal "post bar = hello", body
1263
+ end
1264
+
1265
+ should "properly route to first foo with two similar routes" do
1266
+ mock_app do
1267
+ controllers do
1268
+ get('/foo/') { "this is foo" }
1269
+ get(:show, :map => "/foo/:bar/:id") { "/foo/#{params[:bar]}/#{params[:id]}" }
1270
+ end
1271
+ end
1272
+ get "/foo"
1273
+ assert_equal "this is foo", body
1274
+ get "/foo/"
1275
+ assert_equal "this is foo", body
1276
+ get '/foo/5/10'
1277
+ assert_equal "/foo/5/10", body
1278
+ end
1279
+
1280
+ should "index routes should be optional when nested" do
1281
+ mock_app do
1282
+ controller '/users', :provides => [:json] do
1283
+ get '/' do
1284
+ "foo"
1285
+ end
1286
+ end
1287
+ end
1288
+ get "/users.json"
1289
+ assert_equal "foo", body
1290
+ end
1291
+
1292
+ should "use provides as conditional" do
1293
+ mock_app do
1294
+ provides :json
1295
+ get "/" do
1296
+ "foo"
1297
+ end
1298
+ end
1299
+ get "/.json"
1300
+ assert_equal "foo", body
1301
+ end
1302
+
1303
+ should "pass controller conditions to each route" do
1304
+ counter = 0
1305
+
1306
+ mock_app do
1307
+ self.class.send(:define_method, :increment!) do |*args|
1308
+ condition { counter += 1 }
1309
+ end
1310
+
1311
+ controller :posts, :conditions => {:increment! => true} do
1312
+ get("/foo") { "foo" }
1313
+ get("/bar") { "bar" }
1314
+ end
1315
+
1316
+ end
1317
+
1318
+ get "/posts/foo"
1319
+ get "/posts/bar"
1320
+ assert_equal 2, counter
1321
+ end
1322
+
1323
+ should "allow controller conditions to be overridden" do
1324
+ counter = 0
1325
+
1326
+ mock_app do
1327
+ self.class.send(:define_method, :increment!) do |increment|
1328
+ condition { counter += 1 } if increment
1329
+ end
1330
+
1331
+ controller :posts, :conditions => {:increment! => true} do
1332
+ get("/foo") { "foo" }
1333
+ get("/bar", :increment! => false) { "bar" }
1334
+ end
1335
+
1336
+ end
1337
+
1338
+ get "/posts/foo"
1339
+ get "/posts/bar"
1340
+ assert_equal 1, counter
1341
+ end
1342
+
1343
+ should "parse params with class level provides" do
1344
+ mock_app do
1345
+ controllers :posts, :provides => [:html, :js] do
1346
+ post(:create, :map => "/foo/:bar/:baz/:id") {
1347
+ "POST CREATE #{params[:bar]} - #{params[:baz]} - #{params[:id]}"
1348
+ }
1349
+ end
1350
+ controllers :topics, :provides => [:js, :html] do
1351
+ get(:show, :map => "/foo/:bar/:baz/:id") { render "topics/show" }
1352
+ post(:create, :map => "/foo/:bar/:baz") { "TOPICS CREATE #{params[:bar]} - #{params[:baz]}" }
1353
+ end
1354
+ end
1355
+ post "/foo/bar/baz.js"
1356
+ assert_equal "TOPICS CREATE bar - baz", body, "should parse params with explicit .js"
1357
+ post @app.url(:topics, :create, :format => :js, :bar => 'bar', :baz => 'baz')
1358
+ assert_equal "TOPICS CREATE bar - baz", body, "should parse params from generated url"
1359
+ post "/foo/bar/baz/5.js"
1360
+ assert_equal "POST CREATE bar - baz - 5", body
1361
+ post @app.url(:posts, :create, :format => :js, :bar => 'bar', :baz => 'baz', :id => 5)
1362
+ assert_equal "POST CREATE bar - baz - 5", body
1363
+ end
1364
+
1365
+ should "parse params properly with inline provides" do
1366
+ mock_app do
1367
+ controllers :posts do
1368
+ post(:create, :map => "/foo/:bar/:baz/:id", :provides => [:html, :js]) {
1369
+ "POST CREATE #{params[:bar]} - #{params[:baz]} - #{params[:id]}"
1370
+ }
1371
+ end
1372
+ controllers :topics do
1373
+ get(:show, :map => "/foo/:bar/:baz/:id", :provides => [:html, :js]) { render "topics/show" }
1374
+ post(:create, :map => "/foo/:bar/:baz", :provides => [:html, :js]) { "TOPICS CREATE #{params[:bar]} - #{params[:baz]}" }
1375
+ end
1376
+ end
1377
+ post @app.url(:topics, :create, :format => :js, :bar => 'bar', :baz => 'baz')
1378
+ assert_equal "TOPICS CREATE bar - baz", body, "should properly post to topics create action"
1379
+ post @app.url(:posts, :create, :format => :js, :bar => 'bar', :baz => 'baz', :id => 5)
1380
+ assert_equal "POST CREATE bar - baz - 5", body, "should properly post to create action"
1381
+ end
1382
+
1383
+ should "have overideable format" do
1384
+ mock_app do
1385
+ ::Rack::Mime::MIME_TYPES[".other"] = "text/html"
1386
+ before do
1387
+ params[:format] ||= :other
1388
+ end
1389
+ get("/format_test", :provides => [:html, :other]){ content_type.to_s }
1390
+ end
1391
+ get "/format_test"
1392
+ assert_equal "other", body
1393
+ end
1394
+
1395
+ should 'invokes handlers registered with ::error when raised' do
1396
+ mock_app do
1397
+ set :raise_errors, false
1398
+ error(FooError) { 'Foo!' }
1399
+ get '/' do
1400
+ raise FooError
1401
+ end
1402
+ end
1403
+ get '/'
1404
+ assert_equal 500, status
1405
+ assert_equal 'Foo!', body
1406
+ end
1407
+
1408
+ should 'have MethodOverride middleware' do
1409
+ mock_app do
1410
+ put('/') { 'okay' }
1411
+ end
1412
+ post '/', {'_method'=>'PUT'}, {}
1413
+ assert_equal 200, status
1414
+ assert_equal 'okay', body
1415
+ end
1416
+
1417
+ should 'parse nested params' do
1418
+ mock_app do
1419
+ get(:index) { "%s %s" % [params[:account][:name], params[:account][:surname]] }
1420
+ end
1421
+ get "/?account[name]=foo&account[surname]=bar"
1422
+ assert_equal 'foo bar', body
1423
+ get @app.url(:index, "account[name]" => "foo", "account[surname]" => "bar")
1424
+ assert_equal 'foo bar', body
1425
+ end
1426
+
1427
+ should 'render sinatra NotFound page' do
1428
+ mock_app { set :environment, :development }
1429
+ get "/"
1430
+ assert_equal 404, status
1431
+ assert_match /Sinatra doesn&rsquo;t know this ditty./, body
1432
+ end
1433
+
1434
+ should 'render a custom NotFound page' do
1435
+ mock_app do
1436
+ error(Sinatra::NotFound) { "not found" }
1437
+ end
1438
+ get "/"
1439
+ assert_equal 404, status
1440
+ assert_match /not found/, body
1441
+ end
1442
+
1443
+ should 'render a custom 404 page' do
1444
+ mock_app do
1445
+ error(404) { "not found" }
1446
+ end
1447
+ get "/"
1448
+ assert_equal 404, status
1449
+ assert_match /not found/, body
1450
+ end
1451
+
1452
+ should 'recognize paths' do
1453
+ mock_app do
1454
+ controller :foo do
1455
+ get(:bar, :map => "/my/:id/custom-route") { }
1456
+ end
1457
+ get(:simple, :map => "/simple/:id") { }
1458
+ get(:with_format, :with => :id, :provides => :js) { }
1459
+ end
1460
+ assert_equal [:foo_bar, { :id => "fantastic" }], @app.recognize_path(@app.url(:foo, :bar, :id => :fantastic))
1461
+ assert_equal [:foo_bar, { :id => "18" }], @app.recognize_path(@app.url(:foo, :bar, :id => 18))
1462
+ assert_equal [:simple, { :id => "bar" }], @app.recognize_path(@app.url(:simple, :id => "bar"))
1463
+ assert_equal [:simple, { :id => "true" }], @app.recognize_path(@app.url(:simple, :id => true))
1464
+ assert_equal [:simple, { :id => "9" }], @app.recognize_path(@app.url(:simple, :id => 9))
1465
+ assert_equal [:with_format, { :id => "bar", :format => "js" }], @app.recognize_path(@app.url(:with_format, :id => "bar", :format => :js))
1466
+ assert_equal [:with_format, { :id => "true", :format => "js" }], @app.recognize_path(@app.url(:with_format, :id => true, :format => "js"))
1467
+ assert_equal [:with_format, { :id => "9", :format => "js" }], @app.recognize_path(@app.url(:with_format, :id => 9, :format => :js))
1468
+ end
1469
+
1470
+ should 'have current_path' do
1471
+ mock_app do
1472
+ controller :foo do
1473
+ get :bar, :map => "/paginate/:page" do
1474
+ current_path
1475
+ end
1476
+ end
1477
+ end
1478
+ get @app.url(:foo, :bar, :page => 10)
1479
+ assert_equal "/paginate/10", body
1480
+ end
1481
+
1482
+ should 'change params in current_path' do
1483
+ mock_app do
1484
+ get :index, :map => "/paginate/:page" do
1485
+ current_path(:page => 66)
1486
+ end
1487
+ end
1488
+ get @app.url(:index, :page => 10)
1489
+ assert_equal "/paginate/66", body
1490
+ end
1491
+ end