rocketjob_mission_control 4.3.0 → 5.0.0.beta1
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/Rakefile +12 -12
- data/app/controllers/rocket_job_mission_control/application_controller.rb +1 -2
- data/app/controllers/rocket_job_mission_control/dirmon_entries_controller.rb +20 -19
- data/app/controllers/rocket_job_mission_control/jobs_controller.rb +36 -35
- data/app/controllers/rocket_job_mission_control/servers_controller.rb +32 -38
- data/app/datatables/rocket_job_mission_control/abstract_datatable.rb +8 -6
- data/app/datatables/rocket_job_mission_control/active_workers_datatable.rb +5 -5
- data/app/datatables/rocket_job_mission_control/dirmon_entries_datatable.rb +4 -4
- data/app/datatables/rocket_job_mission_control/jobs_datatable.rb +55 -62
- data/app/datatables/rocket_job_mission_control/servers_datatable.rb +13 -14
- data/app/helpers/rocket_job_mission_control/application_helper.rb +42 -41
- data/app/helpers/rocket_job_mission_control/jobs_helper.rb +9 -10
- data/app/helpers/rocket_job_mission_control/pagination_helper.rb +1 -1
- data/app/helpers/rocket_job_mission_control/servers_helper.rb +6 -6
- data/app/helpers/rocket_job_mission_control/slices_helper.rb +2 -4
- data/app/models/rocket_job_mission_control/access_policy.rb +1 -2
- data/app/models/rocket_job_mission_control/authorization.rb +3 -2
- data/app/models/rocket_job_mission_control/job_sanitizer.rb +14 -17
- data/app/models/rocket_job_mission_control/query.rb +2 -5
- data/app/views/rocket_job_mission_control/jobs/_exceptions.html.erb +1 -1
- data/app/views/rocket_job_mission_control/jobs/edit_slice.html.erb +1 -1
- data/app/views/rocket_job_mission_control/servers/index.html.erb +2 -2
- data/config/initializers/assets.rb +5 -7
- data/config/locales/en.yml +3 -0
- data/config/routes.rb +20 -21
- data/lib/rocket_job_mission_control/engine.rb +8 -9
- data/lib/rocket_job_mission_control/version.rb +1 -1
- data/lib/rocketjob_mission_control.rb +1 -1
- data/test/compare_hashes.rb +1 -2
- data/test/controllers/rocket_job_mission_control/application_controller_test.rb +13 -13
- data/test/controllers/rocket_job_mission_control/dirmon_entries_controller_test.rb +107 -108
- data/test/controllers/rocket_job_mission_control/jobs_controller_test.rb +89 -93
- data/test/controllers/rocket_job_mission_control/servers_controller_test.rb +66 -103
- data/test/helpers/rocket_job_mission_control/application_helper_test.rb +13 -14
- data/test/helpers/rocket_job_mission_control/jobs_helper_test.rb +31 -31
- data/test/helpers/rocket_job_mission_control/pagination_helper_test.rb +7 -9
- data/test/helpers/rocket_job_mission_control/servers_helper_test.rb +15 -15
- data/test/helpers/rocket_job_mission_control/slices_helper_test.rb +8 -10
- data/test/models/rocket_job_mission_control/job_sanitizer_test.rb +39 -40
- data/test/models/rocket_job_mission_control/query_test.rb +26 -28
- data/test/test_helper.rb +12 -12
- metadata +28 -28
@@ -1,10 +1,9 @@
|
|
1
|
-
require_relative
|
2
|
-
require_relative
|
1
|
+
require_relative "../../test_helper"
|
2
|
+
require_relative "../../compare_hashes"
|
3
3
|
|
4
4
|
module RocketJobMissionControl
|
5
5
|
class ServersControllerTest < ActionController::TestCase
|
6
6
|
describe ServersController do
|
7
|
-
|
8
7
|
before do
|
9
8
|
set_role(:admin)
|
10
9
|
RocketJob::Job.delete_all
|
@@ -27,137 +26,106 @@ module RocketJobMissionControl
|
|
27
26
|
end
|
28
27
|
end
|
29
28
|
|
30
|
-
[
|
29
|
+
%i[stop pause resume].each do |server_action|
|
31
30
|
describe "PATCH ##{server_action}" do
|
32
|
-
describe
|
31
|
+
describe "with a valid server id" do
|
33
32
|
before do
|
34
33
|
server.pause! if server_action == :resume
|
35
|
-
params = {id: server.id}
|
36
|
-
params = {params: params} if Rails.version.to_i >= 5
|
37
|
-
patch server_action, params
|
38
34
|
end
|
39
35
|
|
40
|
-
it
|
36
|
+
it "redirects to servers" do
|
37
|
+
patch server_action, params: {id: server.id}
|
41
38
|
assert_redirected_to servers_path
|
42
39
|
end
|
43
40
|
|
44
41
|
it "#{server_action} the server" do
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
server.
|
54
|
-
params = {id: server.id}
|
55
|
-
params = {params: params} if Rails.version.to_i >= 5
|
56
|
-
patch server_action, params
|
57
|
-
end
|
58
|
-
|
59
|
-
it 'redirects to servers' do
|
60
|
-
assert_redirected_to servers_path
|
61
|
-
end
|
62
|
-
|
63
|
-
it 'displays a flash message' do
|
64
|
-
assert_equal I18n.t(:failure, scope: [:server, server_action]), flash[:alert]
|
42
|
+
action = server_id = nil
|
43
|
+
RocketJob::Subscribers::Server.stub(:publish, lambda { |_action, args|
|
44
|
+
action = _action
|
45
|
+
server_id = args[:server_id]
|
46
|
+
}) do
|
47
|
+
patch server_action, params: {id: server.id}
|
48
|
+
end
|
49
|
+
assert_equal server_action, action
|
50
|
+
assert_equal server.id, server_id
|
65
51
|
end
|
66
52
|
end
|
67
53
|
end
|
68
54
|
end
|
69
55
|
|
70
|
-
describe
|
71
|
-
RocketJobMissionControl::ServersController::VALID_ACTIONS.each do |server_action,
|
56
|
+
describe "PATCH #update_all" do
|
57
|
+
RocketJobMissionControl::ServersController::VALID_ACTIONS.each do |server_action, _action_message|
|
72
58
|
describe "with '#{server_action}' as the server_action param" do
|
73
59
|
before do
|
74
|
-
params
|
75
|
-
params = {params: params} if Rails.version.to_i >= 5
|
76
|
-
patch :update_all, params
|
60
|
+
patch :update_all, params: {server_action: server_action}
|
77
61
|
end
|
78
62
|
|
79
|
-
it
|
63
|
+
it "redirects to servers" do
|
80
64
|
assert_redirected_to servers_path
|
81
65
|
end
|
82
66
|
|
83
|
-
it
|
67
|
+
it "does not display an error message" do
|
84
68
|
assert_nil flash[:alert]
|
85
69
|
end
|
86
70
|
end
|
87
71
|
end
|
88
72
|
|
89
|
-
describe
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
end
|
95
|
-
|
96
|
-
it 'redirects to servers' do
|
97
|
-
assert_redirected_to servers_path
|
98
|
-
end
|
99
|
-
|
100
|
-
it "does not display a success message" do
|
101
|
-
assert_nil flash[:notice]
|
102
|
-
end
|
103
|
-
|
104
|
-
it 'displays an error message' do
|
105
|
-
assert_equal I18n.t(:invalid, scope: [:server, :update_all]), flash[:alert]
|
73
|
+
describe "with an invalid server_action param" do
|
74
|
+
it "gets access denied" do
|
75
|
+
assert_raises(AccessGranted::AccessDenied) do
|
76
|
+
patch :update_all, params: {server_action: :bad_server_action}
|
77
|
+
end
|
106
78
|
end
|
107
79
|
end
|
108
80
|
end
|
109
81
|
|
110
|
-
describe
|
111
|
-
describe
|
82
|
+
describe "DELETE #destroy" do
|
83
|
+
describe "with a valid server id" do
|
112
84
|
before do
|
113
|
-
params
|
114
|
-
params = {params: params} if Rails.version.to_i >= 5
|
115
|
-
delete :destroy, params
|
85
|
+
delete :destroy, params: {id: server.id}
|
116
86
|
end
|
117
87
|
|
118
|
-
it
|
88
|
+
it "redirects to servers" do
|
119
89
|
assert_redirected_to servers_path
|
120
90
|
end
|
121
91
|
|
122
|
-
it
|
123
|
-
assert_equal I18n.t(:success, scope: [
|
92
|
+
it "displays a flash message" do
|
93
|
+
assert_equal I18n.t(:success, scope: %i[server destroy]), flash[:notice]
|
124
94
|
end
|
125
95
|
|
126
|
-
it
|
96
|
+
it "destroys the server" do
|
127
97
|
refute RocketJob::Server.where(id: server.id).exists?
|
128
98
|
end
|
129
99
|
end
|
130
100
|
|
131
|
-
describe
|
101
|
+
describe "when the server is not found" do
|
132
102
|
before do
|
133
|
-
params
|
134
|
-
params = {params: params} if Rails.version.to_i >= 5
|
135
|
-
delete :destroy, params
|
103
|
+
delete :destroy, params: {id: 999_999}
|
136
104
|
end
|
137
105
|
|
138
|
-
it
|
106
|
+
it "redirects to servers" do
|
139
107
|
assert_redirected_to servers_path
|
140
108
|
end
|
141
109
|
|
142
|
-
it
|
143
|
-
assert_equal I18n.t(:failure, scope: [
|
110
|
+
it "displays a flash message" do
|
111
|
+
assert_equal I18n.t(:failure, scope: %i[server find], id: 999_999), flash[:alert]
|
144
112
|
end
|
145
113
|
end
|
146
114
|
end
|
147
115
|
|
148
116
|
([:index] + server_states).each do |state|
|
149
117
|
describe "GET ##{state}" do
|
150
|
-
describe
|
118
|
+
describe "html" do
|
151
119
|
describe "with no #{state} servers" do
|
152
120
|
before do
|
153
121
|
get state
|
154
122
|
end
|
155
123
|
|
156
|
-
it
|
124
|
+
it "succeeds" do
|
157
125
|
assert_response :success
|
158
126
|
end
|
159
127
|
|
160
|
-
it
|
128
|
+
it "renders template" do
|
161
129
|
assert_template :index
|
162
130
|
end
|
163
131
|
end
|
@@ -168,23 +136,23 @@ module RocketJobMissionControl
|
|
168
136
|
get state
|
169
137
|
end
|
170
138
|
|
171
|
-
it
|
139
|
+
it "succeeds" do
|
172
140
|
assert_response :success
|
173
141
|
end
|
174
142
|
|
175
|
-
it
|
143
|
+
it "renders template" do
|
176
144
|
assert_template :index
|
177
145
|
end
|
178
146
|
end
|
179
147
|
end
|
180
148
|
|
181
|
-
describe
|
149
|
+
describe "json" do
|
182
150
|
describe "with no #{state} server" do
|
183
151
|
before do
|
184
152
|
get state, format: :json
|
185
153
|
end
|
186
154
|
|
187
|
-
it
|
155
|
+
it "succeeds" do
|
188
156
|
assert_response :success
|
189
157
|
json = JSON.parse(response.body)
|
190
158
|
expected = {
|
@@ -203,7 +171,7 @@ module RocketJobMissionControl
|
|
203
171
|
get state, format: :json
|
204
172
|
end
|
205
173
|
|
206
|
-
it
|
174
|
+
it "succeeds" do
|
207
175
|
assert_response :success
|
208
176
|
json = JSON.parse(response.body)
|
209
177
|
expected_data = {
|
@@ -212,7 +180,7 @@ module RocketJobMissionControl
|
|
212
180
|
"1" => "0/10",
|
213
181
|
"2" => /s ago/,
|
214
182
|
"3" => /s ago/,
|
215
|
-
"4" =>
|
183
|
+
"4" => %r{/servers/#{RocketJob::Server.starting.first.id}/stop},
|
216
184
|
"DT_RowClass" => "card callout callout-info"
|
217
185
|
},
|
218
186
|
running: {
|
@@ -220,7 +188,7 @@ module RocketJobMissionControl
|
|
220
188
|
"1" => "0/10",
|
221
189
|
"2" => /s ago/,
|
222
190
|
"3" => /s ago/,
|
223
|
-
"4" =>
|
191
|
+
"4" => %r{/servers/#{RocketJob::Server.running.first.id}/stop},
|
224
192
|
"DT_RowClass" => "card callout callout-success"
|
225
193
|
},
|
226
194
|
paused: {
|
@@ -228,7 +196,7 @@ module RocketJobMissionControl
|
|
228
196
|
"1" => "0/10",
|
229
197
|
"2" => /s ago/,
|
230
198
|
"3" => /s ago/,
|
231
|
-
"4" =>
|
199
|
+
"4" => %r{/servers/#{RocketJob::Server.paused.first.id}/stop},
|
232
200
|
"DT_RowClass" => "card callout callout-warning"
|
233
201
|
},
|
234
202
|
stopping: {
|
@@ -236,30 +204,29 @@ module RocketJobMissionControl
|
|
236
204
|
"1" => "0/10",
|
237
205
|
"2" => /s ago/,
|
238
206
|
"3" => /s ago/,
|
239
|
-
"4" =>
|
207
|
+
"4" => %r{/servers/#{RocketJob::Server.stopping.first.id}},
|
240
208
|
"DT_RowClass" => "card callout callout-alert"
|
241
209
|
}
|
242
210
|
}
|
243
211
|
|
244
212
|
if state == :index
|
245
|
-
assert_equal 0, json[
|
246
|
-
assert_equal 4, json[
|
247
|
-
assert_equal 4, json[
|
248
|
-
compare_array_of_hashes [expected_data[:starting], expected_data[:running], expected_data[:paused], expected_data[:stopping]], json[
|
213
|
+
assert_equal 0, json["draw"]
|
214
|
+
assert_equal 4, json["recordsTotal"]
|
215
|
+
assert_equal 4, json["recordsFiltered"]
|
216
|
+
compare_array_of_hashes [expected_data[:starting], expected_data[:running], expected_data[:paused], expected_data[:stopping]], json["data"]
|
249
217
|
else
|
250
|
-
assert_equal 0, json[
|
251
|
-
assert_equal 1, json[
|
252
|
-
assert_equal 1, json[
|
253
|
-
compare_hash expected_data[state], json[
|
218
|
+
assert_equal 0, json["draw"]
|
219
|
+
assert_equal 1, json["recordsTotal"]
|
220
|
+
assert_equal 1, json["recordsFiltered"]
|
221
|
+
compare_hash expected_data[state], json["data"].first
|
254
222
|
end
|
255
223
|
end
|
256
224
|
end
|
257
225
|
end
|
258
|
-
|
259
226
|
end
|
260
227
|
end
|
261
228
|
|
262
|
-
describe
|
229
|
+
describe "role base authentication control" do
|
263
230
|
%i[index starting running paused stopping zombie].each do |method|
|
264
231
|
it "#{method} has read access as default" do
|
265
232
|
get method, format: :json
|
@@ -268,17 +235,15 @@ module RocketJobMissionControl
|
|
268
235
|
end
|
269
236
|
|
270
237
|
%i[stop pause resume destroy].each do |method|
|
271
|
-
describe
|
238
|
+
describe method.to_s do
|
272
239
|
before do
|
273
240
|
server.pause! if method == :resume
|
274
|
-
@params = {id: server.id}
|
275
|
-
@params = {params: @params} if Rails.version.to_i >= 5
|
276
241
|
end
|
277
242
|
|
278
243
|
%i[admin editor operator].each do |role|
|
279
244
|
it "redirects with #{method} method and role #{role}" do
|
280
245
|
set_role(role)
|
281
|
-
patch method,
|
246
|
+
patch method, params: {id: server.id}
|
282
247
|
assert_response(:redirect)
|
283
248
|
end
|
284
249
|
end
|
@@ -287,7 +252,7 @@ module RocketJobMissionControl
|
|
287
252
|
it "raises authentication error for #{role}" do
|
288
253
|
set_role(role)
|
289
254
|
assert_raises AccessGranted::AccessDenied do
|
290
|
-
patch method,
|
255
|
+
patch method, params: {id: server.id}
|
291
256
|
end
|
292
257
|
end
|
293
258
|
end
|
@@ -297,11 +262,9 @@ module RocketJobMissionControl
|
|
297
262
|
RocketJobMissionControl::ServersController::VALID_ACTIONS.each do |server_action|
|
298
263
|
describe "with '#{server_action}' as the server_action param" do
|
299
264
|
%i[admin editor operator].each do |role|
|
300
|
-
it
|
265
|
+
it "redirects to servers" do
|
301
266
|
set_role(role)
|
302
|
-
params
|
303
|
-
params = {params: params} if Rails.version.to_i >= 5
|
304
|
-
patch :update_all, params
|
267
|
+
patch :update_all, params: {server_action: server_action}
|
305
268
|
|
306
269
|
assert_response(:redirect)
|
307
270
|
end
|
@@ -312,9 +275,9 @@ module RocketJobMissionControl
|
|
312
275
|
end
|
313
276
|
|
314
277
|
def set_role(r)
|
315
|
-
Config.authorization_callback =
|
278
|
+
Config.authorization_callback = lambda {
|
316
279
|
{roles: [r]}
|
317
|
-
|
280
|
+
}
|
318
281
|
end
|
319
282
|
end
|
320
|
-
end
|
283
|
+
end
|
@@ -1,41 +1,40 @@
|
|
1
|
-
require_relative
|
1
|
+
require_relative "../../test_helper"
|
2
2
|
|
3
3
|
module RocketJobMissionControl
|
4
4
|
class ApplicationHelperTest < ActionView::TestCase
|
5
5
|
describe ApplicationHelper do
|
6
|
-
|
7
|
-
describe '#state_icon' do
|
6
|
+
describe "#state_icon" do
|
8
7
|
RocketJobMissionControl::ApplicationHelper::STATE_ICON_MAP.each do |state, expected_class|
|
9
8
|
describe "when the job state is #{state}" do
|
10
|
-
it
|
9
|
+
it "returns the correct class" do
|
11
10
|
assert_equal "#{expected_class} #{state}", state_icon(state)
|
12
11
|
end
|
13
12
|
end
|
14
13
|
end
|
15
14
|
end
|
16
15
|
|
17
|
-
describe
|
16
|
+
describe "#pretty_print_array_or_hash" do
|
18
17
|
let(:arguments) { [42, "muad'dib"] }
|
19
18
|
let(:helper_output) { pretty_print_array_or_hash(arguments) }
|
20
19
|
|
21
|
-
describe
|
22
|
-
it
|
20
|
+
describe "when arguments is a simple array" do
|
21
|
+
it "returns a string with spacing and line breaks" do
|
23
22
|
assert_equal "[<br /> 42,<br /> \"muad'dib\"<br />]", helper_output
|
24
23
|
end
|
25
24
|
end
|
26
25
|
|
27
|
-
describe
|
28
|
-
let(:arguments)
|
26
|
+
describe "when arguments is an array with complex data" do
|
27
|
+
let(:arguments) do
|
29
28
|
[
|
30
29
|
42,
|
31
30
|
{
|
32
|
-
crew: [
|
33
|
-
created_at:
|
31
|
+
crew: %w[leela fry bender],
|
32
|
+
created_at: "1999-03-28"
|
34
33
|
}
|
35
34
|
]
|
36
|
-
|
35
|
+
end
|
37
36
|
|
38
|
-
it
|
37
|
+
it "returns a string with spacing and line breaks" do
|
39
38
|
expected_output = "[<br /> 42,<br /> {<br /> \"crew\": [<br /> \"leela\",<br /> \"fry\",<br /> \"bender\"<br /> ],<br /> \"created_at\": \"1999-03-28\"<br /> }<br />]"
|
40
39
|
assert_equal expected_output, helper_output
|
41
40
|
end
|
@@ -44,7 +43,7 @@ module RocketJobMissionControl
|
|
44
43
|
describe "when arguments isn't an array or hash" do
|
45
44
|
let(:arguments) { 42 }
|
46
45
|
|
47
|
-
it
|
46
|
+
it "returns the arguments" do
|
48
47
|
assert_equal arguments, helper_output
|
49
48
|
end
|
50
49
|
end
|
@@ -1,62 +1,62 @@
|
|
1
|
-
require_relative
|
1
|
+
require_relative "../../test_helper"
|
2
2
|
|
3
3
|
module RocketJobMissionControl
|
4
4
|
JobsHelper.include(RocketJobMissionControl::ApplicationHelper)
|
5
5
|
|
6
6
|
class JobsHelperTest < ActionView::TestCase
|
7
7
|
describe JobsHelper do
|
8
|
-
describe
|
8
|
+
describe "#jobs_icon" do
|
9
9
|
let :job do
|
10
10
|
RocketJob::Jobs::SimpleJob.new
|
11
11
|
end
|
12
12
|
|
13
|
-
it
|
14
|
-
assert_equal
|
13
|
+
it "shows queued" do
|
14
|
+
assert_equal "fas fa-inbox queued", job_icon(job)
|
15
15
|
end
|
16
16
|
|
17
|
-
it
|
17
|
+
it "shows running" do
|
18
18
|
job.start
|
19
|
-
job.worker_name =
|
20
|
-
assert_equal
|
19
|
+
job.worker_name = "test_worker"
|
20
|
+
assert_equal "fas fa-play running", job_icon(job)
|
21
21
|
end
|
22
22
|
|
23
|
-
it
|
23
|
+
it "shows sleeping" do
|
24
24
|
job.start
|
25
|
-
assert_equal
|
25
|
+
assert_equal "fas fa-hourglass sleeping", job_icon(job)
|
26
26
|
end
|
27
27
|
|
28
|
-
it
|
28
|
+
it "shows failed" do
|
29
29
|
job.start
|
30
30
|
job.fail
|
31
|
-
assert_equal
|
31
|
+
assert_equal "fas fa-exclamation-triangle failed", job_icon(job)
|
32
32
|
end
|
33
33
|
|
34
|
-
it
|
34
|
+
it "shows aborted" do
|
35
35
|
job.start
|
36
36
|
job.abort
|
37
|
-
assert_equal
|
37
|
+
assert_equal "fas fa-stop aborted", job_icon(job)
|
38
38
|
end
|
39
39
|
|
40
|
-
it
|
40
|
+
it "handles scheduled special case" do
|
41
41
|
job.run_at = 1.day.from_now
|
42
|
-
assert_equal
|
42
|
+
assert_equal "fas fa-clock scheduled", job_icon(job)
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
-
describe
|
47
|
-
it
|
48
|
-
assert_equal %w
|
46
|
+
describe "#jobs_states" do
|
47
|
+
it "returns the states" do
|
48
|
+
assert_equal %w[queued running completed paused failed aborted], job_states
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
-
describe
|
53
|
-
it
|
54
|
-
assert_equal %w
|
52
|
+
describe "#job_states_with_scheduled" do
|
53
|
+
it "returns the states with scheduled" do
|
54
|
+
assert_equal %w[scheduled queued running completed paused failed aborted], job_states_with_scheduled
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
58
|
-
describe
|
59
|
-
it
|
58
|
+
describe "#job_counts_by_state" do
|
59
|
+
it "returns job counts for a state" do
|
60
60
|
RocketJob::Job.delete_all
|
61
61
|
RocketJob::Jobs::SimpleJob.create!
|
62
62
|
assert_equal 1, job_counts_by_state(:queued), RocketJob::Job.counts_by_state
|
@@ -64,25 +64,25 @@ module RocketJobMissionControl
|
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
67
|
-
describe
|
68
|
-
let(:action) {
|
67
|
+
describe "#job_action_link" do
|
68
|
+
let(:action) { "abort" }
|
69
69
|
let(:http_method) { :patch }
|
70
70
|
let(:path) { "/jobs/42/#{action}" }
|
71
71
|
let(:action_link) { job_action_link(action, path, http_method) }
|
72
72
|
|
73
|
-
it
|
74
|
-
assert_match
|
73
|
+
it "uses the action as the label" do
|
74
|
+
assert_match %r{>abort</a>}, action_link
|
75
75
|
end
|
76
76
|
|
77
|
-
it
|
78
|
-
assert_match
|
77
|
+
it "links to the correct url" do
|
78
|
+
assert_match %r{href="/jobs/42/abort\"}, action_link
|
79
79
|
end
|
80
80
|
|
81
|
-
it
|
81
|
+
it "adds prompt for confirmation" do
|
82
82
|
assert_match /data-confirm="Are you sure you want to abort this job\?"/, action_link
|
83
83
|
end
|
84
84
|
|
85
|
-
it
|
85
|
+
it "uses correct http method" do
|
86
86
|
assert_match /data-method="patch"/, action_link
|
87
87
|
end
|
88
88
|
end
|