From a38a793e89c430f696652266357ef619954ea3ca Mon Sep 17 00:00:00 2001 From: Kat Date: Wed, 14 Aug 2024 09:18:08 +0100 Subject: [PATCH] Add start merge and merge request job --- app/controllers/merge_requests_controller.rb | 9 ++++++ app/jobs/process_merge_request_job.rb | 11 +++++++ app/models/merge_request_organisation.rb | 7 ++++ app/views/merge_requests/show.html.erb | 4 ++- config/routes.rb | 1 + spec/jobs/process_merge_request_job_spec.rb | 29 +++++++++++++++++ .../merge_requests_controller_spec.rb | 32 +++++++++++++++++++ 7 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 app/jobs/process_merge_request_job.rb create mode 100644 spec/jobs/process_merge_request_job_spec.rb diff --git a/app/controllers/merge_requests_controller.rb b/app/controllers/merge_requests_controller.rb index 95be8d875..f19224a92 100644 --- a/app/controllers/merge_requests_controller.rb +++ b/app/controllers/merge_requests_controller.rb @@ -61,6 +61,15 @@ class MergeRequestsController < ApplicationController @new_merging_org_ids = [] end + def start_merge + if @merge_request.status == "ready_to_merge" + @merge_request.update!(status: :processing) + ProcessMergeRequestJob.perform_later(merge_request: @merge_request) + end + + redirect_to merge_request_path(@merge_request) + end + private def page diff --git a/app/jobs/process_merge_request_job.rb b/app/jobs/process_merge_request_job.rb new file mode 100644 index 000000000..5f071d442 --- /dev/null +++ b/app/jobs/process_merge_request_job.rb @@ -0,0 +1,11 @@ +class ProcessMergeRequestJob < ApplicationJob + queue_as :default + + def perform(merge_request:) + absorbing_organisation_id = merge_request.absorbing_organisation_id + merging_organisation_ids = merge_request.merging_organisations.pluck(:id) + merge_date = merge_request.merge_date + + Merge::MergeOrganisationsService.new(absorbing_organisation_id:, merging_organisation_ids:, merge_date:).call + end +end diff --git a/app/models/merge_request_organisation.rb b/app/models/merge_request_organisation.rb index e181ca304..18a77d93a 100644 --- a/app/models/merge_request_organisation.rb +++ b/app/models/merge_request_organisation.rb @@ -8,12 +8,19 @@ class MergeRequestOrganisation < ApplicationRecord scope :merged, -> { joins(:merge_request).where(merge_requests: { status: "request_merged" }) } scope :with_merging_organisation, ->(merging_organisation) { where(merging_organisation:) } + after_save :update_merge_request_status + has_paper_trail def merging_organisation_name merging_organisation.name || "" end + def update_merge_request_status + merge_request.update_status! + merge_request.save! + end + private def validate_merging_organisations diff --git a/app/views/merge_requests/show.html.erb b/app/views/merge_requests/show.html.erb index ce4fbb38d..e97474cd3 100644 --- a/app/views/merge_requests/show.html.erb +++ b/app/views/merge_requests/show.html.erb @@ -27,7 +27,9 @@ <% unless @merge_request.status == "request_merged" %>
- <%= govuk_button_link_to "Begin merge", "#", disabled: @merge_request.status != "ready_to_merge" %> + <%= form_with model: @merge_request, url: start_merge_merge_request_path(@merge_request) do |f| %> + <%= f.govuk_submit "Begin merge", disabled: @merge_request.status != "ready_to_merge" %> + <% end %> <%= govuk_button_link_to "Delete merge request", delete_confirmation_merge_request_path(@merge_request), warning: true %>
<% end %> diff --git a/config/routes.rb b/config/routes.rb index ecdb8f2c1..ebbb588ca 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -203,6 +203,7 @@ Rails.application.routes.draw do get "helpdesk-ticket" get "delete-confirmation", to: "merge_requests#delete_confirmation" delete "delete", to: "merge_requests#delete" + patch "start-merge", to: "merge_requests#start_merge" end end diff --git a/spec/jobs/process_merge_request_job_spec.rb b/spec/jobs/process_merge_request_job_spec.rb new file mode 100644 index 000000000..a1706d406 --- /dev/null +++ b/spec/jobs/process_merge_request_job_spec.rb @@ -0,0 +1,29 @@ +require "rails_helper" + +describe ProcessMergeRequestJob do + let(:job) { described_class.new } + let(:merge_organisations_service) { instance_double(Merge::MergeOrganisationsService) } + + before do + allow(Merge::MergeOrganisationsService).to receive(:new).and_return(merge_organisations_service) + allow(merge_organisations_service).to receive(:call).and_return(nil) + end + + context "when processing a merge request" do + let(:organisation) { create(:organisation) } + let(:merging_organisation) { create(:organisation) } + let(:other_merging_organisation) { create(:organisation) } + let(:merge_request) { MergeRequest.create!(requesting_organisation: organisation, absorbing_organisation: organisation, merge_date: Time.zone.local(2022, 3, 3)) } + + before do + create(:merge_request_organisation, merge_request:, merging_organisation:) + create(:merge_request_organisation, merge_request:, merging_organisation: other_merging_organisation) + end + + it "calls the merge organisations service with correct arguments" do + expect(Merge::MergeOrganisationsService).to receive(:new).with(absorbing_organisation_id: organisation.id, merging_organisation_ids: [merging_organisation.id, other_merging_organisation.id], merge_date: Time.zone.local(2022, 3, 3)) + + job.perform(merge_request:) + end + end +end diff --git a/spec/requests/merge_requests_controller_spec.rb b/spec/requests/merge_requests_controller_spec.rb index 865b75ba1..84457362d 100644 --- a/spec/requests/merge_requests_controller_spec.rb +++ b/spec/requests/merge_requests_controller_spec.rb @@ -364,6 +364,38 @@ RSpec.describe MergeRequestsController, type: :request do end end end + + describe "#start_merge" do + let(:merge_request) { MergeRequest.create!(requesting_organisation: organisation, absorbing_organisation: organisation, merge_date: Time.zone.local(2022, 3, 3)) } + let(:merging_organisation) { create(:organisation, name: "Merging Test Org") } + + before do + allow(ProcessMergeRequestJob).to receive(:perform_later).and_return(nil) + end + + context "when merge request is ready to merge" do + before do + create(:merge_request_organisation, merge_request:, merging_organisation: other_organisation) + create(:merge_request_organisation, merge_request:, merging_organisation:) + end + + it "runs the job with correct merge request" do + expect(merge_request.reload.status).to eq("ready_to_merge") + expect(ProcessMergeRequestJob).to receive(:perform_later).with(merge_request:).once + patch "/merge-request/#{merge_request.id}/start-merge" + expect(merge_request.reload.status).to eq("processing") + end + end + + context "when merge request is not ready to merge" do + it "does not run the job" do + expect(merge_request.status).to eq("incomplete") + expect(ProcessMergeRequestJob).not_to receive(:perform_later).with(merge_request:) + patch "/merge-request/#{merge_request.id}/start-merge" + expect(merge_request.reload.status).to eq("incomplete") + end + end + end end context "when user is signed in with a data coordinator user" do