routes_coverage 0.5.2 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +4 -1
- data/lib/routes_coverage/middleware.rb +2 -20
- data/lib/routes_coverage/result.rb +12 -12
- data/lib/routes_coverage/version.rb +1 -1
- data/lib/routes_coverage.rb +51 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b697ab555d0362fa18dae5161266efbeb99eff4c1f276f7d06039952a6fc2f7c
|
4
|
+
data.tar.gz: 5e0fbeb4d54958bfb46f307c42ef5a54ceec49af49f699943881c6a665cca251
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c810351185cd998b8370c357d28bb06736e1c3de4202e12aab641b7ab22ed182f9e9f2b31a4cefe54dd9cdd52fe6a20a0187b088649e6652107b9edfce6bad39
|
7
|
+
data.tar.gz: e7af918230387e897334154962115d6d6f9b6e38d1e870bd5070529cf88d8fc2708cf6c57baf1d9f1f66b14beacd62f5eb1ae21d33de41ed279e671e4dcf7449
|
data/README.md
CHANGED
@@ -37,6 +37,7 @@ RSpec.configure do |config|
|
|
37
37
|
config.routes_coverage.perform_report = ENV['ROUTES_COVERAGE'] # only generate report if env var is set
|
38
38
|
|
39
39
|
config.routes_coverage.exclude_put_fallbacks = true # exclude non-hit PUT-requests where a matching PATCH exists
|
40
|
+
config.routes_coverage.include_from_controller_tests = true # include results from controller tests
|
40
41
|
config.routes_coverage.exclude_patterns << %r{PATCH /reqs} # excludes all requests matching regex
|
41
42
|
config.routes_coverage.exclude_namespaces << 'somenamespace' # excludes /somenamespace/*
|
42
43
|
|
@@ -70,7 +71,9 @@ or
|
|
70
71
|
RoutesCoverage.settings.format = :full_text
|
71
72
|
```
|
72
73
|
|
73
|
-
|
74
|
+
Note that coverage from `include_from_controller_tests` (disabled by default) is not a true routes coverage.
|
75
|
+
Rounting is not tested in controller tests (which are deprecated in Rails 5),
|
76
|
+
but sometimes you may already have a lot of controller tests and an intent to improve green-path/business level coverage
|
74
77
|
|
75
78
|
## Development
|
76
79
|
|
@@ -9,27 +9,9 @@ module RoutesCoverage
|
|
9
9
|
def call(original_env)
|
10
10
|
# router changes env/request during recognition so need a copy:
|
11
11
|
env = original_env.dup
|
12
|
-
req = ::Rails.application.routes.request_class.new
|
13
|
-
|
14
|
-
parameters = parameters5 || parameters4
|
15
|
-
dispatcher = route.app
|
16
|
-
if dispatcher.respond_to?(:dispatcher?)
|
17
|
-
req.path_parameters = parameters
|
18
|
-
dispatcher = nil unless dispatcher.matches?(req) # && dispatcher.dispatcher?
|
19
|
-
else # rails < 4.2
|
20
|
-
dispatcher = route.app
|
21
|
-
req.env['action_dispatch.request.path_parameters'] =
|
22
|
-
(env['action_dispatch.request.path_parameters'] || {}).merge(parameters)
|
23
|
-
while dispatcher.is_a?(ActionDispatch::Routing::Mapper::Constraints)
|
24
|
-
dispatcher = (dispatcher.app if dispatcher.matches?(env))
|
25
|
-
end
|
26
|
-
end
|
27
|
-
next unless dispatcher
|
12
|
+
req = ::Rails.application.routes.request_class.new(env)
|
13
|
+
RoutesCoverage._touch_request(req)
|
28
14
|
|
29
|
-
RoutesCoverage._touch_route(route)
|
30
|
-
# there may be multiple matching routes - we should match only first
|
31
|
-
break
|
32
|
-
end
|
33
15
|
# TODO: detect 404s? and maybe other route errors?
|
34
16
|
@app.call(original_env)
|
35
17
|
end
|
@@ -90,20 +90,20 @@ module RoutesCoverage
|
|
90
90
|
attr_reader :all_routes, :route_hit_counts
|
91
91
|
|
92
92
|
def expected_routes
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
93
|
+
@expected_routes ||= begin
|
94
|
+
filter_regex = Regexp.union(@settings.exclude_patterns)
|
95
|
+
namespaces_regex = Regexp.union(@settings.exclude_namespaces.map { |n| %r{^/#{n}} })
|
96
|
+
|
97
|
+
routes_groups = all_routes.group_by do |r|
|
98
|
+
(
|
99
|
+
("#{r.verb.to_s[8..-3]} #{r.path.spec}".strip =~ filter_regex) ||
|
100
|
+
(r.path.spec.to_s =~ namespaces_regex)
|
101
|
+
).present?
|
102
|
+
end
|
97
103
|
|
98
|
-
|
99
|
-
|
100
|
-
("#{r.verb.to_s[8..-3]} #{r.path.spec}".strip =~ filter_regex) ||
|
101
|
-
(r.path.spec.to_s =~ namespaces_regex)
|
102
|
-
).present?
|
104
|
+
@excluded_routes = routes_groups[true] || []
|
105
|
+
routes_groups[false] || []
|
103
106
|
end
|
104
|
-
|
105
|
-
@excluded_routes = routes_groups[true] || []
|
106
|
-
@expected_routes = routes_groups[false] || []
|
107
107
|
end
|
108
108
|
|
109
109
|
def pending_routes
|
data/lib/routes_coverage.rb
CHANGED
@@ -10,17 +10,43 @@ require "routes_coverage/formatters/full_text"
|
|
10
10
|
require "routes_coverage/formatters/html"
|
11
11
|
|
12
12
|
module RoutesCoverage
|
13
|
+
module ActionControllerTestCase
|
14
|
+
def process(action, *args)
|
15
|
+
return super unless RoutesCoverage.settings.include_from_controller_tests
|
16
|
+
|
17
|
+
super.tap { RoutesCoverage._touch_request(@request) }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
module ActionControllerTestCaseKvargs
|
22
|
+
def process(action, **kvargs)
|
23
|
+
return super unless RoutesCoverage.settings.include_from_controller_tests
|
24
|
+
|
25
|
+
super.tap { RoutesCoverage._touch_request(@request) }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
13
29
|
class Railtie < ::Rails::Railtie
|
14
30
|
railtie_name :routes_coverage
|
15
31
|
|
16
32
|
initializer "request_coverage.inject_test_middleware" do
|
17
33
|
::Rails.application.middleware.use RoutesCoverage::Middleware if RoutesCoverage.enabled?
|
34
|
+
|
35
|
+
ActiveSupport.on_load(:action_controller_test_case) do |klass|
|
36
|
+
if Rails.version >= '5.1'
|
37
|
+
klass.prepend RoutesCoverage::ActionControllerTestCaseKvargs
|
38
|
+
else
|
39
|
+
klass.prepend RoutesCoverage::ActionControllerTestCase
|
40
|
+
end
|
41
|
+
end
|
18
42
|
end
|
19
43
|
end
|
20
44
|
|
21
45
|
class Settings
|
22
46
|
attr_reader :exclude_patterns, :exclude_namespaces, :groups
|
23
|
-
attr_accessor :
|
47
|
+
attr_accessor :perform_report, :format, :minimum_coverage, :round_precision,
|
48
|
+
:exclude_put_fallbacks,
|
49
|
+
:include_from_controller_tests
|
24
50
|
|
25
51
|
def initialize
|
26
52
|
@exclude_patterns = []
|
@@ -160,6 +186,30 @@ module RoutesCoverage
|
|
160
186
|
end.to_h
|
161
187
|
end
|
162
188
|
|
189
|
+
# NB: router changes env/request during recognition
|
190
|
+
def self._touch_request(req)
|
191
|
+
::Rails.application.routes.router.recognize(req) do |route, parameters5, parameters4|
|
192
|
+
parameters = parameters5 || parameters4
|
193
|
+
dispatcher = route.app
|
194
|
+
if dispatcher.respond_to?(:dispatcher?)
|
195
|
+
req.path_parameters = parameters
|
196
|
+
dispatcher = nil unless dispatcher.matches?(req) # && dispatcher.dispatcher?
|
197
|
+
else # rails < 4.2
|
198
|
+
dispatcher = route.app
|
199
|
+
req.env['action_dispatch.request.path_parameters'] =
|
200
|
+
(env['action_dispatch.request.path_parameters'] || {}).merge(parameters)
|
201
|
+
while dispatcher.is_a?(ActionDispatch::Routing::Mapper::Constraints)
|
202
|
+
dispatcher = (dispatcher.app if dispatcher.matches?(env))
|
203
|
+
end
|
204
|
+
end
|
205
|
+
next unless dispatcher
|
206
|
+
|
207
|
+
RoutesCoverage._touch_route(route)
|
208
|
+
# there may be multiple matching routes - we should match only first
|
209
|
+
break
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
163
213
|
def self._touch_route(route)
|
164
214
|
reset! unless route_hit_count
|
165
215
|
route_hit_count[route] += 1
|