-
Notifications
You must be signed in to change notification settings - Fork 188
/
Copy pathwith_integration_routing_patch.rb
66 lines (54 loc) · 1.91 KB
/
with_integration_routing_patch.rb
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
# Bring with_routing method support for integration tests back to Rails 7.1.
# We can remove this when we drop support for Rails 7.1.
# See: https://github.com/rails/rails/pull/49819
module WithIntegrationRoutingPatch # :nodoc:
extend ActiveSupport::Concern
module ClassMethods
def with_routing(&block)
old_routes = nil
old_routes_call_method = nil
old_integration_session = nil
setup do
old_routes = app.routes
old_routes_call_method = old_routes.method(:call)
old_integration_session = integration_session
create_routes(&block)
end
teardown do
reset_routes(old_routes, old_routes_call_method, old_integration_session)
end
end
end
def with_routing(&block)
old_routes = app.routes
old_routes_call_method = old_routes.method(:call)
old_integration_session = integration_session
create_routes(&block)
ensure
reset_routes(old_routes, old_routes_call_method, old_integration_session)
end
private
def create_routes
app = self.app
routes = ActionDispatch::Routing::RouteSet.new
@original_routes ||= app.routes
@original_routes.singleton_class.redefine_method(:call, &routes.method(:call))
https = integration_session.https?
host = integration_session.host
app.instance_variable_set(:@routes, routes)
@integration_session = Class.new(ActionDispatch::Integration::Session) do
include app.routes.url_helpers
include app.routes.mounted_helpers
end.new(app)
@integration_session.https! https
@integration_session.host! host
@routes = routes
yield routes
end
def reset_routes(old_routes, old_routes_call_method, old_integration_session)
app.instance_variable_set(:@routes, old_routes)
@original_routes.singleton_class.redefine_method(:call, &old_routes_call_method)
@integration_session = old_integration_session
@routes = old_routes
end
end