diff --git a/app/controllers/admin/services_controller.rb b/app/controllers/admin/services_controller.rb index 2b6f335cb2b1cd18e6a7446c52f890e503cd6689..e335fbfffedfdffb839dc3e974063ba94bb7dee7 100644 --- a/app/controllers/admin/services_controller.rb +++ b/app/controllers/admin/services_controller.rb @@ -15,7 +15,9 @@ class Admin::ServicesController < Admin::ApplicationController end def update - if service.update_and_propagate(service_params[:service]) + if service.update_attributes(service_params[:service]) + PropagateProjectServiceWorker.perform_async(service.id) if service.active? + redirect_to admin_application_settings_services_path, notice: 'Application settings saved successfully' else diff --git a/app/models/service.rb b/app/models/service.rb index f85343877035e911285ee756b049dc16793f90ad..c71a7d169eca72f2d9cd3b5f9bdb4231107e348f 100644 --- a/app/models/service.rb +++ b/app/models/service.rb @@ -254,16 +254,6 @@ class Service < ActiveRecord::Base service end - def update_and_propagate(service_params) - return false unless update_attributes(service_params) - - if service_params[:active] - PropagateProjectServiceWorker.perform_async(id) - end - - true - end - private def cache_project_has_external_issue_tracker diff --git a/app/services/projects/propagate_service.rb b/app/services/projects/propagate_service.rb index 3c05dcce07c7a4e725acefef241fca27d29f0315..6e24a67d8b0b76ef849253a0bac75845851bf1e1 100644 --- a/app/services/projects/propagate_service.rb +++ b/app/services/projects/propagate_service.rb @@ -2,15 +2,15 @@ module Projects class PropagateService BATCH_SIZE = 100 - def self.propagate!(*args) - new(*args).propagate! + def self.propagate(*args) + new(*args).propagate end def initialize(template) @template = template end - def propagate! + def propagate return unless @template&.active Rails.logger.info("Propagating services for template #{@template.id}") @@ -28,7 +28,7 @@ module Projects batch.each { |project_id| create_from_template(project_id) } - break if batch.count < BATCH_SIZE + break if batch.size < BATCH_SIZE offset += BATCH_SIZE end diff --git a/app/workers/propagate_project_service_worker.rb b/app/workers/propagate_project_service_worker.rb index 6cc3fe846356a9d42494dafc9eb447660d384df5..5eabe4eaecdbca0ce32fedf48b491d4228b7baef 100644 --- a/app/workers/propagate_project_service_worker.rb +++ b/app/workers/propagate_project_service_worker.rb @@ -10,7 +10,7 @@ class PropagateProjectServiceWorker def perform(template_id) return unless try_obtain_lease_for(template_id) - Projects::PropagateService.propagate!(Service.find_by(id: template_id)) + Projects::PropagateService.propagate(Service.find_by(id: template_id)) end private diff --git a/spec/controllers/admin/services_controller_spec.rb b/spec/controllers/admin/services_controller_spec.rb index e5cdd52307ee4176e636337540c856969eb3b308..808c98edb7f13fd742866fc4d391c8f61ee4f604 100644 --- a/spec/controllers/admin/services_controller_spec.rb +++ b/spec/controllers/admin/services_controller_spec.rb @@ -23,4 +23,36 @@ describe Admin::ServicesController do end end end + + describe "#update" do + let(:project) { create(:empty_project) } + let!(:service) do + RedmineService.create( + project: project, + active: false, + template: true, + properties: { + project_url: 'http://abc', + issues_url: 'http://abc', + new_issue_url: 'http://abc' + } + ) + end + + it 'updates the service params successfully and calls the propagation worker' do + expect(PropagateProjectServiceWorker).to receive(:perform_async).with(service.id) + + put :update, id: service.id, service: { active: true } + + expect(response).to have_http_status(302) + end + + it 'updates the service params successfully' do + expect(PropagateProjectServiceWorker).not_to receive(:perform_async) + + put :update, id: service.id, service: { properties: {} } + + expect(response).to have_http_status(302) + end + end end diff --git a/spec/models/service_spec.rb b/spec/models/service_spec.rb index 3a7d8b729938be4f0880c92ae85aa77c3734199d..134882648b9b49a1e01e216e30aa15269db3d540 100644 --- a/spec/models/service_spec.rb +++ b/spec/models/service_spec.rb @@ -254,31 +254,4 @@ describe Service, models: true do end end end - - describe "#update_and_propagate" do - let(:project) { create(:empty_project) } - let!(:service) do - RedmineService.create( - project: project, - active: false, - properties: { - project_url: 'http://abc', - issues_url: 'http://abc', - new_issue_url: 'http://abc' - } - ) - end - - it 'updates the service params successfully and calls the propagation worker' do - expect(PropagateProjectServiceWorker).to receive(:perform_async).with(service.id) - - expect(service.update_and_propagate(active: true)).to be true - end - - it 'updates the service params successfully' do - expect(PropagateProjectServiceWorker).not_to receive(:perform_async) - - expect(service.update_and_propagate(properties: {})).to be true - end - end end diff --git a/spec/services/projects/propagate_service_spec.rb b/spec/services/projects/propagate_service_spec.rb index 409c14655cd3367022f625fb3bac0fe01bd00964..d4ec7c0b357bc207abf57caf24901a4fb255f04f 100644 --- a/spec/services/projects/propagate_service_spec.rb +++ b/spec/services/projects/propagate_service_spec.rb @@ -18,7 +18,7 @@ describe Projects::PropagateService, services: true do let!(:project) { create(:empty_project) } it 'creates services for projects' do - expect { described_class.propagate!(service_template) }. + expect { described_class.propagate(service_template) }. to change { Service.count }.by(1) end @@ -36,7 +36,7 @@ describe Projects::PropagateService, services: true do Service.build_from_template(project.id, other_service).save! - expect { described_class.propagate!(service_template) }. + expect { described_class.propagate(service_template) }. to change { Service.count }.by(1) end @@ -55,12 +55,12 @@ describe Projects::PropagateService, services: true do Service.build_from_template(project.id, service_template).save! Service.build_from_template(project.id, other_service).save! - expect { described_class.propagate!(service_template) }. + expect { described_class.propagate(service_template) }. not_to change { Service.count } end it 'creates the service containing the template attributes' do - described_class.propagate!(service_template) + described_class.propagate(service_template) service = Service.find_by(type: service_template.type, template: false) diff --git a/spec/workers/propagate_project_service_worker_spec.rb b/spec/workers/propagate_project_service_worker_spec.rb index c16e95bd49b6ee14e377e0e2cf05e3444044e8ff..4c7edbfcd3e4adc38c909a1c03c5ddf073e8ccfc 100644 --- a/spec/workers/propagate_project_service_worker_spec.rb +++ b/spec/workers/propagate_project_service_worker_spec.rb @@ -21,7 +21,7 @@ describe PropagateProjectServiceWorker do describe '#perform' do it 'calls the propagate service with the template' do - expect(Projects::PropagateService).to receive(:propagate!).with(service_template) + expect(Projects::PropagateService).to receive(:propagate).with(service_template) subject.perform(service_template.id) end