* 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
120 lines
3.9 KiB
Ruby
120 lines
3.9 KiB
Ruby
require "rails_helper"
|
|
|
|
RSpec.describe DataUpdateScript do
|
|
let(:test_directory) { Rails.root.join("spec/support/fixtures/data_update_scripts") }
|
|
|
|
describe "validations" do
|
|
describe "builtin validations" do
|
|
subject { create(:data_update_script) }
|
|
|
|
it { is_expected.to validate_presence_of(:file_name) }
|
|
it { is_expected.to validate_presence_of(:status) }
|
|
|
|
it { is_expected.to validate_uniqueness_of(:file_name) }
|
|
end
|
|
end
|
|
|
|
describe ".scripts_to_run" do
|
|
before { stub_const "#{described_class}::DIRECTORY", test_directory }
|
|
|
|
it "creates new DataUpdateScripts from files" do
|
|
expect do
|
|
described_class.scripts_to_run
|
|
end.to change(described_class, :count).by(2)
|
|
end
|
|
|
|
it "returns scripts that need to be run" do
|
|
script = create(:data_update_script)
|
|
expect(described_class.scripts_to_run).to include(script)
|
|
end
|
|
|
|
it "does not return script ids that are running" do
|
|
script = create(:data_update_script, run_at: Time.current, status: :working)
|
|
expect(described_class.scripts_to_run).not_to include(script)
|
|
end
|
|
|
|
it "orders scripts by name" do
|
|
create(:data_update_script, file_name: "456_test_script")
|
|
create(:data_update_script, file_name: "123_test_script")
|
|
expect(described_class.scripts_to_run.ids).to eq(described_class.scripts_to_run.order(file_name: :asc).ids)
|
|
end
|
|
end
|
|
|
|
describe ".scripts_to_run?" do
|
|
before { stub_const "#{described_class}::DIRECTORY", test_directory }
|
|
|
|
it "returns true for a new set of files" do
|
|
expect(described_class.scripts_to_run?).to be(true)
|
|
end
|
|
|
|
it "returns true if there is an enqueued script" do
|
|
create(:data_update_script, status: :enqueued)
|
|
expect(described_class.scripts_to_run?).to be(true)
|
|
end
|
|
|
|
it "returns true if there are multiple files on disk" do
|
|
create(:data_update_script, status: :working)
|
|
expect(described_class.scripts_to_run?).to be(true)
|
|
end
|
|
|
|
it "returns false if there are only working scripts" do
|
|
create_list(:data_update_script, 2, status: :working)
|
|
expect(described_class.scripts_to_run?).to be(false)
|
|
end
|
|
|
|
it "returns false if there are only succeeded scripts" do
|
|
create_list(:data_update_script, 2, status: :succeeded)
|
|
|
|
expect(described_class.scripts_to_run?).to be(false)
|
|
end
|
|
|
|
it "returns false if there are only failed scripts" do
|
|
create_list(:data_update_script, 2, status: :failed)
|
|
expect(described_class.scripts_to_run?).to be(false)
|
|
end
|
|
end
|
|
|
|
describe "#mark_as_finished!" do
|
|
it "marks data update script as finished" do
|
|
test_script = create(:data_update_script)
|
|
expect(test_script.finished_at).to be_nil
|
|
expect(test_script).to be_enqueued
|
|
test_script.mark_as_finished!
|
|
expect(test_script).to be_succeeded
|
|
expect(test_script.finished_at).not_to be_nil
|
|
end
|
|
end
|
|
|
|
describe "#mark_as_run!" do
|
|
it "marks data update script as working" do
|
|
test_script = create(:data_update_script)
|
|
expect(test_script.run_at).to be_nil
|
|
expect(test_script).to be_enqueued
|
|
test_script.mark_as_run!
|
|
expect(test_script).to be_working
|
|
expect(test_script.run_at).not_to be_nil
|
|
end
|
|
end
|
|
|
|
describe "#mark_as_failed!" do
|
|
it "marks data update script as failed" do
|
|
test_script = create(:data_update_script)
|
|
expect(test_script.finished_at).to be_nil
|
|
expect(test_script).to be_enqueued
|
|
test_script.mark_as_failed!(StandardError.new("error"))
|
|
expect(test_script).to be_failed
|
|
expect(test_script.error).to eq("StandardError: error")
|
|
expect(test_script.finished_at).not_to be_nil
|
|
end
|
|
end
|
|
|
|
describe "#file_path" do
|
|
it "returns correct loadable file_path" do
|
|
described_class.scripts_to_run.each do |script|
|
|
expect do
|
|
require script.file_path
|
|
end.not_to raise_error
|
|
end
|
|
end
|
|
end
|
|
end
|