* feat: add an error column to the data update script * feat: save the error to the error field * feat: save the error when the script fails * feat: show the script error on the data update script page * chore: pass the error to mark_as_failed instead of having its own function * refactor: use presence * test: ensure that we test an error case of a data update script * chore: rename errorneous to failing * test: update some specs, working on the others * chore: update tests now that there are two files * chore: change error from a string to a text to allow for more char * feat: order the data update scripts by the latest script that ran * feat: when the script has succeeded reset error to nil * feat: create a model function that will allow the script to be force run * chore: oops remove the functions form the worker to the model so it can be re-used * feat: create an endpoint that will call the model method force run when we hit the api by clicking the button * feat: ensure that the we add an ajax call that calls the controller endpoint * chore: remove newline * refactor: change to a more Restful route * refactor: use Stimulus * fix: move the code from the model back into the worker so that we can reuse it in the controller * feat:call the worker in the force_run action and create a show route * feat: very first draft of using a polling mechanism on the show method after we kickoff the sidekiq job (still need to error handle) * chore: some syntax changes and unused variables * fix: call the method correctly with the paramters * feat: do some error handling * feat: error handing on the frontend * chore: use e instead of err * refactor: just pass the id instead of the whole script * chore: remove the button * fix: allow the id to be passed * feat: handle errors better * feat: limit the filename column width * refactor: use a common function to set the banner error * test: add a test fro rerun button * test: v1 of the data update script request * test: write some specs for the js controller * Update app/controllers/admin/data_update_scripts_controller.rb Co-authored-by: Michael Kohl <me@citizen428.net> * tests: update the data worker spec * chore: clean up the js controller and its tests * chore: remove whitespaces * chore: swap the functions based on the controller * chore: updates to the UI * chore: remove the standard error catch * chore: update the alert and error messages * chore: remove test for error handling for sidekiq run Co-authored-by: Michael Kohl <me@citizen428.net>
85 lines
2.6 KiB
Ruby
85 lines
2.6 KiB
Ruby
require "rails_helper"
|
|
require Rails.root.join("app/models/data_update_script.rb")
|
|
|
|
RSpec.describe DataUpdateWorker, type: :worker do
|
|
let(:test_directory) { Rails.root.join("spec/support/fixtures/data_update_scripts") }
|
|
let(:worker) { described_class.new }
|
|
let(:statuses) { %w[working succeeded] }
|
|
|
|
before do
|
|
stub_const "DataUpdateScript::DIRECTORY", test_directory
|
|
end
|
|
|
|
context "when an id is passed" do
|
|
it "it updates the appropriate script" do
|
|
script = create(
|
|
:data_update_script,
|
|
file_name: "20200214151804_data_update_test_script",
|
|
status: "failed"
|
|
)
|
|
|
|
expect do
|
|
worker.perform(script.id)
|
|
end.to change(DataUpdateScript, :count).by(0)
|
|
|
|
updated_script = DataUpdateScript.find(script.id)
|
|
expect(updated_script.status).to eq("succeeded")
|
|
end
|
|
end
|
|
|
|
|
|
context "when an id is not passed" do
|
|
it "runs scripts that need running" do
|
|
expect do
|
|
worker.perform
|
|
end.to change(DataUpdateScript, :count).by(2)
|
|
end
|
|
|
|
it "will not run a script that has already been run" do
|
|
worker.perform
|
|
expect do
|
|
worker.perform
|
|
end.to change(DataUpdateScript, :count).by(0)
|
|
end
|
|
|
|
it "updates DataUpdateScript model" do
|
|
expect do
|
|
worker.perform
|
|
end.to change(DataUpdateScript, :count).by(2)
|
|
|
|
successsful_dus = DataUpdateScript.find_by(status: :succeeded)
|
|
expect(successsful_dus.finished_at).not_to be_nil
|
|
expect(successsful_dus.run_at).not_to be_nil
|
|
expect(successsful_dus.error).to be_nil
|
|
|
|
failed_dus = DataUpdateScript.find_by(status: :failed)
|
|
expect(failed_dus.finished_at).not_to be_nil
|
|
expect(failed_dus.run_at).not_to be_nil
|
|
expect(failed_dus.run_at).not_to be_nil
|
|
expect(failed_dus.error).not_to be_nil
|
|
end
|
|
end
|
|
|
|
it "logs data to stdout", :aggregate_failures do
|
|
allow(Rails.logger).to receive(:info)
|
|
allow(Rails.logger).to receive(:error)
|
|
worker.perform
|
|
|
|
expect(Rails.logger).to have_received(:info).twice.with(/working/)
|
|
expect(Rails.logger).to have_received(:info).once.with(/succeeded/)
|
|
expect(Rails.logger).to have_received(:error).once.with(/failed/)
|
|
end
|
|
|
|
it "logs data to Datadog", :aggregate_failures do
|
|
allow(ForemStatsClient).to receive(:increment)
|
|
worker.perform
|
|
|
|
statuses.each do |status|
|
|
expected_args = [
|
|
"data_update_scripts.status",
|
|
{ tags: ["status:#{status}", "script_name:20200214151804_data_update_test_script"] },
|
|
]
|
|
expect(ForemStatsClient).to have_received(:increment).once.with(*expected_args)
|
|
end
|
|
end
|
|
end
|