diff --git a/app/jobs/user_archive_job.rb b/app/jobs/user_archive_job.rb index 3a67d642..d254dd90 100644 --- a/app/jobs/user_archive_job.rb +++ b/app/jobs/user_archive_job.rb @@ -33,7 +33,18 @@ def migrate_keep_entities(user) key = entity_key(entity) records = entity.where({ key => user }) - records.each { |r| r.update({ key => global_archive_user }) && r.versions.destroy_all } + migrate_keep_entity_records(key, records) + end + end + + def migrate_keep_entity_records(key, records) + records.each do |r| + unless r.update({ key => global_archive_user }) + raise ActiveRecord::RecordInvalid.new(r), + "Failed to update #{r.class} record (ID: #{r.id})" + end + + r.versions.destroy_all end end diff --git a/app/models/form/response.rb b/app/models/form/response.rb index ad8016b9..38120719 100644 --- a/app/models/form/response.rb +++ b/app/models/form/response.rb @@ -8,7 +8,7 @@ class Response < ApplicationRecord has_many :closed_question_answers, dependent: :destroy has_many :closed_questions, through: :closed_question_answers, source: :question - validates :user, uniqueness: { scope: :form } + validates :user, uniqueness: { scope: :form, unless: -> { user_id == 0 } } # rubocop:disable Style/NumericPredicate validate :form_allows_responses? after_create :update_completed_status! diff --git a/spec/models/form/response_spec.rb b/spec/models/form/response_spec.rb index 431c278f..4174ecb9 100644 --- a/spec/models/form/response_spec.rb +++ b/spec/models/form/response_spec.rb @@ -28,6 +28,22 @@ it { expect(another_response).not_to be_valid } end + context 'when the user is archived' do + let(:archived_user) { create(:user, id: 0) } + let(:another_response) do + build(:response, form: form, user: archived_user) + end + let(:form) { create(:form) } + + before do + create(:response, form: form, user: archived_user) + end + + it 'allows multiple responses' do + expect(another_response).to be_valid + end + end + context 'when form is not published' do before do response.form.update(respond_from: 2.days.ago, respond_until: Date.yesterday)