discourse/spec/models/directory_item_spec.rb
Osama Sayegh 3baf6233aa
FIX: Remove anonymous users from users directory ()
Anonymous users are "shadow" users created when an existing real user desires to post anonymously. This feature is off by default, but it can be enabled via the `allow_anonymous_posting` site setting. Those shadow users shouldn't be included in the users directory (`/u`).
2024-09-13 15:12:57 +03:00

204 lines
5.5 KiB
Ruby

# frozen_string_literal: true
RSpec.describe DirectoryItem do
describe "#period_types" do
context "when verifying enum sequence" do
before { @period_types = DirectoryItem.period_types }
it "'all' should be at 1st position" do
expect(@period_types[:all]).to eq(1)
end
it "'quarterly' should be at 6th position" do
expect(@period_types[:quarterly]).to eq(6)
end
end
end
describe "inactive and silenced users" do
it "removes silenced users correctly" do
post = create_post
DirectoryItem.refresh_period!(:daily)
count = DirectoryItem.where(user_id: post.user_id).count
expect(count).to eq(1)
post.user.update_columns(active: false)
DirectoryItem.refresh_period!(:daily)
count = DirectoryItem.where(user_id: post.user_id).count
expect(count).to eq(0)
post.user.update_columns(active: true)
DirectoryItem.refresh_period!(:daily)
count = DirectoryItem.where(user_id: post.user_id).count
expect(count).to eq(1)
post.user.update_columns(silenced_till: 1.year.from_now)
DirectoryItem.refresh_period!(:daily)
count = DirectoryItem.where(user_id: post.user_id).count
expect(count).to eq(0)
end
end
describe ".refresh!" do
before do
freeze_time_safe
UserActionManager.enable
end
it "creates the record for the user and handles likes" do
post = create_post
_post2 = create_post(topic_id: post.topic_id, user: post.user)
user2 = Fabricate(:user)
PostActionCreator.like(user2, post)
DirectoryItem.refresh!
item1 =
DirectoryItem.find_by(period_type: DirectoryItem.period_types[:all], user_id: post.user_id)
item2 =
DirectoryItem.find_by(period_type: DirectoryItem.period_types[:all], user_id: user2.id)
expect(item1.topic_count).to eq(1)
expect(item1.likes_received).to eq(1)
expect(item1.post_count).to eq(1)
expect(item2.likes_given).to eq(1)
post.topic.trash!
DirectoryItem.refresh!
item1 =
DirectoryItem.find_by(period_type: DirectoryItem.period_types[:all], user_id: post.user_id)
item2 =
DirectoryItem.find_by(period_type: DirectoryItem.period_types[:all], user_id: user2.id)
expect(item1.likes_given).to eq(0)
expect(item1.likes_received).to eq(0)
expect(item1.post_count).to eq(0)
expect(item1.topic_count).to eq(0)
end
it "handles users with no activity" do
post = nil
freeze_time(2.years.ago)
post = create_post
# Create records for that activity
DirectoryItem.refresh!
freeze_time(2.years.from_now)
DirectoryItem.refresh!
%i[yearly monthly weekly daily quarterly].each do |period|
directory_item =
DirectoryItem
.where(period_type: DirectoryItem.period_types[period])
.where(user_id: post.user.id)
.first
expect(directory_item.topic_count).to eq(0)
expect(directory_item.post_count).to eq(0)
end
directory_item =
DirectoryItem
.where(period_type: DirectoryItem.period_types[:all])
.where(user_id: post.user.id)
.first
expect(directory_item.topic_count).to eq(1)
end
it "creates directory item with correct activity count per period_type" do
user = Fabricate(:user)
UserVisit.create(
user_id: user.id,
visited_at: 1.minute.ago,
posts_read: 1,
mobile: false,
time_read: 1,
)
UserVisit.create(
user_id: user.id,
visited_at: 2.days.ago,
posts_read: 1,
mobile: false,
time_read: 1,
)
UserVisit.create(
user_id: user.id,
visited_at: 1.week.ago,
posts_read: 1,
mobile: false,
time_read: 1,
)
UserVisit.create(
user_id: user.id,
visited_at: 1.month.ago,
posts_read: 1,
mobile: false,
time_read: 1,
)
DirectoryItem.refresh!
daily_directory_item =
DirectoryItem
.where(period_type: DirectoryItem.period_types[:daily])
.where(user_id: user.id)
.first
expect(daily_directory_item.days_visited).to eq(1)
weekly_directory_item =
DirectoryItem
.where(period_type: DirectoryItem.period_types[:weekly])
.where(user_id: user.id)
.first
expect(weekly_directory_item.days_visited).to eq(2)
monthly_directory_item =
DirectoryItem
.where(period_type: DirectoryItem.period_types[:monthly])
.where(user_id: user.id)
.first
expect(monthly_directory_item.days_visited).to eq(3)
end
context "when must_approve_users is true" do
before { SiteSetting.must_approve_users = true }
it "doesn't include user who hasn't been approved" do
user = Fabricate(:user, approved: false)
DirectoryItem.refresh!
expect(DirectoryItem.where(user_id: user.id).count).to eq(0)
end
end
context "with anonymous posting" do
fab!(:user)
fab!(:group) { Fabricate(:group, users: [user]) }
before do
SiteSetting.allow_anonymous_posting = true
SiteSetting.anonymous_posting_allowed_groups = group.id.to_s
end
it "doesn't create records for anonymous users" do
anon = AnonymousShadowCreator.get(user)
DirectoryItem.refresh!
expect(DirectoryItem.where(user_id: anon.id)).to be_blank
expect(DirectoryItem.where(user_id: user.id)).to be_present
end
end
end
end