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
@@ -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
|