require_relative "../../test_helper" require_relative "../../compare_hashes" module RocketJobMissionControl class DirmonEntriesControllerTest < ActionController::TestCase describe DirmonEntriesController do before do set_role(:admin) RocketJob::DirmonEntry.delete_all end let :job_class_name do "RocketJob::Jobs::SimpleJob" end let :existing_dirmon_entry do RocketJob::DirmonEntry.create!( name: "Test", job_class_name: job_class_name, pattern: "the_path" ) end dirmon_entry_states = RocketJob::DirmonEntry.aasm.states.collect(&:name) let :one_dirmon_entry_for_every_state do dirmon_entry_states.collect do |state| RocketJob::DirmonEntry.create!( name: "Test", job_class_name: job_class_name, pattern: "the_path", state: state ) end end describe "PATCH #enable" do describe "when transition is allowed" do before do patch :enable, params: {id: existing_dirmon_entry.id} end it do assert_redirected_to dirmon_entry_path(existing_dirmon_entry) end it "changes the state to enabled" do assert existing_dirmon_entry.reload.enabled? end end describe "when transition is not allowed" do before do existing_dirmon_entry.enable! patch :enable, params: {id: existing_dirmon_entry.id} end it "succeeds" do assert_response :success end it "alerts the user" do assert_equal I18n.t(:failure, scope: %i[dirmon_entry enable]), flash[:alert] end end end describe "PATCH #disable" do describe "when transition is allowed" do before do existing_dirmon_entry.enable! patch :disable, params: {id: existing_dirmon_entry.id} end it do assert_redirected_to dirmon_entry_path(existing_dirmon_entry) end it "changes the state to disabled" do assert existing_dirmon_entry.reload.disabled? end end describe "when transition is not allowed" do before do patch :disable, params: {id: existing_dirmon_entry.id} end it "succeeds" do assert_response :success end it "alerts the user" do assert_equal I18n.t(:failure, scope: %i[dirmon_entry disable]), flash[:alert] end end end describe "GET #new" do let(:entry_params) { {} } before do get :new, params: entry_params end it "succeeds" do assert_response :success end it "assigns a new entry" do assert assigns(:dirmon_entry).present? refute assigns(:dirmon_entry).persisted? end describe "with form params" do let(:entry_params) { {rocket_job_dirmon_entry: {name: "new entry"}} } it "succeeds" do assert_response :success end it "assigns the params to new entry" do assert_equal "new entry", assigns(:dirmon_entry).name end describe "with a valid job_class_name" do let(:entry_params) { {rocket_job_dirmon_entry: {job_class_name: "NoParamsJob"}} } it "succeeds" do assert_response :success end it "assigns the job class" do assert_equal "NoParamsJob", assigns(:dirmon_entry).job_class_name end end describe "with an invalid job_class_name" do let(:entry_params) { {rocket_job_dirmon_entry: {job_class_name: "BadJob"}} } it "succeeds" do assert_response :success end it "adds an error" do assert assigns(:dirmon_entry).errors[:job_class_name].present? end end end end describe "PATCH #update" do describe "with valid parameters" do before do params = {id: existing_dirmon_entry.id, rocket_job_dirmon_entry: {pattern: "the_path2", job_class_name: job_class_name}} patch :update, params: params end it "redirects to the updated entry" do assert_redirected_to dirmon_entry_path(existing_dirmon_entry) end it "updates the entry" do assert_equal "the_path2", existing_dirmon_entry.reload.pattern end end describe "with invalid parameters" do before do params = {id: existing_dirmon_entry.id, rocket_job_dirmon_entry: {job_class_name: "FakeAndBadJob"}} patch :update, params: params end it "renders the edit template" do assert_response :success end it "alerts the user" do if RocketJob::VERSION.to_f >= 3.5 assert_select "div.message", "job_class_name: [\"Job FakeAndBadJob must be defined and inherit from RocketJob::Job\"]" else assert_select "div.message", "job_class_name: [\"job_class_name must be defined and must be derived from RocketJob::Job\"]" end end end end describe "POST #create" do describe "with valid parameters" do let(:dirmon_params) do { name: "Test", pattern: "/files/*", job_class_name: job_class_name, properties: {description: "", priority: "42"} } end before do post :create, params: {rocket_job_dirmon_entry: dirmon_params} end it "creates the entry" do assert assigns(:dirmon_entry).persisted? end it "has no errors" do assert assigns(:dirmon_entry).errors.messages.empty? end it "redirects to created entry" do assert_redirected_to dirmon_entry_path(assigns(:dirmon_entry)) end it "does not save blank properties" do assert_nil assigns(:dirmon_entry).properties[:description] end it "saves properties" do assert_equal "42", assigns(:dirmon_entry).properties[:priority] end %i[name pattern job_class_name].each do |attribute| it "assigns the correct value for #{attribute}" do assert_equal dirmon_params[attribute], assigns(:dirmon_entry)[attribute] end end end describe "with invalid parameters" do let(:dirmon_params) do { name: "Test", job_class_name: "FakeAndBadJob" } end before do post :create, params: {rocket_job_dirmon_entry: dirmon_params} end describe "on model attributes" do it "renders the new template" do assert_response :success assert_template :new end it "has errors on the entry" do refute assigns(:dirmon_entry).valid? end end end end describe "GET #edit" do before do get :edit, params: {id: existing_dirmon_entry.id} end it "succeeds" do assert_response :success end it "assigns the entry" do assert_equal existing_dirmon_entry, assigns(:dirmon_entry) end end describe "GET #show" do describe "with an invalid id" do before do get :show, params: {id: 42} end it "redirects" do assert_redirected_to dirmon_entries_path end it "adds a flash alert message" do assert_equal I18n.t(:failure, scope: %i[dirmon_entry find], id: 42), flash[:alert] end end describe "with a valid id" do before do get :show, params: {id: existing_dirmon_entry.id} end it "succeeds" do assert_response :success end it "assigns the entry" do assert assigns(:dirmon_entry).present? end end end describe "DELETE #destroy" do describe "with a valid id" do before do delete :destroy, params: {id: existing_dirmon_entry.id} end it "redirects to index" do assert_redirected_to dirmon_entries_path end it "deletes the entry" do refute RocketJob::DirmonEntry.where(id: existing_dirmon_entry.id).exists? end end end ([:index] + dirmon_entry_states).each do |state| describe "GET ##{state}" do describe "html" do describe "with no #{state} entries" do before do get state end it "succeeds" do assert_response :success end it "renders template" do assert_template :index end end describe "with #{state} entries" do before do one_dirmon_entry_for_every_state get state end it "succeeds" do assert_response :success end it "renders template" do assert_template :index end end end describe "json" do describe "with #{state} entries" do before do get state, format: :json end it "succeeds" do assert_response :success json = JSON.parse(response.body) expected = { "data" => [], "draw" => 0, "recordsFiltered" => 0, "recordsTotal" => 0 } assert_equal expected, json end end describe "with #{state} entries" do before do one_dirmon_entry_for_every_state get state, format: :json end it "succeeds" do assert_response :success json = JSON.parse(response.body) expected_data = { pending: { "0" => " \n \n Test\n \n", "1" => "RocketJob::Jobs::SimpleJob", "2" => "the_path", "DT_RowClass" => "card callout callout-pending" }, enabled: { "0" => " \n \n Test\n \n", "1" => "RocketJob::Jobs::SimpleJob", "2" => "the_path", "DT_RowClass" => "card callout callout-enabled" }, failed: { "0" => " \n \n Test\n \n", "1" => "RocketJob::Jobs::SimpleJob", "2" => "the_path", "DT_RowClass" => "card callout callout-failed" }, disabled: { "0" => " \n \n Test\n \n", "1" => "RocketJob::Jobs::SimpleJob", "2" => "the_path", "DT_RowClass" => "card callout callout-disabled" } } if state == :index assert_equal 0, json["draw"] assert_equal 4, json["recordsTotal"] assert_equal 4, json["recordsFiltered"] assert_equal [expected_data[:pending], expected_data[:enabled], expected_data[:failed], expected_data[:disabled]], json["data"] else assert_equal 0, json["draw"] assert_equal 1, json["recordsTotal"] assert_equal 1, json["recordsFiltered"] assert_equal [expected_data[state]], json["data"] end end end end end end describe "role base authentication control" do let(:dirmon_params) do { name: "Test", pattern: "/files/*", job_class_name: job_class_name, properties: {description: "", priority: "42"} } end %i[index disabled enabled failed pending].each do |method| it "#{method} has read only default access" do get method, format: :json assert_response :success end end # PATCH %i[enable disable update].each do |method| describe method.to_s do %i[admin editor operator manager dirmon].each do |role| it "allows role #{role} to access #{method}" do set_role(role) patch :enable, params: {id: existing_dirmon_entry.id} assert_response(:redirect) end end end end # POST %i[admin editor operator manager dirmon].each do |role| it "creates dirmon entry" do set_role(role) post :create, params: {rocket_job_dirmon_entry: dirmon_params} assert_response(:redirect) end end it "deletes dirmon entry" do set_role(:admin) delete :destroy, params: {id: existing_dirmon_entry.id} assert_response(:redirect) end %i[editor operator manager dirmon].each do |role| it "raises authentication error for #{role}" do set_role(role) assert_raises AccessGranted::AccessDenied do delete :destroy, params: {id: existing_dirmon_entry.id} end end end end end def set_role(r) Config.authorization_callback = lambda { {roles: [r]} } end end end