Add `User.unconfirmed` scope, reduce factories in `scheduler/user_cleanup` spec (#31063)

This commit is contained in:
Matt Jankowski 2024-07-25 10:18:24 -04:00 committed by GitHub
parent 34626b8291
commit e881a59671
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 18 additions and 15 deletions

View File

@ -117,6 +117,7 @@ class User < ApplicationRecord
scope :pending, -> { where(approved: false) } scope :pending, -> { where(approved: false) }
scope :approved, -> { where(approved: true) } scope :approved, -> { where(approved: true) }
scope :confirmed, -> { where.not(confirmed_at: nil) } scope :confirmed, -> { where.not(confirmed_at: nil) }
scope :unconfirmed, -> { where(confirmed_at: nil) }
scope :enabled, -> { where(disabled: false) } scope :enabled, -> { where(disabled: false) }
scope :disabled, -> { where(disabled: true) } scope :disabled, -> { where(disabled: true) }
scope :active, -> { confirmed.signed_in_recently.account_not_suspended } scope :active, -> { confirmed.signed_in_recently.account_not_suspended }

View File

@ -16,7 +16,7 @@ class Scheduler::UserCleanupScheduler
private private
def clean_unconfirmed_accounts! def clean_unconfirmed_accounts!
User.where('confirmed_at is NULL AND confirmation_sent_at <= ?', UNCONFIRMED_ACCOUNTS_MAX_AGE_DAYS.days.ago).reorder(nil).find_in_batches do |batch| User.unconfirmed.where(confirmation_sent_at: ..UNCONFIRMED_ACCOUNTS_MAX_AGE_DAYS.days.ago).reorder(nil).find_in_batches do |batch|
# We have to do it separately because of missing database constraints # We have to do it separately because of missing database constraints
AccountModerationNote.where(target_account_id: batch.map(&:account_id)).delete_all AccountModerationNote.where(target_account_id: batch.map(&:account_id)).delete_all
Account.where(id: batch.map(&:account_id)).delete_all Account.where(id: batch.map(&:account_id)).delete_all

View File

@ -12,29 +12,31 @@ describe Scheduler::UserCleanupScheduler do
describe '#perform' do describe '#perform' do
before do before do
# Need to update the already-existing users because their initialization overrides confirmation_sent_at # Update already-existing users because initialization overrides `confirmation_sent_at`
new_unconfirmed_user.update!(confirmed_at: nil, confirmation_sent_at: Time.now.utc) new_unconfirmed_user.update!(confirmed_at: nil, confirmation_sent_at: Time.now.utc)
old_unconfirmed_user.update!(confirmed_at: nil, confirmation_sent_at: 10.days.ago) old_unconfirmed_user.update!(confirmed_at: nil, confirmation_sent_at: 10.days.ago)
confirmed_user.update!(confirmed_at: 1.day.ago) confirmed_user.update!(confirmed_at: 1.day.ago)
end end
it 'deletes the old unconfirmed user, their account, and the moderation note' do it 'deletes the old unconfirmed user and metadata while preserving confirmed user and newer unconfirmed user' do
expect { subject.perform } expect { subject.perform }
.to change { User.exists?(old_unconfirmed_user.id) }.from(true).to(false) .to change { User.exists?(old_unconfirmed_user.id) }
.and change { Account.exists?(old_unconfirmed_user.account_id) }.from(true).to(false) .from(true).to(false)
expect { moderation_note.reload }.to raise_error(ActiveRecord::RecordNotFound) .and change { Account.exists?(old_unconfirmed_user.account_id) }
.from(true).to(false)
expect { moderation_note.reload }
.to raise_error(ActiveRecord::RecordNotFound)
expect_preservation_of(new_unconfirmed_user)
expect_preservation_of(confirmed_user)
end end
it 'does not delete the new unconfirmed user or their account' do private
subject.perform
expect(User.exists?(new_unconfirmed_user.id)).to be true
expect(Account.exists?(new_unconfirmed_user.account_id)).to be true
end
it 'does not delete the confirmed user or their account' do def expect_preservation_of(user)
subject.perform expect(User.exists?(user.id))
expect(User.exists?(confirmed_user.id)).to be true .to be true
expect(Account.exists?(confirmed_user.account_id)).to be true expect(Account.exists?(user.account_id))
.to be true
end end
end end
end end