docbrown/spec/workers/data_update_worker_spec.rb
Ridhwana 2dad0c42f8
Save Data Update Script errors to database and show them on http://localhost:3000/admin/data_update_scripts (#12348)
* 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
2021-01-21 14:48:34 +01:00

65 lines
2 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
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
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(DatadogStatsClient).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(DatadogStatsClient).to have_received(:increment).once.with(*expected_args)
end
end
end