2017-07-01 16:09:13 -04:00
|
|
|
# frozen_string_literal: true
|
2017-07-10 09:47:31 -04:00
|
|
|
|
2017-05-15 10:17:28 -04:00
|
|
|
$:.unshift File.expand_path("lib", __dir__)
|
|
|
|
$:.unshift File.expand_path("fixtures/helpers", __dir__)
|
|
|
|
$:.unshift File.expand_path("fixtures/alternate_helpers", __dir__)
|
2004-11-23 20:04:44 -05:00
|
|
|
|
2016-08-06 12:54:50 -04:00
|
|
|
require "active_support/core_ext/kernel/reporting"
|
2010-08-22 17:43:31 -04:00
|
|
|
|
2011-12-24 07:57:54 -05:00
|
|
|
# These are the normal settings that will be set up by Railties
|
|
|
|
# TODO: Have these tests support other combinations of these values
|
|
|
|
silence_warnings do
|
2017-01-11 03:48:00 -05:00
|
|
|
Encoding.default_internal = Encoding::UTF_8
|
|
|
|
Encoding.default_external = Encoding::UTF_8
|
2010-05-17 11:41:54 -04:00
|
|
|
end
|
|
|
|
|
2016-08-06 12:54:50 -04:00
|
|
|
if ENV["TRAVIS"]
|
2016-01-12 18:55:47 -05:00
|
|
|
PROCESS_COUNT = 0
|
|
|
|
else
|
2016-08-06 12:54:50 -04:00
|
|
|
PROCESS_COUNT = (ENV["N"] || 4).to_i
|
2016-01-12 18:55:47 -05:00
|
|
|
end
|
2014-07-23 13:38:41 -04:00
|
|
|
|
2016-08-06 12:54:50 -04:00
|
|
|
require "active_support/testing/autorun"
|
|
|
|
require "abstract_controller"
|
|
|
|
require "abstract_controller/railties/routes_helpers"
|
|
|
|
require "action_controller"
|
|
|
|
require "action_view"
|
|
|
|
require "action_view/testing/resolvers"
|
|
|
|
require "action_dispatch"
|
|
|
|
require "active_support/dependencies"
|
|
|
|
require "active_model"
|
2009-12-16 12:56:51 -05:00
|
|
|
|
2016-08-06 12:54:50 -04:00
|
|
|
require "pp" # require 'pp' early to prevent hidden_methods from not picking up the pretty-print methods until too late
|
2009-09-19 13:10:41 -04:00
|
|
|
|
2010-06-27 17:53:06 -04:00
|
|
|
module Rails
|
2010-10-22 10:34:45 -04:00
|
|
|
class << self
|
|
|
|
def env
|
2015-03-20 11:14:11 -04:00
|
|
|
@_env ||= ActiveSupport::StringInquirer.new(ENV["RAILS_ENV"] || ENV["RACK_ENV"] || "test")
|
2010-10-22 10:34:45 -04:00
|
|
|
end
|
2015-08-24 18:03:47 -04:00
|
|
|
|
2017-10-28 04:39:58 -04:00
|
|
|
def root; end
|
2010-10-22 10:34:45 -04:00
|
|
|
end
|
2010-06-27 17:53:06 -04:00
|
|
|
end
|
|
|
|
|
2009-06-15 14:44:45 -04:00
|
|
|
ActiveSupport::Dependencies.hook!
|
2009-05-20 19:52:56 -04:00
|
|
|
|
2013-01-24 05:10:58 -05:00
|
|
|
Thread.abort_on_exception = true
|
|
|
|
|
2006-09-03 23:38:13 -04:00
|
|
|
# Show backtraces for deprecated behavior for quicker cleanup.
|
|
|
|
ActiveSupport::Deprecation.debug = true
|
|
|
|
|
2013-12-16 13:04:07 -05:00
|
|
|
# Disable available locale checks to avoid warnings running the test suite.
|
|
|
|
I18n.enforce_available_locales = false
|
|
|
|
|
2017-05-15 10:17:28 -04:00
|
|
|
FIXTURE_LOAD_PATH = File.join(__dir__, "fixtures")
|
2009-06-15 14:44:45 -04:00
|
|
|
|
2010-02-24 19:01:03 -05:00
|
|
|
SharedTestRoutes = ActionDispatch::Routing::RouteSet.new
|
|
|
|
|
2015-08-08 10:15:35 -04:00
|
|
|
SharedTestRoutes.draw do
|
2016-03-01 03:48:53 -05:00
|
|
|
ActiveSupport::Deprecation.silence do
|
2016-08-06 12:54:50 -04:00
|
|
|
get ":controller(/:action)"
|
2016-03-01 03:48:53 -05:00
|
|
|
end
|
2015-08-08 10:15:35 -04:00
|
|
|
end
|
|
|
|
|
2012-08-09 17:30:26 -04:00
|
|
|
module ActionDispatch
|
|
|
|
module SharedRoutes
|
|
|
|
def before_setup
|
|
|
|
@routes = SharedTestRoutes
|
|
|
|
super
|
|
|
|
end
|
|
|
|
end
|
2009-10-04 00:55:35 -04:00
|
|
|
end
|
|
|
|
|
2012-08-09 17:46:57 -04:00
|
|
|
module ActiveSupport
|
|
|
|
class TestCase
|
2015-02-27 08:16:48 -05:00
|
|
|
if RUBY_ENGINE == "ruby" && PROCESS_COUNT > 0
|
2018-11-28 02:10:14 -05:00
|
|
|
parallelize(workers: PROCESS_COUNT)
|
2014-07-23 13:38:41 -04:00
|
|
|
end
|
2012-08-09 17:46:57 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2010-02-24 19:01:03 -05:00
|
|
|
class RoutedRackApp
|
2010-03-30 15:05:42 -04:00
|
|
|
attr_reader :routes
|
2010-02-24 19:01:03 -05:00
|
|
|
|
2010-03-30 15:05:42 -04:00
|
|
|
def initialize(routes, &blk)
|
|
|
|
@routes = routes
|
|
|
|
@stack = ActionDispatch::MiddlewareStack.new(&blk).build(@routes)
|
2010-02-24 19:01:03 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def call(env)
|
|
|
|
@stack.call(env)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2010-04-24 18:17:30 -04:00
|
|
|
class ActionDispatch::IntegrationTest < ActiveSupport::TestCase
|
2009-10-03 21:45:49 -04:00
|
|
|
def self.build_app(routes = nil)
|
2018-10-03 17:15:47 -04:00
|
|
|
RoutedRackApp.new(routes || ActionDispatch::Routing::RouteSet.new) do |middleware|
|
2015-08-07 17:26:21 -04:00
|
|
|
middleware.use ActionDispatch::ShowExceptions, ActionDispatch::PublicExceptions.new("#{FIXTURE_LOAD_PATH}/public")
|
|
|
|
middleware.use ActionDispatch::DebugExceptions
|
2018-12-28 07:21:30 -05:00
|
|
|
middleware.use ActionDispatch::ActionableExceptions
|
2015-08-07 17:26:21 -04:00
|
|
|
middleware.use ActionDispatch::Callbacks
|
|
|
|
middleware.use ActionDispatch::Cookies
|
|
|
|
middleware.use ActionDispatch::Flash
|
2016-08-05 14:20:21 -04:00
|
|
|
middleware.use Rack::MethodOverride
|
2015-08-07 17:26:21 -04:00
|
|
|
middleware.use Rack::Head
|
2010-05-17 19:43:06 -04:00
|
|
|
yield(middleware) if block_given?
|
2010-02-24 19:01:03 -05:00
|
|
|
end
|
2009-10-03 21:45:49 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
self.app = build_app
|
|
|
|
|
2015-08-08 10:15:35 -04:00
|
|
|
app.routes.draw do
|
2016-03-01 03:48:53 -05:00
|
|
|
ActiveSupport::Deprecation.silence do
|
2016-08-06 12:54:50 -04:00
|
|
|
get ":controller(/:action)"
|
2016-03-01 03:48:53 -05:00
|
|
|
end
|
2015-08-08 10:15:35 -04:00
|
|
|
end
|
|
|
|
|
2015-08-24 16:45:07 -04:00
|
|
|
class DeadEndRoutes < ActionDispatch::Routing::RouteSet
|
|
|
|
# Stub Rails dispatcher so it does not get controller references and
|
|
|
|
# simply return the controller#action as Rack::Body.
|
2015-08-25 21:35:44 -04:00
|
|
|
class NullController < ::ActionController::Metal
|
2016-08-09 13:35:59 -04:00
|
|
|
def self.dispatch(action, req, res)
|
2016-08-16 03:30:11 -04:00
|
|
|
[200, { "Content-Type" => "text/html" }, ["#{req.params[:controller]}##{action}"]]
|
2015-08-24 16:45:07 -04:00
|
|
|
end
|
2010-07-02 13:13:00 -04:00
|
|
|
end
|
|
|
|
|
2016-08-09 13:35:59 -04:00
|
|
|
class NullControllerRequest < ActionDispatch::Request
|
2015-08-24 16:45:07 -04:00
|
|
|
def controller_class
|
2016-08-09 13:35:59 -04:00
|
|
|
NullController
|
2015-08-24 16:45:07 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-08-06 14:20:22 -04:00
|
|
|
def make_request(env)
|
2016-08-09 13:35:59 -04:00
|
|
|
NullControllerRequest.new env
|
2009-10-27 20:48:35 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2015-08-24 16:45:07 -04:00
|
|
|
def self.stub_controllers(config = ActionDispatch::Routing::RouteSet::DEFAULT_CONFIG)
|
|
|
|
yield DeadEndRoutes.new(config)
|
2009-10-27 20:48:35 -04:00
|
|
|
end
|
|
|
|
|
2009-10-03 21:45:49 -04:00
|
|
|
def with_routing(&block)
|
2010-02-21 11:21:25 -05:00
|
|
|
temporary_routes = ActionDispatch::Routing::RouteSet.new
|
2010-02-24 19:01:03 -05:00
|
|
|
old_app, self.class.app = self.class.app, self.class.build_app(temporary_routes)
|
|
|
|
old_routes = SharedTestRoutes
|
|
|
|
silence_warnings { Object.const_set(:SharedTestRoutes, temporary_routes) }
|
2009-10-03 21:45:49 -04:00
|
|
|
|
|
|
|
yield temporary_routes
|
|
|
|
ensure
|
2010-02-24 19:01:03 -05:00
|
|
|
self.class.app = old_app
|
2016-08-07 19:05:28 -04:00
|
|
|
remove!
|
2010-02-24 19:01:03 -05:00
|
|
|
silence_warnings { Object.const_set(:SharedTestRoutes, old_routes) }
|
2009-10-03 21:45:49 -04:00
|
|
|
end
|
2010-06-27 14:35:31 -04:00
|
|
|
|
|
|
|
def with_autoload_path(path)
|
2017-05-15 10:17:28 -04:00
|
|
|
path = File.join(__dir__, "fixtures", path)
|
2010-06-27 14:35:31 -04:00
|
|
|
if ActiveSupport::Dependencies.autoload_paths.include?(path)
|
|
|
|
yield
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
ActiveSupport::Dependencies.autoload_paths << path
|
|
|
|
yield
|
|
|
|
ensure
|
2016-08-16 03:30:11 -04:00
|
|
|
ActiveSupport::Dependencies.autoload_paths.reject! { |p| p == path }
|
2010-06-27 14:35:31 -04:00
|
|
|
ActiveSupport::Dependencies.clear
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2009-06-15 14:44:45 -04:00
|
|
|
end
|
|
|
|
|
2009-09-19 13:10:41 -04:00
|
|
|
# Temporary base class
|
2010-09-24 20:15:52 -04:00
|
|
|
class Rack::TestCase < ActionDispatch::IntegrationTest
|
2009-09-19 13:10:41 -04:00
|
|
|
def self.testing(klass = nil)
|
|
|
|
if klass
|
2017-07-01 16:09:13 -04:00
|
|
|
@testing = "/#{klass.name.underscore}".sub(/_controller$/, "")
|
2009-09-19 13:10:41 -04:00
|
|
|
else
|
|
|
|
@testing
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def get(thing, *args)
|
|
|
|
if thing.is_a?(Symbol)
|
|
|
|
super("#{self.class.testing}/#{thing}", *args)
|
|
|
|
else
|
|
|
|
super
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def assert_body(body)
|
2012-01-05 15:18:54 -05:00
|
|
|
assert_equal body, Array(response.body).join
|
2009-09-19 13:10:41 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def assert_status(code)
|
|
|
|
assert_equal code, response.status
|
|
|
|
end
|
|
|
|
|
|
|
|
def assert_response(body, status = 200, headers = {})
|
2012-01-05 15:18:54 -05:00
|
|
|
assert_body body
|
2009-09-19 13:10:41 -04:00
|
|
|
assert_status status
|
|
|
|
headers.each do |header, value|
|
|
|
|
assert_header header, value
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def assert_content_type(type)
|
|
|
|
assert_equal type, response.headers["Content-Type"]
|
|
|
|
end
|
|
|
|
|
|
|
|
def assert_header(name, value)
|
|
|
|
assert_equal value, response.headers[name]
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2009-06-15 14:44:45 -04:00
|
|
|
module ActionController
|
2015-04-15 14:30:27 -04:00
|
|
|
class API
|
|
|
|
extend AbstractController::Railties::RoutesHelpers.with(SharedTestRoutes)
|
|
|
|
end
|
|
|
|
|
2009-06-15 14:44:45 -04:00
|
|
|
class Base
|
2010-09-24 20:24:55 -04:00
|
|
|
# This stub emulates the Railtie including the URL helpers from a Rails application
|
2014-12-02 08:39:59 -05:00
|
|
|
extend AbstractController::Railties::RoutesHelpers.with(SharedTestRoutes)
|
2012-06-01 11:42:33 -04:00
|
|
|
include SharedTestRoutes.mounted_helpers
|
2009-10-04 00:18:32 -04:00
|
|
|
|
2010-09-24 20:24:55 -04:00
|
|
|
self.view_paths = FIXTURE_LOAD_PATH
|
|
|
|
|
|
|
|
def self.test_routes(&block)
|
|
|
|
routes = ActionDispatch::Routing::RouteSet.new
|
|
|
|
routes.draw(&block)
|
|
|
|
include routes.url_helpers
|
2018-09-24 17:49:26 -04:00
|
|
|
routes
|
2010-09-24 20:24:55 -04:00
|
|
|
end
|
|
|
|
end
|
2009-10-04 00:18:32 -04:00
|
|
|
|
2009-06-15 14:44:45 -04:00
|
|
|
class TestCase
|
2009-12-12 19:09:44 -05:00
|
|
|
include ActionDispatch::TestProcess
|
2012-08-09 17:30:26 -04:00
|
|
|
include ActionDispatch::SharedRoutes
|
2009-06-15 14:44:45 -04:00
|
|
|
end
|
|
|
|
end
|
2010-02-24 19:01:03 -05:00
|
|
|
|
2010-09-24 20:24:55 -04:00
|
|
|
class ::ApplicationController < ActionController::Base
|
|
|
|
end
|
|
|
|
|
2010-10-01 21:05:59 -04:00
|
|
|
module ActionDispatch
|
2011-12-01 14:46:18 -05:00
|
|
|
class DebugExceptions
|
|
|
|
private
|
2016-08-06 13:55:02 -04:00
|
|
|
remove_method :stderr_logger
|
2016-09-14 04:57:52 -04:00
|
|
|
# Silence logger
|
2016-08-06 13:55:02 -04:00
|
|
|
def stderr_logger
|
|
|
|
nil
|
|
|
|
end
|
2010-10-01 21:05:59 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-01-23 13:18:36 -05:00
|
|
|
module ActionDispatch
|
|
|
|
module RoutingVerbs
|
2014-07-02 18:02:36 -04:00
|
|
|
def send_request(uri_or_host, method, path)
|
2012-01-23 13:18:36 -05:00
|
|
|
host = uri_or_host.host unless path
|
|
|
|
path ||= uri_or_host.path
|
|
|
|
|
2017-01-05 00:40:24 -05:00
|
|
|
params = { "PATH_INFO" => path,
|
|
|
|
"REQUEST_METHOD" => method,
|
|
|
|
"HTTP_HOST" => host }
|
2012-01-23 13:18:36 -05:00
|
|
|
|
2014-07-02 18:02:36 -04:00
|
|
|
routes.call(params)
|
|
|
|
end
|
|
|
|
|
2014-07-15 21:43:47 -04:00
|
|
|
def request_path_params(path, options = {})
|
2016-08-06 12:54:50 -04:00
|
|
|
method = options[:method] || "GET"
|
|
|
|
resp = send_request URI("http://localhost" + path), method.to_s.upcase, nil
|
2014-07-15 18:24:23 -04:00
|
|
|
status = resp.first
|
2014-07-02 18:02:36 -04:00
|
|
|
if status == 404
|
|
|
|
raise ActionController::RoutingError, "No route matches #{path.inspect}"
|
|
|
|
end
|
|
|
|
controller.request.path_parameters
|
|
|
|
end
|
|
|
|
|
|
|
|
def get(uri_or_host, path = nil)
|
2016-08-06 12:54:50 -04:00
|
|
|
send_request(uri_or_host, "GET", path)[2].join
|
2014-07-02 18:02:36 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def post(uri_or_host, path = nil)
|
2016-08-06 12:54:50 -04:00
|
|
|
send_request(uri_or_host, "POST", path)[2].join
|
2014-07-02 18:02:36 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def put(uri_or_host, path = nil)
|
2016-08-06 12:54:50 -04:00
|
|
|
send_request(uri_or_host, "PUT", path)[2].join
|
2014-07-02 18:02:36 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def delete(uri_or_host, path = nil)
|
2016-08-06 12:54:50 -04:00
|
|
|
send_request(uri_or_host, "DELETE", path)[2].join
|
2014-07-02 18:02:36 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def patch(uri_or_host, path = nil)
|
2016-08-06 12:54:50 -04:00
|
|
|
send_request(uri_or_host, "PATCH", path)[2].join
|
2012-01-23 13:18:36 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2011-11-30 10:34:16 -05:00
|
|
|
module RoutingTestHelpers
|
2014-07-02 18:55:25 -04:00
|
|
|
def url_for(set, options)
|
2014-07-17 14:21:06 -04:00
|
|
|
route_name = options.delete :use_route
|
2016-08-06 13:35:13 -04:00
|
|
|
set.url_for options.merge(only_path: true), route_name
|
2011-11-30 10:34:16 -05:00
|
|
|
end
|
2014-07-02 18:02:36 -04:00
|
|
|
|
|
|
|
def make_set(strict = true)
|
|
|
|
tc = self
|
|
|
|
TestSet.new ->(c) { tc.controller = c }, strict
|
|
|
|
end
|
|
|
|
|
|
|
|
class TestSet < ActionDispatch::Routing::RouteSet
|
2015-08-24 15:06:22 -04:00
|
|
|
class Request < DelegateClass(ActionDispatch::Request)
|
|
|
|
def initialize(target, helpers, block, strict)
|
|
|
|
super(target)
|
|
|
|
@helpers = helpers
|
2014-07-02 18:02:36 -04:00
|
|
|
@block = block
|
2015-08-24 15:06:22 -04:00
|
|
|
@strict = strict
|
2014-07-02 18:02:36 -04:00
|
|
|
end
|
|
|
|
|
2015-08-24 15:06:22 -04:00
|
|
|
def controller_class
|
|
|
|
helpers = @helpers
|
2014-07-02 18:02:36 -04:00
|
|
|
block = @block
|
2015-08-24 15:06:22 -04:00
|
|
|
Class.new(@strict ? super : ActionController::Base) {
|
|
|
|
include helpers
|
2014-07-02 18:02:36 -04:00
|
|
|
define_method(:process) { |name| block.call(self) }
|
|
|
|
def to_a; [200, {}, []]; end
|
|
|
|
}
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2015-08-24 15:06:22 -04:00
|
|
|
attr_reader :strict
|
|
|
|
|
|
|
|
def initialize(block, strict = false)
|
|
|
|
@block = block
|
|
|
|
@strict = strict
|
|
|
|
super()
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
2016-08-06 13:55:02 -04:00
|
|
|
def make_request(env)
|
|
|
|
Request.new super, url_helpers, @block, strict
|
|
|
|
end
|
2014-07-02 18:02:36 -04:00
|
|
|
end
|
2011-11-30 10:34:16 -05:00
|
|
|
end
|
2012-08-13 18:02:00 -04:00
|
|
|
|
|
|
|
class ResourcesController < ActionController::Base
|
2015-05-28 08:13:32 -04:00
|
|
|
def index() head :ok end
|
2012-08-13 18:02:00 -04:00
|
|
|
alias_method :show, :index
|
|
|
|
end
|
|
|
|
|
|
|
|
class CommentsController < ResourcesController; end
|
2016-10-28 23:05:58 -04:00
|
|
|
class AccountsController < ResourcesController; end
|
2012-08-13 18:02:00 -04:00
|
|
|
class ImagesController < ResourcesController; end
|
|
|
|
|
2016-08-06 12:54:50 -04:00
|
|
|
require "active_support/testing/method_call_assertions"
|
2014-07-19 17:17:13 -04:00
|
|
|
|
2015-08-24 18:03:47 -04:00
|
|
|
class ActiveSupport::TestCase
|
|
|
|
include ActiveSupport::Testing::MethodCallAssertions
|
2017-01-17 04:50:53 -05:00
|
|
|
|
2018-09-22 07:45:29 -04:00
|
|
|
private
|
|
|
|
# Skips the current run on Rubinius using Minitest::Assertions#skip
|
|
|
|
def rubinius_skip(message = "")
|
|
|
|
skip message if RUBY_ENGINE == "rbx"
|
|
|
|
end
|
|
|
|
|
|
|
|
# Skips the current run on JRuby using Minitest::Assertions#skip
|
|
|
|
def jruby_skip(message = "")
|
|
|
|
skip message if defined?(JRUBY_VERSION)
|
|
|
|
end
|
2015-08-24 18:03:47 -04:00
|
|
|
end
|
2017-03-06 12:33:34 -05:00
|
|
|
|
|
|
|
class DrivenByRackTest < ActionDispatch::SystemTestCase
|
|
|
|
driven_by :rack_test
|
|
|
|
end
|
|
|
|
|
|
|
|
class DrivenBySeleniumWithChrome < ActionDispatch::SystemTestCase
|
|
|
|
driven_by :selenium, using: :chrome
|
|
|
|
end
|
2017-10-13 02:17:17 -04:00
|
|
|
|
|
|
|
class DrivenBySeleniumWithHeadlessChrome < ActionDispatch::SystemTestCase
|
|
|
|
driven_by :selenium, using: :headless_chrome
|
|
|
|
end
|
2017-12-07 13:02:34 -05:00
|
|
|
|
|
|
|
class DrivenBySeleniumWithHeadlessFirefox < ActionDispatch::SystemTestCase
|
|
|
|
driven_by :selenium, using: :headless_firefox
|
|
|
|
end
|
2019-03-24 13:59:28 -04:00
|
|
|
|
|
|
|
require_relative "../../tools/test_common"
|