rocketjob_mission_control 4.3.0 → 5.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -7,7 +7,7 @@ module RocketJobMissionControl
|
|
7
7
|
def server_icon(server)
|
8
8
|
state =
|
9
9
|
if server.zombie?
|
10
|
-
|
10
|
+
"zombie"
|
11
11
|
else
|
12
12
|
server.state
|
13
13
|
end
|
@@ -16,14 +16,14 @@ module RocketJobMissionControl
|
|
16
16
|
|
17
17
|
def server_card_class(server)
|
18
18
|
if server.zombie?
|
19
|
-
|
19
|
+
"callout-zombie"
|
20
20
|
else
|
21
21
|
map = {
|
22
|
-
running:
|
23
|
-
paused:
|
24
|
-
stopping:
|
22
|
+
running: "callout-success",
|
23
|
+
paused: "callout-warning",
|
24
|
+
stopping: "callout-alert"
|
25
25
|
}
|
26
|
-
map[server.state] ||
|
26
|
+
map[server.state] || "callout-info"
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
@@ -1,9 +1,7 @@
|
|
1
1
|
module RocketJobMissionControl
|
2
2
|
module SlicesHelper
|
3
|
-
|
4
|
-
|
5
|
-
encrypted ? 'encrypted' : pretty_print_array_or_hash(slice.to_a)
|
3
|
+
def display_slice_info(slice, encrypted = false)
|
4
|
+
encrypted ? "encrypted" : pretty_print_array_or_hash(slice.to_a)
|
6
5
|
end
|
7
|
-
|
8
6
|
end
|
9
7
|
end
|
@@ -17,7 +17,7 @@ module RocketJobMissionControl
|
|
17
17
|
|
18
18
|
# Stop, Pause, Resume, Destroy (force stop) Rocket Job Servers
|
19
19
|
role :operator, {operator: true} do
|
20
|
-
can %i[stop kill pause resume destroy
|
20
|
+
can %i[stop kill pause resume destroy destroy_zombies thread_dump], RocketJob::Server
|
21
21
|
end
|
22
22
|
|
23
23
|
# Pause, Resume, Retry, Abort, Edit Jobs
|
@@ -47,4 +47,3 @@ module RocketJobMissionControl
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
50
|
-
|
@@ -1,12 +1,13 @@
|
|
1
1
|
module RocketJobMissionControl
|
2
2
|
class Authorization
|
3
|
-
ROLES = %i[admin editor operator manager dirmon user view]
|
3
|
+
ROLES = %i[admin editor operator manager dirmon user view].freeze
|
4
4
|
attr_accessor *ROLES
|
5
5
|
attr_accessor :login
|
6
6
|
|
7
7
|
def initialize(roles: [], login: nil)
|
8
8
|
@login = login
|
9
9
|
return if roles.blank?
|
10
|
+
|
10
11
|
invalid_roles = roles - ROLES
|
11
12
|
raise(ArgumentError, "Invalid Roles Supplied: #{invalid_roles.inspect}") unless invalid_roles.empty?
|
12
13
|
|
@@ -19,4 +20,4 @@ module RocketJobMissionControl
|
|
19
20
|
roles.each { |role| public_send("#{role}=", true) }
|
20
21
|
end
|
21
22
|
end
|
22
|
-
end
|
23
|
+
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
module RocketJobMissionControl
|
2
2
|
module JobSanitizer
|
3
|
-
|
4
3
|
# Returns [Hash] the permissible params for the specified job class, after sanitizing.
|
5
4
|
# Parameters
|
6
5
|
# properties [Hash]
|
@@ -19,29 +18,27 @@ module RocketJobMissionControl
|
|
19
18
|
def self.sanitize(properties, job_class, target, nil_blank = true)
|
20
19
|
permissible_params = {}
|
21
20
|
job_class.user_editable_fields.each do |field_name|
|
22
|
-
|
23
|
-
field = job_class.fields[field_name.to_s]
|
24
|
-
next unless field && field.type
|
21
|
+
next unless value = properties[field_name]
|
25
22
|
|
26
|
-
|
27
|
-
|
28
|
-
begin
|
29
|
-
value = value.blank? ? nil : JSON.parse(value)
|
30
|
-
rescue JSON::ParserError => e
|
31
|
-
target.errors.add(:properties, e.message)
|
32
|
-
end
|
33
|
-
end
|
23
|
+
field = job_class.fields[field_name.to_s]
|
24
|
+
next unless field&.type
|
34
25
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
26
|
+
case field.type.name
|
27
|
+
when "Hash"
|
28
|
+
begin
|
29
|
+
value = value.blank? ? nil : JSON.parse(value)
|
30
|
+
rescue JSON::ParserError => e
|
31
|
+
target.errors.add(:properties, e.message)
|
39
32
|
end
|
33
|
+
end
|
40
34
|
|
35
|
+
if value.blank? && !value.is_a?(Hash)
|
36
|
+
permissible_params[field_name] = nil if nil_blank
|
37
|
+
else
|
38
|
+
permissible_params[field_name] = value
|
41
39
|
end
|
42
40
|
end
|
43
41
|
permissible_params
|
44
42
|
end
|
45
|
-
|
46
43
|
end
|
47
44
|
end
|
@@ -42,16 +42,13 @@ module RocketJobMissionControl
|
|
42
42
|
records = records.where(search_columns.first => regexp)
|
43
43
|
else
|
44
44
|
cols = search_columns.collect { |col| {col => regexp} }
|
45
|
-
records = records.where(
|
45
|
+
records = records.where("$or" => cols)
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
49
|
# Pagination
|
50
|
-
if start && page_size
|
51
|
-
records = records.skip(start).limit(page_size)
|
52
|
-
end
|
50
|
+
records = records.skip(start).limit(page_size) if start && page_size
|
53
51
|
records
|
54
52
|
end
|
55
|
-
|
56
53
|
end
|
57
54
|
end
|
@@ -22,7 +22,7 @@
|
|
22
22
|
<% if can?(:view_slice, @job) %>
|
23
23
|
<th>
|
24
24
|
<div>
|
25
|
-
<%= link_to 'View Slice', view_slice_job_path(@job, error_type: exception.class_name, record_number: @job.input.failed.first
|
25
|
+
<%= link_to 'View Slice', view_slice_job_path(@job, error_type: exception.class_name, record_number: @job.input.failed.first.processing_record_number), class: 'btn btn-primary' %>
|
26
26
|
</div>
|
27
27
|
</th>
|
28
28
|
<% end %>
|
@@ -15,7 +15,7 @@
|
|
15
15
|
<div id='submit'>
|
16
16
|
<%= f.submit 'Save', class: 'btn btn-primary' %>
|
17
17
|
<%= link_to 'Delete', delete_line_job_path(@job, offset: @offset, error_type: @failure_exception.class_name, line_index: @line_index), :data => {:confirm => 'Are you sure?'}, method: :patch, class: 'btn btn-danger' %>
|
18
|
-
<%= link_to 'Cancel', view_slice_job_path(@job, error_type: @failure_exception.class_name, record_number: @job.input.failed.first
|
18
|
+
<%= link_to 'Cancel', view_slice_job_path(@job, error_type: @failure_exception.class_name, record_number: @job.input.failed.first.processing_record_number), class: 'btn btn-default' %>
|
19
19
|
<% end %>
|
20
20
|
|
21
21
|
</div>
|
@@ -11,8 +11,8 @@
|
|
11
11
|
<div class='server-collection-actions'>
|
12
12
|
<ol>
|
13
13
|
<div class='btn-group'>
|
14
|
-
<%
|
15
|
-
<%
|
14
|
+
<% Array(@actions).each do |action| %>
|
15
|
+
<% if can?(action, RocketJob::Server) %>
|
16
16
|
<%= link_to(
|
17
17
|
"#{action.to_s.humanize.capitalize}",
|
18
18
|
rocket_job_mission_control.update_all_servers_path(server_action: action),
|
@@ -1,13 +1,11 @@
|
|
1
|
-
Rails.application.config.assets.precompile <<
|
2
|
-
if path =~ /\.(eot|svg|ttf|woff)\z/
|
3
|
-
|
4
|
-
end
|
5
|
-
}
|
1
|
+
Rails.application.config.assets.precompile << proc do |path|
|
2
|
+
true if path =~ /\.(eot|svg|ttf|woff)\z/
|
3
|
+
end
|
6
4
|
|
7
|
-
Rails.application.config.assets.precompile += %w
|
5
|
+
Rails.application.config.assets.precompile += %w[
|
8
6
|
rocket_job_mission_control/favicon.png
|
9
7
|
rocket_job_mission_control/safari-pinned-tab.svg
|
10
8
|
rocket_job_mission_control/favicon-16x16.png
|
11
9
|
rocket_job_mission_control/favicon-32x32.png
|
12
10
|
rocket_job_mission_control/apple-touch-icon.png
|
13
|
-
|
11
|
+
]
|
data/config/locales/en.yml
CHANGED
@@ -50,7 +50,10 @@ en:
|
|
50
50
|
failure: "Error attempting to resume server."
|
51
51
|
update_all:
|
52
52
|
invalid: "Action not allowed."
|
53
|
+
success: "Submitted %{action} request to all active Rocket Job servers."
|
53
54
|
confirm: "Are you sure you want to %{action} ALL Rocket Job servers?"
|
55
|
+
update_one:
|
56
|
+
success: "Submitted %{action} request to Rocket Job server: %{name}."
|
54
57
|
job:
|
55
58
|
find:
|
56
59
|
failure: "Could not find job with id: %{id}!"
|
data/config/routes.rb
CHANGED
@@ -1,15 +1,14 @@
|
|
1
|
-
|
1
|
+
# @formatter:off
|
2
2
|
RocketJobMissionControl::Engine.routes.draw do
|
3
|
-
|
4
|
-
resources :jobs, only: [:index, :show, :update, :destroy, :edit] do
|
3
|
+
resources :jobs, only: %i[index show update destroy edit] do
|
5
4
|
collection do
|
6
|
-
get :running, to:
|
7
|
-
get :scheduled, to:
|
8
|
-
get :completed, to:
|
9
|
-
get :queued, to:
|
10
|
-
get :paused, to:
|
11
|
-
get :failed, to:
|
12
|
-
get :aborted, to:
|
5
|
+
get :running, to: "jobs#running"
|
6
|
+
get :scheduled, to: "jobs#scheduled"
|
7
|
+
get :completed, to: "jobs#completed"
|
8
|
+
get :queued, to: "jobs#queued"
|
9
|
+
get :paused, to: "jobs#paused"
|
10
|
+
get :failed, to: "jobs#failed"
|
11
|
+
get :aborted, to: "jobs#aborted"
|
13
12
|
end
|
14
13
|
|
15
14
|
member do
|
@@ -30,13 +29,13 @@ RocketJobMissionControl::Engine.routes.draw do
|
|
30
29
|
|
31
30
|
resources :active_workers, only: :index
|
32
31
|
|
33
|
-
resources :servers, only: [
|
32
|
+
resources :servers, only: %i[index destroy] do
|
34
33
|
collection do
|
35
|
-
get :starting, to:
|
36
|
-
get :running, to:
|
37
|
-
get :paused, to:
|
38
|
-
get :stopping, to:
|
39
|
-
get :zombie, to:
|
34
|
+
get :starting, to: "servers#starting"
|
35
|
+
get :running, to: "servers#running"
|
36
|
+
get :paused, to: "servers#paused"
|
37
|
+
get :stopping, to: "servers#stopping"
|
38
|
+
get :zombie, to: "servers#zombie"
|
40
39
|
end
|
41
40
|
|
42
41
|
member do
|
@@ -51,10 +50,10 @@ RocketJobMissionControl::Engine.routes.draw do
|
|
51
50
|
|
52
51
|
resources :dirmon_entries do
|
53
52
|
collection do
|
54
|
-
get :pending, to:
|
55
|
-
get :enabled, to:
|
56
|
-
get :failed, to:
|
57
|
-
get :disabled, to:
|
53
|
+
get :pending, to: "dirmon_entries#pending"
|
54
|
+
get :enabled, to: "dirmon_entries#enabled"
|
55
|
+
get :failed, to: "dirmon_entries#failed"
|
56
|
+
get :disabled, to: "dirmon_entries#disabled"
|
58
57
|
end
|
59
58
|
|
60
59
|
member do
|
@@ -63,7 +62,7 @@ RocketJobMissionControl::Engine.routes.draw do
|
|
63
62
|
end
|
64
63
|
end
|
65
64
|
|
66
|
-
get
|
65
|
+
get "rocket_job_mission_control/test" => "test#index" if Rails.env.test?
|
67
66
|
|
68
67
|
root to: "jobs#running"
|
69
68
|
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
module RocketJobMissionControl
|
2
|
-
|
3
2
|
# The authorization callback
|
4
3
|
module Config
|
5
4
|
mattr_accessor :authorization_callback
|
@@ -8,22 +7,22 @@ module RocketJobMissionControl
|
|
8
7
|
class Engine < ::Rails::Engine
|
9
8
|
isolate_namespace RocketJobMissionControl
|
10
9
|
|
11
|
-
require
|
12
|
-
require
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
10
|
+
require "rocketjob"
|
11
|
+
require "jquery-rails"
|
12
|
+
require "sass-rails"
|
13
|
+
require "jquery-datatables-rails"
|
14
|
+
require "access-granted"
|
16
15
|
begin
|
17
|
-
require
|
16
|
+
require "rocketjob_enterprise"
|
18
17
|
rescue LoadError
|
19
18
|
end
|
20
19
|
|
21
20
|
config.rocket_job_mission_control = ::RocketJobMissionControl::Config
|
22
21
|
|
23
22
|
config.to_prepare do
|
24
|
-
Rails.application.config.assets.precompile += %w
|
23
|
+
Rails.application.config.assets.precompile += %w[
|
25
24
|
rocket_job_mission_control/rocket-icon-64x64.png
|
26
|
-
|
25
|
+
]
|
27
26
|
end
|
28
27
|
end
|
29
28
|
end
|
data/test/compare_hashes.rb
CHANGED
@@ -6,7 +6,7 @@ end
|
|
6
6
|
|
7
7
|
def compare_hash(expected_hash, actual_hash)
|
8
8
|
expected_hash.each_pair do |key, expected|
|
9
|
-
actual = actual_hash[key]
|
9
|
+
actual = actual_hash[key].to_s
|
10
10
|
if expected.is_a?(Regexp)
|
11
11
|
assert_match expected, actual, "#{key} does not match. Expected #{expected.inspect}. Actual #{actual.inspect}"
|
12
12
|
else
|
@@ -14,4 +14,3 @@ def compare_hash(expected_hash, actual_hash)
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
17
|
-
|
@@ -1,40 +1,40 @@
|
|
1
|
-
require_relative
|
1
|
+
require_relative "../../test_helper"
|
2
2
|
|
3
3
|
module RocketJobMissionControl
|
4
4
|
class TestController < ApplicationController
|
5
5
|
def index
|
6
6
|
@time_zone = Time.zone
|
7
7
|
|
8
|
-
render plain:
|
8
|
+
render plain: "Time Zoned"
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
12
|
class ApplicationControllerTest < ActionController::TestCase
|
13
13
|
describe TestController do
|
14
|
-
describe
|
15
|
-
it
|
14
|
+
describe "#with_time_zone" do
|
15
|
+
it "uses correct timezone with session and time_zone set" do
|
16
16
|
if Rails.version.to_i >= 5
|
17
|
-
session[
|
17
|
+
session["time_zone"] = "America/Los_Angeles"
|
18
18
|
get :index
|
19
19
|
else
|
20
|
-
get :index, {}, {
|
20
|
+
get :index, {}, {"time_zone" => "America/Los_Angeles"}
|
21
21
|
end
|
22
|
-
assert_equal
|
22
|
+
assert_equal "America/Los_Angeles", assigns(:time_zone).name
|
23
23
|
end
|
24
24
|
|
25
|
-
it
|
25
|
+
it "uses correct timezone with session, but no time_zone set" do
|
26
26
|
if Rails.version.to_i >= 5
|
27
|
-
session[
|
27
|
+
session["user_id"] = "42"
|
28
28
|
get :index
|
29
29
|
else
|
30
|
-
get :index, {}, {
|
30
|
+
get :index, {}, {"user_id" => "42"}
|
31
31
|
end
|
32
|
-
assert_equal
|
32
|
+
assert_equal "UTC", assigns(:time_zone).name
|
33
33
|
end
|
34
34
|
|
35
|
-
it
|
35
|
+
it "uses correct timezone without a session" do
|
36
36
|
get :index
|
37
|
-
assert_equal
|
37
|
+
assert_equal "UTC", assigns(:time_zone).name
|
38
38
|
end
|
39
39
|
end
|
40
40
|
end
|
@@ -1,5 +1,5 @@
|
|
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 DirmonEntriesControllerTest < ActionController::TestCase
|
@@ -10,14 +10,14 @@ module RocketJobMissionControl
|
|
10
10
|
end
|
11
11
|
|
12
12
|
let :job_class_name do
|
13
|
-
|
13
|
+
"RocketJob::Jobs::SimpleJob"
|
14
14
|
end
|
15
15
|
|
16
16
|
let :existing_dirmon_entry do
|
17
17
|
RocketJob::DirmonEntry.create!(
|
18
|
-
name:
|
18
|
+
name: "Test",
|
19
19
|
job_class_name: job_class_name,
|
20
|
-
pattern:
|
20
|
+
pattern: "the_path"
|
21
21
|
)
|
22
22
|
end
|
23
23
|
|
@@ -26,16 +26,16 @@ module RocketJobMissionControl
|
|
26
26
|
let :one_dirmon_entry_for_every_state do
|
27
27
|
dirmon_entry_states.collect do |state|
|
28
28
|
RocketJob::DirmonEntry.create!(
|
29
|
-
name:
|
29
|
+
name: "Test",
|
30
30
|
job_class_name: job_class_name,
|
31
|
-
pattern:
|
31
|
+
pattern: "the_path",
|
32
32
|
state: state
|
33
33
|
)
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
describe
|
38
|
-
describe
|
37
|
+
describe "PATCH #enable" do
|
38
|
+
describe "when transition is allowed" do
|
39
39
|
before do
|
40
40
|
params = {id: existing_dirmon_entry.id}
|
41
41
|
params = {params: params} if Rails.version.to_i >= 5
|
@@ -46,12 +46,12 @@ module RocketJobMissionControl
|
|
46
46
|
assert_redirected_to dirmon_entry_path(existing_dirmon_entry)
|
47
47
|
end
|
48
48
|
|
49
|
-
it
|
49
|
+
it "changes the state to enabled" do
|
50
50
|
assert existing_dirmon_entry.reload.enabled?
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
54
|
-
describe
|
54
|
+
describe "when transition is not allowed" do
|
55
55
|
before do
|
56
56
|
existing_dirmon_entry.enable!
|
57
57
|
params = {id: existing_dirmon_entry.id}
|
@@ -59,18 +59,18 @@ module RocketJobMissionControl
|
|
59
59
|
patch :enable, params
|
60
60
|
end
|
61
61
|
|
62
|
-
it
|
62
|
+
it "succeeds" do
|
63
63
|
assert_response :success
|
64
64
|
end
|
65
65
|
|
66
|
-
it
|
67
|
-
assert_equal I18n.t(:failure, scope: [
|
66
|
+
it "alerts the user" do
|
67
|
+
assert_equal I18n.t(:failure, scope: %i[dirmon_entry enable]), flash[:alert]
|
68
68
|
end
|
69
69
|
end
|
70
70
|
end
|
71
71
|
|
72
|
-
describe
|
73
|
-
describe
|
72
|
+
describe "PATCH #disable" do
|
73
|
+
describe "when transition is allowed" do
|
74
74
|
before do
|
75
75
|
existing_dirmon_entry.enable!
|
76
76
|
params = {id: existing_dirmon_entry.id}
|
@@ -82,29 +82,29 @@ module RocketJobMissionControl
|
|
82
82
|
assert_redirected_to dirmon_entry_path(existing_dirmon_entry)
|
83
83
|
end
|
84
84
|
|
85
|
-
it
|
85
|
+
it "changes the state to disabled" do
|
86
86
|
assert existing_dirmon_entry.reload.disabled?
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
90
|
-
describe
|
90
|
+
describe "when transition is not allowed" do
|
91
91
|
before do
|
92
92
|
params = {id: existing_dirmon_entry.id}
|
93
93
|
params = {params: params} if Rails.version.to_i >= 5
|
94
94
|
patch :disable, params
|
95
95
|
end
|
96
96
|
|
97
|
-
it
|
97
|
+
it "succeeds" do
|
98
98
|
assert_response :success
|
99
99
|
end
|
100
100
|
|
101
|
-
it
|
102
|
-
assert_equal I18n.t(:failure, scope: [
|
101
|
+
it "alerts the user" do
|
102
|
+
assert_equal I18n.t(:failure, scope: %i[dirmon_entry disable]), flash[:alert]
|
103
103
|
end
|
104
104
|
end
|
105
105
|
end
|
106
106
|
|
107
|
-
describe
|
107
|
+
describe "GET #new" do
|
108
108
|
let(:entry_params) { {} }
|
109
109
|
|
110
110
|
before do
|
@@ -113,99 +113,98 @@ module RocketJobMissionControl
|
|
113
113
|
get :new, params
|
114
114
|
end
|
115
115
|
|
116
|
-
it
|
116
|
+
it "succeeds" do
|
117
117
|
assert_response :success
|
118
118
|
end
|
119
119
|
|
120
|
-
it
|
120
|
+
it "assigns a new entry" do
|
121
121
|
assert assigns(:dirmon_entry).present?
|
122
122
|
refute assigns(:dirmon_entry).persisted?
|
123
123
|
end
|
124
124
|
|
125
|
-
describe
|
126
|
-
let(:entry_params) { {rocket_job_dirmon_entry: {name:
|
125
|
+
describe "with form params" do
|
126
|
+
let(:entry_params) { {rocket_job_dirmon_entry: {name: "new entry"}} }
|
127
127
|
|
128
|
-
it
|
128
|
+
it "succeeds" do
|
129
129
|
assert_response :success
|
130
130
|
end
|
131
131
|
|
132
|
-
it
|
133
|
-
assert_equal
|
132
|
+
it "assigns the params to new entry" do
|
133
|
+
assert_equal "new entry", assigns(:dirmon_entry).name
|
134
134
|
end
|
135
135
|
|
136
|
-
describe
|
137
|
-
let(:entry_params) { {rocket_job_dirmon_entry: {job_class_name:
|
136
|
+
describe "with a valid job_class_name" do
|
137
|
+
let(:entry_params) { {rocket_job_dirmon_entry: {job_class_name: "NoParamsJob"}} }
|
138
138
|
|
139
|
-
it
|
139
|
+
it "succeeds" do
|
140
140
|
assert_response :success
|
141
141
|
end
|
142
142
|
|
143
|
-
it
|
144
|
-
assert_equal
|
143
|
+
it "assigns the job class" do
|
144
|
+
assert_equal "NoParamsJob", assigns(:dirmon_entry).job_class_name
|
145
145
|
end
|
146
146
|
end
|
147
147
|
|
148
|
-
describe
|
149
|
-
let(:entry_params) { {rocket_job_dirmon_entry: {job_class_name:
|
148
|
+
describe "with an invalid job_class_name" do
|
149
|
+
let(:entry_params) { {rocket_job_dirmon_entry: {job_class_name: "BadJob"}} }
|
150
150
|
|
151
|
-
it
|
151
|
+
it "succeeds" do
|
152
152
|
assert_response :success
|
153
153
|
end
|
154
154
|
|
155
|
-
it
|
155
|
+
it "adds an error" do
|
156
156
|
assert assigns(:dirmon_entry).errors[:job_class_name].present?
|
157
157
|
end
|
158
158
|
end
|
159
159
|
end
|
160
|
-
|
161
160
|
end
|
162
161
|
|
163
|
-
describe
|
164
|
-
describe
|
162
|
+
describe "PATCH #update" do
|
163
|
+
describe "with valid parameters" do
|
165
164
|
before do
|
166
|
-
params = {id: existing_dirmon_entry.id, rocket_job_dirmon_entry: {pattern:
|
165
|
+
params = {id: existing_dirmon_entry.id, rocket_job_dirmon_entry: {pattern: "the_path2", job_class_name: job_class_name}}
|
167
166
|
params = {params: params} if Rails.version.to_i >= 5
|
168
167
|
patch :update, params
|
169
168
|
end
|
170
169
|
|
171
|
-
it
|
170
|
+
it "redirects to the updated entry" do
|
172
171
|
assert_redirected_to dirmon_entry_path(existing_dirmon_entry)
|
173
172
|
end
|
174
173
|
|
175
|
-
it
|
176
|
-
assert_equal
|
174
|
+
it "updates the entry" do
|
175
|
+
assert_equal "the_path2", existing_dirmon_entry.reload.pattern
|
177
176
|
end
|
178
177
|
end
|
179
178
|
|
180
|
-
describe
|
179
|
+
describe "with invalid parameters" do
|
181
180
|
before do
|
182
|
-
params = {id: existing_dirmon_entry.id, rocket_job_dirmon_entry: {job_class_name:
|
181
|
+
params = {id: existing_dirmon_entry.id, rocket_job_dirmon_entry: {job_class_name: "FakeAndBadJob"}}
|
183
182
|
params = {params: params} if Rails.version.to_i >= 5
|
184
183
|
patch :update, params
|
185
184
|
end
|
186
185
|
|
187
|
-
it
|
186
|
+
it "renders the edit template" do
|
188
187
|
assert_response :success
|
189
188
|
end
|
190
189
|
|
191
|
-
it
|
190
|
+
it "alerts the user" do
|
192
191
|
if RocketJob::VERSION.to_f >= 3.5
|
193
|
-
assert_select
|
192
|
+
assert_select "div.message", "job_class_name: [\"Job FakeAndBadJob must be defined and inherit from RocketJob::Job\"]"
|
194
193
|
else
|
195
|
-
assert_select
|
194
|
+
assert_select "div.message", "job_class_name: [\"job_class_name must be defined and must be derived from RocketJob::Job\"]"
|
196
195
|
end
|
197
196
|
end
|
198
197
|
end
|
199
198
|
end
|
200
199
|
|
201
|
-
describe
|
202
|
-
describe
|
200
|
+
describe "POST #create" do
|
201
|
+
describe "with valid parameters" do
|
203
202
|
let(:dirmon_params) do
|
204
203
|
{
|
205
|
-
name:
|
206
|
-
pattern:
|
204
|
+
name: "Test",
|
205
|
+
pattern: "/files/*",
|
207
206
|
job_class_name: job_class_name,
|
208
|
-
properties: {description:
|
207
|
+
properties: {description: "", priority: "42"}
|
209
208
|
}
|
210
209
|
end
|
211
210
|
|
@@ -215,38 +214,38 @@ module RocketJobMissionControl
|
|
215
214
|
post :create, params
|
216
215
|
end
|
217
216
|
|
218
|
-
it
|
217
|
+
it "creates the entry" do
|
219
218
|
assert assigns(:dirmon_entry).persisted?
|
220
219
|
end
|
221
220
|
|
222
|
-
it
|
221
|
+
it "has no errors" do
|
223
222
|
assert assigns(:dirmon_entry).errors.messages.empty?
|
224
223
|
end
|
225
224
|
|
226
|
-
it
|
225
|
+
it "redirects to created entry" do
|
227
226
|
assert_redirected_to dirmon_entry_path(assigns(:dirmon_entry))
|
228
227
|
end
|
229
228
|
|
230
|
-
it
|
229
|
+
it "does not save blank properties" do
|
231
230
|
assert_nil assigns(:dirmon_entry).properties[:description]
|
232
231
|
end
|
233
232
|
|
234
|
-
it
|
235
|
-
assert_equal
|
233
|
+
it "saves properties" do
|
234
|
+
assert_equal "42", assigns(:dirmon_entry).properties[:priority]
|
236
235
|
end
|
237
236
|
|
238
|
-
[
|
237
|
+
%i[name pattern job_class_name].each do |attribute|
|
239
238
|
it "assigns the correct value for #{attribute}" do
|
240
239
|
assert_equal dirmon_params[attribute], assigns(:dirmon_entry)[attribute]
|
241
240
|
end
|
242
241
|
end
|
243
242
|
end
|
244
243
|
|
245
|
-
describe
|
244
|
+
describe "with invalid parameters" do
|
246
245
|
let(:dirmon_params) do
|
247
246
|
{
|
248
|
-
name:
|
249
|
-
job_class_name:
|
247
|
+
name: "Test",
|
248
|
+
job_class_name: "FakeAndBadJob"
|
250
249
|
}
|
251
250
|
end
|
252
251
|
|
@@ -256,82 +255,82 @@ module RocketJobMissionControl
|
|
256
255
|
post :create, params
|
257
256
|
end
|
258
257
|
|
259
|
-
describe
|
260
|
-
it
|
258
|
+
describe "on model attributes" do
|
259
|
+
it "renders the new template" do
|
261
260
|
assert_response :success
|
262
261
|
assert_template :new
|
263
262
|
end
|
264
263
|
|
265
|
-
it
|
264
|
+
it "has errors on the entry" do
|
266
265
|
refute assigns(:dirmon_entry).valid?
|
267
266
|
end
|
268
267
|
end
|
269
268
|
end
|
270
269
|
end
|
271
270
|
|
272
|
-
describe
|
271
|
+
describe "GET #edit" do
|
273
272
|
before do
|
274
273
|
params = {id: existing_dirmon_entry.id}
|
275
274
|
params = {params: params} if Rails.version.to_i >= 5
|
276
275
|
get :edit, params
|
277
276
|
end
|
278
277
|
|
279
|
-
it
|
278
|
+
it "succeeds" do
|
280
279
|
assert_response :success
|
281
280
|
end
|
282
281
|
|
283
|
-
it
|
282
|
+
it "assigns the entry" do
|
284
283
|
assert_equal existing_dirmon_entry, assigns(:dirmon_entry)
|
285
284
|
end
|
286
285
|
end
|
287
286
|
|
288
|
-
describe
|
289
|
-
describe
|
287
|
+
describe "GET #show" do
|
288
|
+
describe "with an invalid id" do
|
290
289
|
before do
|
291
290
|
params = {id: 42}
|
292
291
|
params = {params: params} if Rails.version.to_i >= 5
|
293
292
|
get :show, params
|
294
293
|
end
|
295
294
|
|
296
|
-
it
|
295
|
+
it "redirects" do
|
297
296
|
assert_redirected_to dirmon_entries_path
|
298
297
|
end
|
299
298
|
|
300
|
-
it
|
301
|
-
assert_equal I18n.t(:failure, scope: [
|
299
|
+
it "adds a flash alert message" do
|
300
|
+
assert_equal I18n.t(:failure, scope: %i[dirmon_entry find], id: 42), flash[:alert]
|
302
301
|
end
|
303
302
|
end
|
304
303
|
|
305
|
-
describe
|
304
|
+
describe "with a valid id" do
|
306
305
|
before do
|
307
306
|
params = {id: existing_dirmon_entry.id}
|
308
307
|
params = {params: params} if Rails.version.to_i >= 5
|
309
308
|
get :show, params
|
310
309
|
end
|
311
310
|
|
312
|
-
it
|
311
|
+
it "succeeds" do
|
313
312
|
assert_response :success
|
314
313
|
end
|
315
314
|
|
316
|
-
it
|
315
|
+
it "assigns the entry" do
|
317
316
|
assert assigns(:dirmon_entry).present?
|
318
317
|
end
|
319
318
|
end
|
320
319
|
end
|
321
320
|
|
322
|
-
describe
|
323
|
-
describe
|
321
|
+
describe "DELETE #destroy" do
|
322
|
+
describe "with a valid id" do
|
324
323
|
before do
|
325
324
|
params = {id: existing_dirmon_entry.id}
|
326
325
|
params = {params: params} if Rails.version.to_i >= 5
|
327
326
|
delete :destroy, params
|
328
327
|
end
|
329
328
|
|
330
|
-
it
|
329
|
+
it "redirects to index" do
|
331
330
|
assert_redirected_to dirmon_entries_path
|
332
331
|
end
|
333
332
|
|
334
|
-
it
|
333
|
+
it "deletes the entry" do
|
335
334
|
refute RocketJob::DirmonEntry.where(id: existing_dirmon_entry.id).exists?
|
336
335
|
end
|
337
336
|
end
|
@@ -339,17 +338,17 @@ module RocketJobMissionControl
|
|
339
338
|
|
340
339
|
([:index] + dirmon_entry_states).each do |state|
|
341
340
|
describe "GET ##{state}" do
|
342
|
-
describe
|
341
|
+
describe "html" do
|
343
342
|
describe "with no #{state} entries" do
|
344
343
|
before do
|
345
344
|
get state
|
346
345
|
end
|
347
346
|
|
348
|
-
it
|
347
|
+
it "succeeds" do
|
349
348
|
assert_response :success
|
350
349
|
end
|
351
350
|
|
352
|
-
it
|
351
|
+
it "renders template" do
|
353
352
|
assert_template :index
|
354
353
|
end
|
355
354
|
end
|
@@ -360,23 +359,23 @@ module RocketJobMissionControl
|
|
360
359
|
get state
|
361
360
|
end
|
362
361
|
|
363
|
-
it
|
362
|
+
it "succeeds" do
|
364
363
|
assert_response :success
|
365
364
|
end
|
366
365
|
|
367
|
-
it
|
366
|
+
it "renders template" do
|
368
367
|
assert_template :index
|
369
368
|
end
|
370
369
|
end
|
371
370
|
end
|
372
371
|
|
373
|
-
describe
|
372
|
+
describe "json" do
|
374
373
|
describe "with #{state} entries" do
|
375
374
|
before do
|
376
375
|
get state, format: :json
|
377
376
|
end
|
378
377
|
|
379
|
-
it
|
378
|
+
it "succeeds" do
|
380
379
|
assert_response :success
|
381
380
|
json = JSON.parse(response.body)
|
382
381
|
expected = {
|
@@ -395,7 +394,7 @@ module RocketJobMissionControl
|
|
395
394
|
get state, format: :json
|
396
395
|
end
|
397
396
|
|
398
|
-
it
|
397
|
+
it "succeeds" do
|
399
398
|
assert_response :success
|
400
399
|
json = JSON.parse(response.body)
|
401
400
|
expected_data = {
|
@@ -426,15 +425,15 @@ module RocketJobMissionControl
|
|
426
425
|
}
|
427
426
|
|
428
427
|
if state == :index
|
429
|
-
assert_equal 0, json[
|
430
|
-
assert_equal 4, json[
|
431
|
-
assert_equal 4, json[
|
432
|
-
assert_equal [expected_data[:pending], expected_data[:enabled], expected_data[:failed], expected_data[:disabled]], json[
|
428
|
+
assert_equal 0, json["draw"]
|
429
|
+
assert_equal 4, json["recordsTotal"]
|
430
|
+
assert_equal 4, json["recordsFiltered"]
|
431
|
+
assert_equal [expected_data[:pending], expected_data[:enabled], expected_data[:failed], expected_data[:disabled]], json["data"]
|
433
432
|
else
|
434
|
-
assert_equal 0, json[
|
435
|
-
assert_equal 1, json[
|
436
|
-
assert_equal 1, json[
|
437
|
-
assert_equal [expected_data[state]], json[
|
433
|
+
assert_equal 0, json["draw"]
|
434
|
+
assert_equal 1, json["recordsTotal"]
|
435
|
+
assert_equal 1, json["recordsFiltered"]
|
436
|
+
assert_equal [expected_data[state]], json["data"]
|
438
437
|
end
|
439
438
|
end
|
440
439
|
end
|
@@ -442,13 +441,13 @@ module RocketJobMissionControl
|
|
442
441
|
end
|
443
442
|
end
|
444
443
|
|
445
|
-
describe
|
444
|
+
describe "role base authentication control" do
|
446
445
|
let(:dirmon_params) do
|
447
446
|
{
|
448
|
-
name:
|
449
|
-
pattern:
|
447
|
+
name: "Test",
|
448
|
+
pattern: "/files/*",
|
450
449
|
job_class_name: job_class_name,
|
451
|
-
properties: {description:
|
450
|
+
properties: {description: "", priority: "42"}
|
452
451
|
}
|
453
452
|
end
|
454
453
|
|
@@ -477,7 +476,7 @@ module RocketJobMissionControl
|
|
477
476
|
|
478
477
|
# POST
|
479
478
|
%i[admin editor operator manager dirmon].each do |role|
|
480
|
-
it
|
479
|
+
it "creates dirmon entry" do
|
481
480
|
set_role(role)
|
482
481
|
params = {rocket_job_dirmon_entry: dirmon_params}
|
483
482
|
params = {params: params} if Rails.version.to_i >= 5
|
@@ -487,7 +486,7 @@ module RocketJobMissionControl
|
|
487
486
|
end
|
488
487
|
end
|
489
488
|
|
490
|
-
it
|
489
|
+
it "deletes dirmon entry" do
|
491
490
|
set_role(:admin)
|
492
491
|
params = {id: existing_dirmon_entry.id}
|
493
492
|
params = {params: params} if Rails.version.to_i >= 5
|
@@ -510,9 +509,9 @@ module RocketJobMissionControl
|
|
510
509
|
end
|
511
510
|
|
512
511
|
def set_role(r)
|
513
|
-
Config.authorization_callback =
|
512
|
+
Config.authorization_callback = lambda {
|
514
513
|
{roles: [r]}
|
515
|
-
|
514
|
+
}
|
516
515
|
end
|
517
516
|
end
|
518
517
|
end
|