discourse-follow/spec/models/user_follower_spec.rb
Osama Sayegh a793b220ee
FIX: Hide follower status to users with hidden profiles (#45)
If a user you follow hides their profile, we were not allowing user to unfollow, causing confusion and problems.
2021-12-30 10:34:55 +11:00

166 lines
6.7 KiB
Ruby

# frozen_string_literal: true
require "rails_helper"
describe UserFollower do
fab!(:admin) { Fabricate(:admin) }
fab!(:follower) { Fabricate(:user) }
fab!(:not_followed) { Fabricate(:user) }
fab!(:followed) { Fabricate(:user) }
fab!(:followed2) { Fabricate(:user) }
fab!(:group) { Fabricate(:group) }
fab!(:secure_category) { Fabricate(:private_category, group: group) }
before do
Follow::Updater.new(follower, followed).watch_follow
Follow::Updater.new(follower, followed2).watch_follow
end
context ".posts_for" do
it "does not show posts in PMs" do
Fabricate(:private_message_post, user: followed)
posts = UserFollower.posts_for(follower, current_user: admin)
expect(posts.pluck(:id)).to be_blank
end
it "does not show posts in unlisted topics" do
post = Fabricate(:post, user: followed)
post.topic.update_status('visible', false, Discourse.system_user)
posts = UserFollower.posts_for(follower, current_user: admin)
expect(posts.pluck(:id)).to be_blank
end
it "does not show posts in secured categories that current user does " \
"not have access to" do
post = Fabricate(:post, user: followed, topic: Fabricate(:topic, category: secure_category))
posts = UserFollower.posts_for(follower, current_user: follower)
expect(posts.pluck(:id)).to be_blank
end
it "does not show deleted posts" do
post = Fabricate(:post, user: followed)
post.update!(deleted_at: 1.minute.ago)
posts = UserFollower.posts_for(follower, current_user: admin)
expect(posts.pluck(:id)).to be_blank
end
it "does not show posts in deleted topics" do
post = Fabricate(:post, user: followed)
post.topic.update!(deleted_at: 1.minute.ago)
posts = UserFollower.posts_for(follower, current_user: admin)
expect(posts.pluck(:id)).to be_blank
end
it "does not show whispers if current user cannot see them" do
Fabricate(:whisper, user: followed)
posts = UserFollower.posts_for(follower, current_user: follower)
expect(posts.pluck(:id)).to be_blank
end
it "shows whispers if current user can see them" do
post = Fabricate(:whisper, user: followed)
posts = UserFollower.posts_for(follower, current_user: admin)
expect(posts.pluck(:id)).to contain_exactly(post.id)
end
it "shows posts in uncategorized topics" do
post = Fabricate(:post, user: followed, topic: Fabricate(:topic, category_id: SiteSetting.uncategorized_category_id))
posts = UserFollower.posts_for(follower, current_user: follower)
expect(posts.pluck(:id)).to contain_exactly(post.id)
end
it "does not show small action posts" do
Fabricate(:small_action, user: followed)
posts = UserFollower.posts_for(follower, current_user: follower)
expect(posts.pluck(:id)).to be_blank
end
it "shows posts made by followed users only" do
expected = []
post = Fabricate(:post, user: followed)
expected << post
expected << Fabricate(:post, user: followed, topic: post.topic)
expected << Fabricate(:post, user: followed2, topic: post.topic)
expected << Fabricate(:post, user: followed2)
Fabricate(:post, user: not_followed)
Fabricate(:post, user: not_followed, topic: post.topic)
posts = UserFollower.posts_for(follower, current_user: follower)
expect(posts.pluck(:id)).to contain_exactly(*expected.pluck(:id))
end
it "can limit the number of returned posts" do
5.times do |n|
Fabricate(:post, user: [followed, followed2].sample, created_at: n.hours.ago)
end
posts = UserFollower.posts_for(follower, current_user: follower, limit: 3)
expect(posts.size).to eq(3)
posts = UserFollower.posts_for(follower, current_user: follower, limit: 6)
expect(posts.size).to eq(5)
end
it "orders returned posts in reversed chronological order" do
post1 = Fabricate(:post, user: followed, created_at: 3.hours.ago)
post2 = Fabricate(:post, user: followed, created_at: 1.hours.ago)
post3 = Fabricate(:post, user: followed, created_at: 9.hours.ago)
posts = UserFollower.posts_for(follower, current_user: follower, limit: 3)
expect(posts.pluck(:id)).to eq([post2.id, post1.id, post3.id])
end
it "does not include posts from followed users who have disabled follows" do
post1 = Fabricate(:post, user: followed)
post2 = Fabricate(:post, user: followed2)
followed.custom_fields["allow_people_to_follow_me"] = false
followed.save!
posts = UserFollower.posts_for(follower, current_user: follower)
expect(posts.pluck(:id)).to contain_exactly(post2.id)
end
it "does not include posts from followed users who have hidden their profile" do
post1 = Fabricate(:post, user: followed)
post2 = Fabricate(:post, user: followed2)
followed.user_option.update!(hide_profile_and_presence: true)
posts = UserFollower.posts_for(follower, current_user: follower)
expect(posts.pluck(:id)).to contain_exactly(post2.id)
end
it "does not include small action posts" do
post1 = Fabricate(:post, user: followed, post_type: Post.types[:small_action])
post2 = Fabricate(:post, user: followed, post_type: Post.types[:small_action], action_code: "closed.enabled")
post3 = Fabricate(:post, user: followed, post_type: Post.types[:whisper], action_code: "assigned")
follower.update!(admin: true)
posts = UserFollower.posts_for(follower, current_user: follower)
expect(posts.pluck(:id)).to be_blank
end
it "includes moderator posts" do
post1 = Fabricate(:post, user: followed, post_type: Post.types[:moderator_action])
posts = UserFollower.posts_for(follower, current_user: follower)
expect(posts.pluck(:id)).to contain_exactly(post1.id)
end
context "when default_allow_people_to_follow_me setting is false" do
before do
SiteSetting.default_allow_people_to_follow_me = false
end
it "only include posts if followed user has explicitly allowed people to follow them" do
post1 = Fabricate(:post, user: followed)
post2 = Fabricate(:post, user: followed2)
followed.custom_fields["allow_people_to_follow_me"] = true
followed.save!
posts = UserFollower.posts_for(follower, current_user: follower)
expect(posts.pluck(:id)).to contain_exactly(post1.id)
followed.custom_fields["allow_people_to_follow_me"] = false
followed.save!
followed2.custom_fields["allow_people_to_follow_me"] = true
followed2.save!
posts = UserFollower.posts_for(follower, current_user: follower)
expect(posts.pluck(:id)).to contain_exactly(post2.id)
end
end
end
end