/railties/test/application/routing_test.rb

https://github.com/josefrichter/docrails · Ruby · 261 lines · 212 code · 47 blank · 2 comment · 0 complexity · 1b6c0040b1fe0470c0c3ecafd3a84186 MD5 · raw file

  1. require 'isolation/abstract_unit'
  2. module ApplicationTests
  3. class RoutingTest < Test::Unit::TestCase
  4. include ActiveSupport::Testing::Isolation
  5. def setup
  6. build_app
  7. boot_rails
  8. require 'rack/test'
  9. extend Rack::Test::Methods
  10. end
  11. def app(env = "production")
  12. old_env = ENV["RAILS_ENV"]
  13. @app ||= begin
  14. ENV["RAILS_ENV"] = env
  15. require "#{app_path}/config/environment"
  16. Rails.application
  17. end
  18. ensure
  19. ENV["RAILS_ENV"] = old_env
  20. end
  21. def simple_controller
  22. controller :foo, <<-RUBY
  23. class FooController < ApplicationController
  24. def index
  25. render :text => "foo"
  26. end
  27. end
  28. RUBY
  29. app_file 'config/routes.rb', <<-RUBY
  30. AppTemplate::Application.routes.draw do
  31. match ':controller(/:action)'
  32. end
  33. RUBY
  34. end
  35. test "rails/info/properties in development" do
  36. app("development")
  37. get "/rails/info/properties"
  38. assert_equal 200, last_response.status
  39. end
  40. test "rails/info/properties in production" do
  41. app("production")
  42. get "/rails/info/properties"
  43. assert_equal 404, last_response.status
  44. end
  45. test "simple controller" do
  46. simple_controller
  47. get '/foo'
  48. assert_equal 'foo', last_response.body
  49. end
  50. test "simple controller in production mode returns best standards" do
  51. simple_controller
  52. get '/foo'
  53. assert_equal "IE=Edge,chrome=1", last_response.headers["X-UA-Compatible"]
  54. end
  55. test "simple controller in development mode leaves out Chrome" do
  56. simple_controller
  57. app("development")
  58. get "/foo"
  59. assert_equal "IE=Edge", last_response.headers["X-UA-Compatible"]
  60. end
  61. test "simple controller with helper" do
  62. controller :foo, <<-RUBY
  63. class FooController < ApplicationController
  64. def index
  65. render :inline => "<%= foo_or_bar? %>"
  66. end
  67. end
  68. RUBY
  69. app_file 'app/helpers/bar_helper.rb', <<-RUBY
  70. module BarHelper
  71. def foo_or_bar?
  72. "bar"
  73. end
  74. end
  75. RUBY
  76. app_file 'config/routes.rb', <<-RUBY
  77. AppTemplate::Application.routes.draw do
  78. match ':controller(/:action)'
  79. end
  80. RUBY
  81. get '/foo'
  82. assert_equal 'bar', last_response.body
  83. end
  84. test "mount rack app" do
  85. app_file 'config/routes.rb', <<-RUBY
  86. AppTemplate::Application.routes.draw do
  87. mount lambda { |env| [200, {}, [env["PATH_INFO"]]] }, :at => "/blog"
  88. # The line below is required because mount sometimes
  89. # fails when a resource route is added.
  90. resource :user
  91. end
  92. RUBY
  93. get '/blog/archives'
  94. assert_equal '/archives', last_response.body
  95. end
  96. test "multiple controllers" do
  97. controller :foo, <<-RUBY
  98. class FooController < ApplicationController
  99. def index
  100. render :text => "foo"
  101. end
  102. end
  103. RUBY
  104. controller :bar, <<-RUBY
  105. class BarController < ActionController::Base
  106. def index
  107. render :text => "bar"
  108. end
  109. end
  110. RUBY
  111. app_file 'config/routes.rb', <<-RUBY
  112. AppTemplate::Application.routes.draw do
  113. match ':controller(/:action)'
  114. end
  115. RUBY
  116. get '/foo'
  117. assert_equal 'foo', last_response.body
  118. get '/bar'
  119. assert_equal 'bar', last_response.body
  120. end
  121. test "nested controller" do
  122. controller 'foo', <<-RUBY
  123. class FooController < ApplicationController
  124. def index
  125. render :text => "foo"
  126. end
  127. end
  128. RUBY
  129. controller 'admin/foo', <<-RUBY
  130. module Admin
  131. class FooController < ApplicationController
  132. def index
  133. render :text => "admin::foo"
  134. end
  135. end
  136. end
  137. RUBY
  138. app_file 'config/routes.rb', <<-RUBY
  139. AppTemplate::Application.routes.draw do
  140. match 'admin/foo', :to => 'admin/foo#index'
  141. match 'foo', :to => 'foo#index'
  142. end
  143. RUBY
  144. get '/foo'
  145. assert_equal 'foo', last_response.body
  146. get '/admin/foo'
  147. assert_equal 'admin::foo', last_response.body
  148. end
  149. {"development" => "baz", "production" => "bar"}.each do |mode, expected|
  150. test "reloads routes when configuration is changed in #{mode}" do
  151. controller :foo, <<-RUBY
  152. class FooController < ApplicationController
  153. def bar
  154. render :text => "bar"
  155. end
  156. def baz
  157. render :text => "baz"
  158. end
  159. end
  160. RUBY
  161. app_file 'config/routes.rb', <<-RUBY
  162. AppTemplate::Application.routes.draw do
  163. match 'foo', :to => 'foo#bar'
  164. end
  165. RUBY
  166. app(mode)
  167. get '/foo'
  168. assert_equal 'bar', last_response.body
  169. app_file 'config/routes.rb', <<-RUBY
  170. AppTemplate::Application.routes.draw do
  171. match 'foo', :to => 'foo#baz'
  172. end
  173. RUBY
  174. sleep 0.1
  175. get '/foo'
  176. assert_equal expected, last_response.body
  177. end
  178. end
  179. test 'routes are loaded just after initialization' do
  180. require "#{app_path}/config/application"
  181. app_file 'config/routes.rb', <<-RUBY
  182. InitializeRackApp = lambda { |env| [200, {}, ["InitializeRackApp"]] }
  183. AppTemplate::Application.routes.draw do
  184. match 'foo', :to => ::InitializeRackApp
  185. end
  186. RUBY
  187. get '/foo'
  188. assert_equal "InitializeRackApp", last_response.body
  189. end
  190. test 'resource routing with irrigular inflection' do
  191. app_file 'config/initializers/inflection.rb', <<-RUBY
  192. ActiveSupport::Inflector.inflections do |inflect|
  193. inflect.irregular 'yazi', 'yazilar'
  194. end
  195. RUBY
  196. app_file 'config/routes.rb', <<-RUBY
  197. AppTemplate::Application.routes.draw do
  198. resources :yazilar
  199. end
  200. RUBY
  201. controller 'yazilar', <<-RUBY
  202. class YazilarController < ApplicationController
  203. def index
  204. render :text => 'yazilar#index'
  205. end
  206. end
  207. RUBY
  208. get '/yazilars'
  209. assert_equal 404, last_response.status
  210. get '/yazilar'
  211. assert_equal 200, last_response.status
  212. end
  213. end
  214. end