mirror of
https://github.com/discourse/discourse.git
synced 2025-03-04 02:09:30 +00:00
Mailing list mode now includes the 'no echo' option: to only receive emails of posts not created by you. If you reply to an email thread in mailing list mode, your reply will not then be echoed back to you in a duplicate email by the system.
134 lines
4.7 KiB
Ruby
134 lines
4.7 KiB
Ruby
require 'rails_helper'
|
|
require_dependency 'jobs/base'
|
|
|
|
describe Jobs::EnqueueMailingListEmails do
|
|
|
|
describe '#target_users' do
|
|
|
|
context 'unapproved users' do
|
|
Given!(:unapproved_user) { Fabricate(:active_user, approved: false, first_seen_at: 24.hours.ago) }
|
|
When do
|
|
SiteSetting.must_approve_users = true
|
|
unapproved_user.user_option.update(mailing_list_mode: true, mailing_list_mode_frequency: 0)
|
|
end
|
|
Then { expect(Jobs::EnqueueMailingListEmails.new.target_user_ids.include?(unapproved_user.id)).to eq(false) }
|
|
|
|
# As a moderator
|
|
And { unapproved_user.update_column(:moderator, true) }
|
|
And { expect(Jobs::EnqueueMailingListEmails.new.target_user_ids.include?(unapproved_user.id)).to eq(true) }
|
|
|
|
# As an admin
|
|
And { unapproved_user.update_attributes(admin: true, moderator: false) }
|
|
And { expect(Jobs::EnqueueMailingListEmails.new.target_user_ids.include?(unapproved_user.id)).to eq(true) }
|
|
|
|
# As an approved user
|
|
And { unapproved_user.update_attributes(admin: false, moderator: false, approved: true ) }
|
|
And { expect(Jobs::EnqueueMailingListEmails.new.target_user_ids.include?(unapproved_user.id)).to eq(true) }
|
|
end
|
|
|
|
context 'staged users' do
|
|
let!(:staged_user) { Fabricate(:active_user, staged: true, last_emailed_at: 1.year.ago, last_seen_at: 1.year.ago) }
|
|
|
|
it "doesn't return staged users" do
|
|
expect(Jobs::EnqueueMailingListEmails.new.target_user_ids.include?(staged_user.id)).to eq(false)
|
|
end
|
|
end
|
|
|
|
context "inactive user" do
|
|
let!(:inactive_user) { Fabricate(:user, active: false) }
|
|
|
|
it "doesn't return users who have been emailed recently" do
|
|
expect(Jobs::EnqueueMailingListEmails.new.target_user_ids.include?(inactive_user.id)).to eq(false)
|
|
end
|
|
end
|
|
|
|
context "suspended user" do
|
|
let!(:suspended_user) { Fabricate(:user, suspended_till: 1.week.from_now, suspended_at: 1.day.ago) }
|
|
|
|
it "doesn't return users who are suspended" do
|
|
expect(Jobs::EnqueueMailingListEmails.new.target_user_ids.include?(suspended_user.id)).to eq(false)
|
|
end
|
|
end
|
|
|
|
context 'users with mailing list mode on' do
|
|
let(:user) { Fabricate(:active_user, first_seen_at: 24.hours.ago) }
|
|
let(:user_option) { user.user_option }
|
|
subject { Jobs::EnqueueMailingListEmails.new.target_user_ids }
|
|
before do
|
|
user_option.update(mailing_list_mode: true, mailing_list_mode_frequency: 0)
|
|
end
|
|
|
|
it "returns a user whose first_seen_at matches the current hour" do
|
|
expect(subject).to include user.id
|
|
end
|
|
|
|
it "returns a user seen multiple days ago" do
|
|
user.update(first_seen_at: 72.hours.ago)
|
|
expect(subject).to include user.id
|
|
end
|
|
|
|
it "doesn't return a user who has never been seen" do
|
|
user.update(first_seen_at: nil)
|
|
expect(subject).to_not include user.id
|
|
end
|
|
|
|
it "doesn't return users with mailing list mode off" do
|
|
user_option.update(mailing_list_mode: false)
|
|
expect(subject).to_not include user.id
|
|
end
|
|
|
|
it "doesn't return users with mailing list mode set to 'individual'" do
|
|
user_option.update(mailing_list_mode_frequency: 1)
|
|
expect(subject).to_not include user.id
|
|
end
|
|
|
|
it "doesn't return users with mailing list mode set to 'individual_excluding_own'" do
|
|
user_option.update(mailing_list_mode_frequency: 2)
|
|
expect(subject).to_not include user.id
|
|
end
|
|
|
|
it "doesn't return a user who has received the mailing list summary earlier" do
|
|
user.update(first_seen_at: 5.hours.ago)
|
|
expect(subject).to_not include user.id
|
|
end
|
|
|
|
it "doesn't return a user who was first seen today" do
|
|
user.update(first_seen_at: 2.minutes.ago)
|
|
expect(subject).to_not include user.id
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
describe '#execute' do
|
|
|
|
let(:user) { Fabricate(:user) }
|
|
|
|
context "mailing list emails are enabled" do
|
|
before do
|
|
Jobs::EnqueueMailingListEmails.any_instance.expects(:target_user_ids).returns([user.id])
|
|
end
|
|
|
|
it "enqueues the mailing list email job" do
|
|
Jobs.expects(:enqueue).with(:user_email, type: :mailing_list, user_id: user.id)
|
|
Jobs::EnqueueMailingListEmails.new.execute({})
|
|
end
|
|
end
|
|
|
|
context "mailing list emails are disabled" do
|
|
before do
|
|
Jobs::EnqueueMailingListEmails.any_instance.expects(:target_user_ids).never
|
|
end
|
|
|
|
it "does not enqueue the mailing list email job" do
|
|
SiteSetting.disable_mailing_list_mode = true
|
|
Jobs.expects(:enqueue).with(:user_email, type: :mailing_list, user_id: user.id).never
|
|
Jobs::EnqueueMailingListEmails.new.execute({})
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
|
|
end
|