diff --git a/app/services/namespaces/projects/assign_runtimes_service.rb b/app/services/namespaces/projects/assign_runtimes_service.rb index 918a424a..57697e90 100644 --- a/app/services/namespaces/projects/assign_runtimes_service.rb +++ b/app/services/namespaces/projects/assign_runtimes_service.rb @@ -24,6 +24,8 @@ def execute end namespace_project.runtimes = runtimes + namespace_project.primary_runtime = runtimes.first if runtimes.size == 1 + unless namespace_project.save t.rollback_and_return! ServiceResponse.error( message: 'Failed to assign runtimes to project', diff --git a/app/services/namespaces/projects/update_service.rb b/app/services/namespaces/projects/update_service.rb index a68a4728..0e65afb8 100644 --- a/app/services/namespaces/projects/update_service.rb +++ b/app/services/namespaces/projects/update_service.rb @@ -21,8 +21,13 @@ def execute params[:primary_runtime_id] = params.delete(:primary_runtime)&.id if params.key?(:primary_runtime) transactional do |t| - success = namespace_project.update(params) - unless success + namespace_project.assign_attributes(params) + + if namespace_project.primary_runtime_changed? + UpdateRuntimeCompatibilityJob.perform_later({ namespace_project_id: namespace_project.id }) + end + + unless namespace_project.save t.rollback_and_return! ServiceResponse.error( message: 'Failed to update namespace project', error_code: :invalid_namespace_project, diff --git a/spec/services/namespaces/projects/assign_runtimes_service_spec.rb b/spec/services/namespaces/projects/assign_runtimes_service_spec.rb index ece92755..0ec0b78d 100644 --- a/spec/services/namespaces/projects/assign_runtimes_service_spec.rb +++ b/spec/services/namespaces/projects/assign_runtimes_service_spec.rb @@ -57,9 +57,27 @@ target_type: 'NamespaceProject' ) end + + it 'queues job to update runtimes' do + allow(UpdateRuntimeCompatibilityJob).to receive(:perform_later) + + service_response + + expect(UpdateRuntimeCompatibilityJob).to have_received(:perform_later).with( + { namespace_project_id: project.id } + ) + end + + it { expect { service_response }.to change { project.reload.primary_runtime }.to(runtimes.first) } + + context 'when adding multiple runtimes' do + let(:runtimes) { 2.times.map { create(:runtime, namespace: project.namespace) } } + + it { expect { service_response }.not_to change { project.reload.primary_runtime } } + end end - context 'when removing a project' do + context 'when removing a runtime' do let(:runtime) { create(:runtime, namespace: project.namespace) } let!(:namespace_project_runtime_assignment) do create(:namespace_project_runtime_assignment, namespace_project: project, runtime: runtime) @@ -88,9 +106,19 @@ target_type: 'NamespaceProject' ) end + + it 'queues job to update runtimes' do + allow(UpdateRuntimeCompatibilityJob).to receive(:perform_later) + + service_response + + expect(UpdateRuntimeCompatibilityJob).to have_received(:perform_later).with( + { namespace_project_id: project.id } + ) + end end - context 'when adding and removing a project' do + context 'when adding and removing a runtime' do let(:runtime) { create(:runtime, namespace: project.namespace) } let!(:namespace_project_runtime_assignment) do create(:namespace_project_runtime_assignment, namespace_project: project, runtime: runtime) @@ -119,6 +147,16 @@ target_type: 'NamespaceProject' ) end + + it 'queues job to update runtimes' do + allow(UpdateRuntimeCompatibilityJob).to receive(:perform_later) + + service_response + + expect(UpdateRuntimeCompatibilityJob).to have_received(:perform_later).with( + { namespace_project_id: project.id } + ) + end end end end diff --git a/spec/services/namespaces/projects/update_service_spec.rb b/spec/services/namespaces/projects/update_service_spec.rb index 119ffa4f..5d25904e 100644 --- a/spec/services/namespaces/projects/update_service_spec.rb +++ b/spec/services/namespaces/projects/update_service_spec.rb @@ -70,5 +70,27 @@ target_type: 'NamespaceProject' ) end + + it 'queues job to update runtimes' do + allow(UpdateRuntimeCompatibilityJob).to receive(:perform_later) + + service_response + + expect(UpdateRuntimeCompatibilityJob).to have_received(:perform_later).with( + { namespace_project_id: namespace_project.id } + ) + end + + context 'without changing the primary runtime' do + let(:params) { { name: namespace_project_name } } + + it 'does not queue job to update runtimes' do + allow(UpdateRuntimeCompatibilityJob).to receive(:perform_later) + + service_response + + expect(UpdateRuntimeCompatibilityJob).not_to have_received(:perform_later) + end + end end end