1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
|
# frozen_string_literal: true
require "abstract_unit"
module ActionController
class Base
include ActionController::Testing
end
end
class InfoControllerTest < ActionController::TestCase
tests Rails::InfoController
Rails.application.config.secret_key_base = "b3c631c314c0bbca50c1b2843150fe33"
def setup
Rails.application.routes.draw do
namespace :test do
get :nested_route, to: "test#show"
end
get "/rails/info/properties" => "rails/info#properties"
get "/rails/info/routes" => "rails/info#routes"
post "/rails/:test/properties" => "rails/info#properties"
put "/rails/:test/named_properties" => "rails/info#properties", as: "named_rails_info_properties"
end
@routes = Rails.application.routes
Rails::InfoController.include(@routes.url_helpers)
@request.env["REMOTE_ADDR"] = "127.0.0.1"
end
def exact_results
JSON(response.body)["exact"]
end
def fuzzy_results
JSON(response.body)["fuzzy"]
end
test "info controller does not allow remote requests" do
@request.env["REMOTE_ADDR"] = "example.org"
get :properties
assert_response :forbidden
end
test "info controller renders an error message when request was forbidden" do
@request.env["REMOTE_ADDR"] = "example.org"
get :properties
assert_select "p"
end
test "info controller allows requests when all requests are considered local" do
get :properties
assert_response :success
end
test "info controller allows local requests" do
get :properties
assert_response :success
end
test "info controller renders a table with properties" do
get :properties
assert_select "table"
end
test "info controller renders with routes" do
get :routes
assert_response :success
end
test "info controller search returns exact matches for route names" do
get :routes, params: { query: "rails_info_" }
assert exact_results.size == 0, "should not match incomplete route names"
get :routes, params: { query: "" }
assert exact_results.size == 0, "should not match unnamed routes"
get :routes, params: { query: "rails_info_properties" }
assert exact_results.size == 1, "should match complete route names"
assert exact_results.include? "/rails/info/properties(.:format)"
get :routes, params: { query: "rails_info_properties_path" }
assert exact_results.size == 1, "should match complete route paths"
assert exact_results.include? "/rails/info/properties(.:format)"
get :routes, params: { query: "rails_info_properties_url" }
assert exact_results.size == 1, "should match complete route urls"
assert exact_results.include? "/rails/info/properties(.:format)"
end
test "info controller search returns exact matches for route paths" do
get :routes, params: { query: "rails/info/route" }
assert exact_results.size == 0, "should not match incomplete route paths"
get :routes, params: { query: "/rails/info/routes" }
assert exact_results.size == 1, "should match complete route paths prefixed with /"
assert exact_results.include? "/rails/info/routes(.:format)"
get :routes, params: { query: "rails/info/routes" }
assert exact_results.size == 1, "should match complete route paths NOT prefixed with /"
assert exact_results.include? "/rails/info/routes(.:format)"
get :routes, params: { query: "rails/info/routes.html" }
assert exact_results.size == 1, "should match complete route paths with optional parts"
assert exact_results.include? "/rails/info/routes(.:format)"
get :routes, params: { query: "test/nested_route" }
assert exact_results.size == 1, "should match complete route paths that are nested in a namespace"
assert exact_results.include? "/test/nested_route(.:format)"
end
test "info controller search returns case-sensitive exact matches for HTTP Verb methods" do
get :routes, params: { query: "GE" }
assert exact_results.size == 0, "should not match incomplete HTTP Verb methods"
get :routes, params: { query: "get" }
assert exact_results.size == 0, "should not case-insensitive match HTTP Verb methods"
get :routes, params: { query: "GET" }
assert exact_results.size == 3, "should match complete HTTP Verb methods"
assert exact_results.include? "/test/nested_route(.:format)"
assert exact_results.include? "/rails/info/properties(.:format)"
assert exact_results.include? "/rails/info/routes(.:format)"
end
test "info controller search returns exact matches for route Controller#Action(s)" do
get :routes, params: { query: "rails/info#propertie" }
assert exact_results.size == 0, "should not match incomplete route Controller#Action(s)"
get :routes, params: { query: "rails/info#properties" }
assert exact_results.size == 3, "should match complete route Controller#Action(s)"
assert exact_results.include? "/rails/info/properties(.:format)"
assert exact_results.include? "/rails/:test/properties(.:format)"
assert exact_results.include? "/rails/:test/named_properties(.:format)"
end
test "info controller returns fuzzy matches for route names" do
get :routes, params: { query: "" }
assert exact_results.size == 0, "should not match unnamed routes"
get :routes, params: { query: "rails_info" }
assert fuzzy_results.size == 3, "should match incomplete route names"
assert fuzzy_results.include? "/rails/info/properties(.:format)"
assert fuzzy_results.include? "/rails/info/routes(.:format)"
assert fuzzy_results.include? "/rails/:test/named_properties(.:format)"
get :routes, params: { query: "/rails/info/routes" }
assert fuzzy_results.size == 1, "should match complete route names"
assert fuzzy_results.include? "/rails/info/routes(.:format)"
get :routes, params: { query: "named_rails_info_properties_path" }
assert fuzzy_results.size == 1, "should match complete route paths"
assert fuzzy_results.include? "/rails/:test/named_properties(.:format)"
get :routes, params: { query: "named_rails_info_properties_url" }
assert fuzzy_results.size == 1, "should match complete route urls"
assert fuzzy_results.include? "/rails/:test/named_properties(.:format)"
end
test "info controller returns fuzzy matches for route paths" do
get :routes, params: { query: "rails/:test" }
assert fuzzy_results.size == 2, "should match incomplete routes"
assert fuzzy_results.include? "/rails/:test/properties(.:format)"
assert fuzzy_results.include? "/rails/:test/named_properties(.:format)"
get :routes, params: { query: "/rails/info/routes" }
assert fuzzy_results.size == 1, "should match complete routes"
assert fuzzy_results.include? "/rails/info/routes(.:format)"
get :routes, params: { query: "rails/info/routes.html" }
assert fuzzy_results.size == 0, "should match optional parts of route literally"
end
# Intentionally ignoring fuzzy match of HTTP Verb methods. There's not much value to 'GE' returning 'GET' results.
test "info controller search returns fuzzy matches for route Controller#Action(s)" do
get :routes, params: { query: "rails/info#propertie" }
assert fuzzy_results.size == 3, "should match incomplete routes"
assert fuzzy_results.include? "/rails/info/properties(.:format)"
assert fuzzy_results.include? "/rails/:test/properties(.:format)"
assert fuzzy_results.include? "/rails/:test/named_properties(.:format)"
get :routes, params: { query: "rails/info#properties" }
assert fuzzy_results.size == 3, "should match complete route Controller#Action(s)"
assert fuzzy_results.include? "/rails/info/properties(.:format)"
assert fuzzy_results.include? "/rails/:test/properties(.:format)"
assert fuzzy_results.include? "/rails/:test/named_properties(.:format)"
end
test "internal routes do not have a default params[:internal] value" do
get :properties
assert_response :success
assert_nil @controller.params[:internal]
end
end
|