diff options
author | Jason Robinson <mail@jasonrobinson.me> | 2014-09-30 00:20:36 +0400 |
---|---|---|
committer | Jason Robinson <mail@jasonrobinson.me> | 2014-10-16 23:53:08 +0400 |
commit | 69c35669585896249db1eb3e3487a30ae09cff46 (patch) | |
tree | 941488aaa4cbb611c926a626a8e02e939a281472 /spec/workers | |
parent | ef71c5719072d6dc314bf567c4300eb96e0dddfc (diff) |
Maintenance feature to remove old users
Add Sidetiq webview to the Sidekiq monitoring panel
Add rake task maintenance:queue_users_for_removal
This basically just triggers an immediate run of the normal maintenance remove old users functionality that is normally (if enabled) scheduled to run once a day via sidetiq
Add extra safety when checking for user removal due to inactivity.
Now also user.last_seen will also be checked to make sure a user will not be removed in the event that the Devise rememember me login functionality has stopped the users remove_after timestamp from being removed.
Add initializer for maintenance job.
Add warning about mail being disabled if remove_old_users maintenance is enabled.
Diffstat (limited to 'spec/workers')
-rw-r--r-- | spec/workers/queue_users_for_removal_spec.rb | 82 | ||||
-rw-r--r-- | spec/workers/remove_old_user_spec.rb | 52 |
2 files changed, 134 insertions, 0 deletions
diff --git a/spec/workers/queue_users_for_removal_spec.rb b/spec/workers/queue_users_for_removal_spec.rb new file mode 100644 index 000000000..6e00fe76c --- /dev/null +++ b/spec/workers/queue_users_for_removal_spec.rb @@ -0,0 +1,82 @@ +require 'spec_helper' + +describe Workers::QueueUsersForRemoval do + describe 'remove_old_users is active' do + before do + AppConfig.settings.maintenance.remove_old_users.enable = true + ActionMailer::Base.deliveries = nil + Timecop.freeze + end + + it '#does not queue user that is not inactive' do + user = FactoryGirl.create(:user, :last_seen => Time.now-728.days, :sign_in_count => 5) + Workers::QueueUsersForRemoval.new.perform + user.reload + expect(user.remove_after).to eq(nil) + expect(ActionMailer::Base.deliveries.count).to eq(0) + end + + it '#queues user that is inactive' do + removal_date = Time.now + (AppConfig.settings.maintenance.remove_old_users.warn_days.to_i).days + user = FactoryGirl.create(:user, :last_seen => Time.now-732.days, :sign_in_count => 5) + Workers::QueueUsersForRemoval.new.perform + user.reload + expect(user.remove_after.to_i).to eq(removal_date.utc.to_i) + expect(ActionMailer::Base.deliveries.count).to eq(1) + end + + it '#queues user that is inactive and has not logged in' do + removal_date = Time.now + user = FactoryGirl.create(:user, :last_seen => Time.now-735.days, :sign_in_count => 0) + Workers::QueueUsersForRemoval.new.perform + user.reload + expect(user.remove_after.to_i).to eq(removal_date.utc.to_i) + expect(ActionMailer::Base.deliveries.count).to eq(0) # no email sent + end + + it '#does not queue user that is not inactive and has not logged in' do + user = FactoryGirl.create(:user, :last_seen => Time.now-728.days, :sign_in_count => 0) + Workers::QueueUsersForRemoval.new.perform + user.reload + expect(user.remove_after).to eq(nil) + expect(ActionMailer::Base.deliveries.count).to eq(0) + end + + it '#does not queue user that has already been flagged for removal' do + removal_date = Date.today + 5.days + user = FactoryGirl.create(:user, :last_seen => Time.now-735.days, :sign_in_count => 5, :remove_after => removal_date) + Workers::QueueUsersForRemoval.new.perform + user.reload + expect(user.remove_after).to eq(removal_date) + expect(ActionMailer::Base.deliveries.count).to eq(0) + end + + after do + Timecop.return + end + end + + describe 'remove_old_users is inactive' do + before do + AppConfig.settings.maintenance.remove_old_users.enable = false + ActionMailer::Base.deliveries = nil + end + + it '#does not queue user that is not inactive' do + user = FactoryGirl.create(:user, :last_seen => Time.now-728.days, :sign_in_count => 5) + Workers::QueueUsersForRemoval.new.perform + user.reload + expect(user.remove_after).to eq(nil) + expect(ActionMailer::Base.deliveries.count).to eq(0) + end + + it '#does not queue user that is inactive' do + user = FactoryGirl.create(:user, :last_seen => Time.now-735.days, :sign_in_count => 5) + Workers::QueueUsersForRemoval.new.perform + user.reload + expect(user.remove_after).to eq(nil) + expect(ActionMailer::Base.deliveries.count).to eq(0) + end + + end +end diff --git a/spec/workers/remove_old_user_spec.rb b/spec/workers/remove_old_user_spec.rb new file mode 100644 index 000000000..12e0fad57 --- /dev/null +++ b/spec/workers/remove_old_user_spec.rb @@ -0,0 +1,52 @@ +require 'spec_helper' + +describe Workers::RemoveOldUser do + describe 'remove_old_users is active' do + before do + AppConfig.settings.maintenance.remove_old_users.enable = true + end + + it '#removes user whose remove_after timestamp has passed' do + user = double(id: 1, remove_after: 1.day.ago, last_seen: 1000.days.ago) + allow(User).to receive(:find).with(user.id).and_return(user) + expect(user).to receive(:close_account!) + Workers::RemoveOldUser.new.perform(user.id) + end + + it '#doesnt remove user whose remove_after timestamp hasnt passed' do + user = double(id: 1, remove_after: 1.day.from_now, last_seen: 1000.days.ago) + allow(User).to receive(:find).with(user.id).and_return(user) + expect(user).to_not receive(:close_account!) + Workers::RemoveOldUser.new.perform(user.id) + end + + it '#doesnt remove user whose remove_after timestamp has passed but last_seen is recent' do + user = double(id: 1, remove_after: 1.day.ago, last_seen: 1.day.ago) + allow(User).to receive(:find).with(user.id).and_return(user) + expect(user).to_not receive(:close_account!) + Workers::RemoveOldUser.new.perform(user.id) + end + + end + + describe 'remove_old_users is inactive' do + before do + AppConfig.settings.maintenance.remove_old_users.enable = false + end + + it '#doesnt remove user whose remove_after timestamp has passed' do + user = double(id: 1, remove_after: 1.day.ago, last_seen: 1000.days.ago) + allow(User).to receive(:find).with(user.id).and_return(user) + expect(user).to_not receive(:close_account!) + Workers::RemoveOldUser.new.perform(user.id) + end + + it '#doesnt remove user whose remove_after timestamp hasnt passed' do + user = double(id: 1, remove_after: 1.day.from_now, last_seen: 1000.days.ago) + allow(User).to receive(:find).with(user.id).and_return(user) + expect(user).to_not receive(:close_account!) + Workers::RemoveOldUser.new.perform(user.id) + end + + end +end |