mirror of
https://github.com/discourse/discourse.git
synced 2025-05-22 21:01:04 +08:00
FEATURE: set notification levels when added to a group (#10378)
* FEATURE: set notification levels when added to a group This feature allows admins and group owners to define default category and tag tracking levels that will be applied to user preferences automatically at the time when users are added to the group. Users are free to change those preferences afterwards. When removed from a group, the user's notification preferences aren't changed.
This commit is contained in:
@ -1054,4 +1054,121 @@ describe Group do
|
||||
expect(group.name).to eq("Bücherwurm") # NFC
|
||||
end
|
||||
end
|
||||
|
||||
describe "default notifications" do
|
||||
let(:category1) { Fabricate(:category) }
|
||||
let(:category2) { Fabricate(:category) }
|
||||
let(:category3) { Fabricate(:category) }
|
||||
let(:tag1) { Fabricate(:tag) }
|
||||
let(:tag2) { Fabricate(:tag) }
|
||||
let(:tag3) { Fabricate(:tag) }
|
||||
let(:synonym1) { Fabricate(:tag, target_tag: tag1) }
|
||||
let(:synonym2) { Fabricate(:tag, target_tag: tag2) }
|
||||
|
||||
it "can set category notifications" do
|
||||
group.watching_category_ids = [category1.id, category2.id]
|
||||
group.tracking_category_ids = [category3.id]
|
||||
group.save!
|
||||
expect(GroupCategoryNotificationDefault.lookup(group, :watching).pluck(:category_id)).to contain_exactly(category1.id, category2.id)
|
||||
expect(GroupCategoryNotificationDefault.lookup(group, :tracking).pluck(:category_id)).to eq([category3.id])
|
||||
|
||||
new_group = Fabricate.build(:group)
|
||||
new_group.watching_category_ids = [category1.id, category2.id]
|
||||
new_group.save!
|
||||
expect(GroupCategoryNotificationDefault.lookup(new_group, :watching).pluck(:category_id)).to contain_exactly(category1.id, category2.id)
|
||||
end
|
||||
|
||||
it "can remove categories" do
|
||||
[category1, category2].each do |category|
|
||||
GroupCategoryNotificationDefault.create!(
|
||||
group: group,
|
||||
category: category,
|
||||
notification_level: GroupCategoryNotificationDefault.notification_levels[:watching]
|
||||
)
|
||||
end
|
||||
|
||||
group.watching_category_ids = [category2.id]
|
||||
group.save!
|
||||
expect(GroupCategoryNotificationDefault.lookup(group, :watching).pluck(:category_id)).to eq([category2.id])
|
||||
|
||||
group.watching_category_ids = []
|
||||
group.save!
|
||||
expect(GroupCategoryNotificationDefault.lookup(group, :watching).pluck(:category_id)).to be_empty
|
||||
end
|
||||
|
||||
it "can set tag notifications" do
|
||||
group.watching_tags = [tag1.name, tag2.name]
|
||||
group.tracking_tags = [tag3.name]
|
||||
group.save!
|
||||
expect(GroupTagNotificationDefault.lookup(group, :watching).pluck(:tag_id)).to contain_exactly(tag1.id, tag2.id)
|
||||
expect(GroupTagNotificationDefault.lookup(group, :tracking).pluck(:tag_id)).to eq([tag3.id])
|
||||
|
||||
new_group = Fabricate.build(:group)
|
||||
new_group.watching_first_post_tags = [tag1.name, tag3.name]
|
||||
new_group.save!
|
||||
expect(GroupTagNotificationDefault.lookup(new_group, :watching_first_post).pluck(:tag_id)).to contain_exactly(tag1.id, tag3.id)
|
||||
end
|
||||
|
||||
it "can take tag synonyms" do
|
||||
group.tracking_tags = [synonym1.name, synonym2.name, tag3.name]
|
||||
group.save!
|
||||
expect(GroupTagNotificationDefault.lookup(group, :tracking).pluck(:tag_id)).to contain_exactly(tag1.id, tag2.id, tag3.id)
|
||||
|
||||
group.tracking_tags = [synonym1.name, synonym2.name, tag1.name, tag2.name, tag3.name]
|
||||
group.save!
|
||||
expect(GroupTagNotificationDefault.lookup(group, :tracking).pluck(:tag_id)).to contain_exactly(tag1.id, tag2.id, tag3.id)
|
||||
end
|
||||
|
||||
it "can remove tags" do
|
||||
[tag1, tag2].each do |tag|
|
||||
GroupTagNotificationDefault.create!(
|
||||
group: group,
|
||||
tag: tag,
|
||||
notification_level: GroupTagNotificationDefault.notification_levels[:watching]
|
||||
)
|
||||
end
|
||||
|
||||
group.watching_tags = [tag2.name]
|
||||
group.save!
|
||||
expect(GroupTagNotificationDefault.lookup(group, :watching).pluck(:tag_id)).to eq([tag2.id])
|
||||
|
||||
group.watching_tags = []
|
||||
group.save!
|
||||
expect(GroupTagNotificationDefault.lookup(group, :watching)).to be_empty
|
||||
end
|
||||
|
||||
it "can apply default notifications for admins group" do
|
||||
group = Group.find(Group::AUTO_GROUPS[:admins])
|
||||
group.tracking_category_ids = [category1.id]
|
||||
group.tracking_tags = [tag1.name]
|
||||
group.save!
|
||||
user.grant_admin!
|
||||
expect(CategoryUser.lookup(user, :tracking).pluck(:category_id)).to eq([category1.id])
|
||||
expect(TagUser.lookup(user, :tracking).pluck(:tag_id)).to eq([tag1.id])
|
||||
end
|
||||
|
||||
it "can apply default notifications for staff group" do
|
||||
group = Group.find(Group::AUTO_GROUPS[:staff])
|
||||
group.tracking_category_ids = [category1.id]
|
||||
group.tracking_tags = [tag1.name]
|
||||
group.save!
|
||||
user.grant_admin!
|
||||
expect(CategoryUser.lookup(user, :tracking).pluck(:category_id)).to eq([category1.id])
|
||||
expect(TagUser.lookup(user, :tracking).pluck(:tag_id)).to eq([tag1.id])
|
||||
end
|
||||
|
||||
it "can apply default notifications from two automatic groups" do
|
||||
staff = Group.find(Group::AUTO_GROUPS[:staff])
|
||||
staff.tracking_category_ids = [category1.id]
|
||||
staff.tracking_tags = [tag1.name]
|
||||
staff.save!
|
||||
admins = Group.find(Group::AUTO_GROUPS[:admins])
|
||||
admins.tracking_category_ids = [category2.id]
|
||||
admins.tracking_tags = [tag2.name]
|
||||
admins.save!
|
||||
user.grant_admin!
|
||||
expect(CategoryUser.lookup(user, :tracking).pluck(:category_id)).to contain_exactly(category1.id, category2.id)
|
||||
expect(TagUser.lookup(user, :tracking).pluck(:tag_id)).to contain_exactly(tag1.id, tag2.id)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
Reference in New Issue
Block a user