diff --git a/lib/tasks/merge_organisations.rake b/lib/tasks/merge_organisations.rake index 0df38a2ac..820343883 100644 --- a/lib/tasks/merge_organisations.rake +++ b/lib/tasks/merge_organisations.rake @@ -2,7 +2,7 @@ namespace :merge do desc "Merge organisations into one" task :merge_organisations, %i[absorbing_organisation_id merging_organisation_ids] => :environment do |_task, args| absorbing_organisation_id = args[:absorbing_organisation_id] - merging_organisation_ids = args[:merging_organisation_ids]&.split(",")&.map(&:to_i) + merging_organisation_ids = args[:merging_organisation_ids]&.split(" ")&.map(&:to_i) raise "Usage: rake merge:merge_organisations[absorbing_organisation_id, merging_organisation_ids]" if merging_organisation_ids.blank? || absorbing_organisation_id.blank? diff --git a/spec/lib/tasks/merge_organisations_spec.rb b/spec/lib/tasks/merge_organisations_spec.rb index efb3fe99d..4155a4389 100644 --- a/spec/lib/tasks/merge_organisations_spec.rb +++ b/spec/lib/tasks/merge_organisations_spec.rb @@ -28,13 +28,13 @@ RSpec.describe "emails" do end it "raises an error when only merging organisations are given" do - expect { task.invoke(nil, "1,2") }.to raise_error(RuntimeError, "Usage: rake merge:merge_organisations[absorbing_organisation_id, merging_organisation_ids]") + expect { task.invoke(nil, "1 2") }.to raise_error(RuntimeError, "Usage: rake merge:merge_organisations[absorbing_organisation_id, merging_organisation_ids]") end it "raises runs the service with correct organisation IDs" do expect(Merge::MergeOrganisationsService).to receive(:new).with(absorbing_organisation_id: 1, merging_organisation_ids: [2, 3]).once expect(merge_organisations_service).to receive(:call).once - task.invoke(1, "2,3") + task.invoke(1, "2 3") end end end diff --git a/spec/services/merge/merge_organisations_service_spec.rb b/spec/services/merge/merge_organisations_service_spec.rb index 9ec6144b7..10cff2aa9 100644 --- a/spec/services/merge/merge_organisations_service_spec.rb +++ b/spec/services/merge/merge_organisations_service_spec.rb @@ -45,7 +45,7 @@ RSpec.describe Merge::MergeOrganisationsService do absorbing_organisation.reload expect(absorbing_organisation.holds_own_stock).to eq(false) - # expect(merging_organisation.merge_date).to eq(nil) + expect(merging_organisation.merge_date).to eq(nil) expect(merging_organisation_user.organisation).to eq(merging_organisation) end @@ -205,5 +205,55 @@ RSpec.describe Merge::MergeOrganisationsService do end end end + + context "when merging a multiple organisations into an existing organisation" do + let(:merging_organisation) { create(:organisation, holds_own_stock: true, name: "fake org") } + let(:merging_organisation_too) { create(:organisation, holds_own_stock: true, name: "second org") } + + let(:merging_organisation_ids) { [merging_organisation.id, merging_organisation_too.id] } + let!(:merging_organisation_user) { create(:user, organisation: merging_organisation, name: "fake name", email: "fake@email.com") } + + before do + create_list(:user, 5, organisation: merging_organisation_too) + end + + it "moves the users from merging organisations to absorbing organisation" do + expect(Rails.logger).to receive(:info).with(/Merged users from second org:/) + expect(Rails.logger).to receive(:info).with("New schemes from fake org:\nNew schemes from second org:\n") + merge_organisations_service.call + + merging_organisation_user.reload + expect(merging_organisation_user.organisation).to eq(absorbing_organisation) + end + + it "sets merge date on merged organisations" do + merge_organisations_service.call + + merging_organisation.reload + merging_organisation_too.reload + expect(merging_organisation.merge_date.to_date).to eq(Time.zone.today) + expect(merging_organisation_too.merge_date.to_date).to eq(Time.zone.today) + end + + it "combines organisation data" do + merge_organisations_service.call + + absorbing_organisation.reload + expect(absorbing_organisation.holds_own_stock).to eq(true) + end + + it "rolls back if there's an error" do + allow(Organisation).to receive(:find).with([merging_organisation_ids]).and_return(Organisation.find(merging_organisation_ids)) + allow(Organisation).to receive(:find).with(absorbing_organisation.id).and_return(absorbing_organisation) + allow(absorbing_organisation).to receive(:save!).and_raise(ActiveRecord::RecordInvalid) + expect(Rails.logger).to receive(:error).with("Organisation merge failed with: Record invalid") + merge_organisations_service.call + + absorbing_organisation.reload + expect(absorbing_organisation.holds_own_stock).to eq(false) + expect(merging_organisation.merge_date).to eq(nil) + expect(merging_organisation_user.organisation).to eq(merging_organisation) + end + end end end