DEV: Periodically delete old email change requests (#13054)

DEV: Periodically delete old email change requests (#13054)

Email change requests are never deleted no matter if they completed successfully or not. The abandoned requests have the disadvantage of showing up as unconfirmed emails in user’s preferences page.

diff --git a/app/jobs/scheduled/clean_up_email_change_requests.rb b/app/jobs/scheduled/clean_up_email_change_requests.rb
new file mode 100644
index 0000000..cd572b5
--- /dev/null
+++ b/app/jobs/scheduled/clean_up_email_change_requests.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module Jobs
+  class CleanUpEmailChangeRequests < ::Jobs::Scheduled
+    every 1.day
+
+    def execute(args)
+      EmailChangeRequest.where('updated_at < ?', 1.month.ago).delete_all
+    end
+  end
+end
diff --git a/spec/jobs/clean_up_email_change_requests_spec.rb b/spec/jobs/clean_up_email_change_requests_spec.rb
new file mode 100644
index 0000000..751d775
--- /dev/null
+++ b/spec/jobs/clean_up_email_change_requests_spec.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe Jobs::CleanUpEmailChangeRequests do
+  it "deletes records older than 1 month" do
+    very_old = Fabricate(:email_change_request, updated_at: 32.days.ago)
+    yesterday = Fabricate(:email_change_request, updated_at: 1.day.ago)
+    today = Fabricate(:email_change_request, updated_at: Time.zone.now)
+
+    expect { described_class.new.execute({}) }.to change { EmailChangeRequest.count }.by(-1)
+    expect { very_old.reload }.to raise_error(ActiveRecord::RecordNotFound)
+    expect(yesterday.reload).to be_present
+    expect(today.reload).to be_present
+  end
+end

GitHub sha: d903d4dc

This commit appears in #13054 which was approved by eviltrout. It was merged by udan11.