diff --git a/app/services/ml/create_experiment_service.rb b/app/services/ml/create_experiment_service.rb index 8c49856fe150ca2ed456f9cdd2d7acb57e650fb0..bd623270df0d628658b59ad6edb9559c207b3bcb 100644 --- a/app/services/ml/create_experiment_service.rb +++ b/app/services/ml/create_experiment_service.rb @@ -15,6 +15,9 @@ def execute return error(experiment.errors.full_messages) unless experiment.persisted? success(experiment) + + rescue ActiveRecord::RecordNotUnique => e + error([e.message]) end private diff --git a/spec/services/ml/create_experiment_service_spec.rb b/spec/services/ml/create_experiment_service_spec.rb index 2f3a15746f1d018be13d7d0d229fbbd97843511d..be11365ab711b2ecb98e78e8baba516b1b6a2414 100644 --- a/spec/services/ml/create_experiment_service_spec.rb +++ b/spec/services/ml/create_experiment_service_spec.rb @@ -41,5 +41,28 @@ expect(response.message).to include("Name can't be blank") end end + + context 'when a RecordNotUnique error occurs' do + let_it_be(:pg_error) { 'PG::UniqueViolation: ERROR: duplicate key value violates unique constraint' } + + before do + allow_next_instance_of(::Ml::Experiment) do |experiment| + allow(experiment).to receive(:save).and_raise( + ActiveRecord::RecordNotUnique.new(pg_error) + ) + end + end + + it 'returns an error response with the exception message' do + response = create_experiment + + expect(response).to be_error + expect(response.message).to include(pg_error) + end + + it 'does not persist the experiment' do + expect { create_experiment }.not_to change { Ml::Experiment.count } + end + end end end