124 lines
3.9 KiB
Ruby
124 lines
3.9 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "rails_helper"
|
|
|
|
RSpec.describe Jobs::EnqueueReminders do
|
|
fab!(:assign_allowed_group) { Fabricate(:group) }
|
|
fab!(:user) { Fabricate(:user, groups: [assign_allowed_group]) }
|
|
|
|
before do
|
|
SiteSetting.remind_assigns_frequency = RemindAssignsFrequencySiteSettings::MONTHLY_MINUTES
|
|
SiteSetting.assign_enabled = true
|
|
SiteSetting.assign_allowed_on_groups = "#{assign_allowed_group.id}"
|
|
end
|
|
|
|
describe "#execute" do
|
|
it "does not enqueue reminders when there are no assigned tasks" do
|
|
assert_reminders_enqueued(0)
|
|
end
|
|
|
|
it "does not enqueue reminders when no groups are allowed to assign" do
|
|
SiteSetting.assign_allowed_on_groups = ""
|
|
|
|
assign_multiple_tasks_to(user)
|
|
|
|
assert_reminders_enqueued(0)
|
|
end
|
|
|
|
it "enqueues a reminder when the user has more than one task" do
|
|
assign_multiple_tasks_to(user)
|
|
|
|
assert_reminders_enqueued(1)
|
|
end
|
|
|
|
it "does not enqueue a reminder when the user only has one task" do
|
|
assign_one_task_to(user)
|
|
|
|
assert_reminders_enqueued(0)
|
|
end
|
|
|
|
it "doesn't count assigns from deleted topics" do
|
|
deleted_post = Fabricate(:post)
|
|
assign_one_task_to(user, post: deleted_post)
|
|
(PendingAssignsReminder::REMINDER_THRESHOLD - 1).times { assign_one_task_to(user) }
|
|
|
|
deleted_post.topic.trash!
|
|
|
|
assert_reminders_enqueued(0)
|
|
end
|
|
|
|
describe "assignment frequency" do
|
|
it "enqueues a reminder if the user reminder frequency is 1 day and the last reminded at is almost 1 day" do
|
|
user.custom_fields[
|
|
PendingAssignsReminder::REMINDERS_FREQUENCY
|
|
] = RemindAssignsFrequencySiteSettings::DAILY_MINUTES
|
|
user.custom_fields[PendingAssignsReminder::REMINDED_AT] = 1.days.ago +
|
|
(Jobs::EnqueueReminders::REMINDER_BUFFER_MINUTES - 1)
|
|
user.save
|
|
|
|
assign_multiple_tasks_to(user, assigned_on: 2.day.ago)
|
|
|
|
assert_reminders_enqueued(1)
|
|
end
|
|
|
|
it "does not enqueue a reminder if it's too soon" do
|
|
user.upsert_custom_fields(
|
|
PendingAssignsReminder::REMINDED_AT =>
|
|
1.days.ago + Jobs::EnqueueReminders::REMINDER_BUFFER_MINUTES,
|
|
)
|
|
assign_multiple_tasks_to(user)
|
|
|
|
assert_reminders_enqueued(0)
|
|
end
|
|
|
|
it "enqueues a reminder if the user was reminded more than a month ago" do
|
|
user.upsert_custom_fields(PendingAssignsReminder::REMINDED_AT => 31.days.ago)
|
|
assign_multiple_tasks_to(user)
|
|
|
|
assert_reminders_enqueued(1)
|
|
end
|
|
|
|
it "does not enqueue reminders if the remind frequency is set to never" do
|
|
SiteSetting.remind_assigns_frequency = 0
|
|
assign_multiple_tasks_to(user)
|
|
|
|
assert_reminders_enqueued(0)
|
|
end
|
|
|
|
it "does not enqueue reminders if the topic was just assigned to the user" do
|
|
just_assigned = DateTime.now
|
|
assign_multiple_tasks_to(user, assigned_on: just_assigned)
|
|
|
|
assert_reminders_enqueued(0)
|
|
end
|
|
|
|
it "enqueues a reminder when the user overrides the global frequency" do
|
|
SiteSetting.remind_assigns_frequency = 0
|
|
user.custom_fields.merge!(
|
|
PendingAssignsReminder::REMINDERS_FREQUENCY =>
|
|
RemindAssignsFrequencySiteSettings::DAILY_MINUTES,
|
|
)
|
|
user.save_custom_fields
|
|
|
|
assign_multiple_tasks_to(user)
|
|
|
|
assert_reminders_enqueued(1)
|
|
end
|
|
end
|
|
|
|
def assert_reminders_enqueued(expected_amount)
|
|
expect { subject.execute({}) }.to change(Jobs::RemindUser.jobs, :size).by(expected_amount)
|
|
end
|
|
|
|
def assign_one_task_to(user, assigned_on: 3.months.ago, post: Fabricate(:post))
|
|
freeze_time(assigned_on) { Assigner.new(post.topic, user).assign(user) }
|
|
end
|
|
|
|
def assign_multiple_tasks_to(user, assigned_on: 3.months.ago)
|
|
PendingAssignsReminder::REMINDER_THRESHOLD.times do
|
|
assign_one_task_to(user, assigned_on: assigned_on)
|
|
end
|
|
end
|
|
end
|
|
end
|