diff --git a/app/controllers/admin/vouchers_controller.rb b/app/controllers/admin/vouchers_controller.rb index 33093bb07d..72bb759e10 100644 --- a/app/controllers/admin/vouchers_controller.rb +++ b/app/controllers/admin/vouchers_controller.rb @@ -22,6 +22,11 @@ module Admin rescue ActiveRecord::SubclassNotFound @voucher.errors.add(:type) render_error + rescue ActiveRecord::RecordNotUnique + # Rails unique validation doesn't work with soft deleted object, so we rescue the database + # exception to display a nice message to the user + @voucher.errors.add(:code, :taken) + render_error end private diff --git a/spec/requests/admin/vouchers_spec.rb b/spec/requests/admin/vouchers_spec.rb index 86242e0ef1..f3ae69d573 100644 --- a/spec/requests/admin/vouchers_spec.rb +++ b/spec/requests/admin/vouchers_spec.rb @@ -81,6 +81,20 @@ describe "/admin/enterprises/:enterprise_id/vouchers", type: :request do end end + context "with a code used by a deactivated voucher" do + before do + voucher = create(:voucher, code:, enterprise:) + voucher.destroy + end + + it "render the new page with a code taken error" do + create_voucher + + expect(response).to render_template("admin/vouchers/new") + expect(flash[:error]).to eq("Code has already been taken") + end + end + it "redirects to admin enterprise setting page, voucher panel" do create_voucher