mirror of
https://github.com/discourse/discourse.git
synced 2025-05-22 03:51:07 +08:00
FEATURE: Improve composer warnings for mentions (#18796)
* FEATURE: Show warning if group cannot be mentioned A similar warning is displayed when the user cannot be mentioned because they have not been invited to the topic. * FEATURE: Resolve mentions for new topic This commit improves several improvements and refactors /u/is_local_username route to a better /composer/mentions route that can handle new topics too. * FEATURE: Show warning if only some are notified Sometimes users are still notified even if the group that was mentioned was not invited to the message. This happens because its members were invited directly or are members of other groups that were invited. * DEV: Refactor _warnCannotSeeMention
This commit is contained in:
@ -3670,116 +3670,6 @@ RSpec.describe UsersController do
|
||||
end
|
||||
end
|
||||
|
||||
describe '#is_local_username' do
|
||||
fab!(:group) { Fabricate(:group, name: "Discourse", mentionable_level: Group::ALIAS_LEVELS[:everyone]) }
|
||||
let(:unmentionable) {
|
||||
Fabricate(:group, name: "Unmentionable", mentionable_level: Group::ALIAS_LEVELS[:nobody])
|
||||
}
|
||||
fab!(:topic) { Fabricate(:topic) }
|
||||
fab!(:allowed_user) { Fabricate(:user) }
|
||||
fab!(:private_topic) { Fabricate(:private_message_topic, user: allowed_user) }
|
||||
|
||||
it "finds the user" do
|
||||
get "/u/is_local_username.json", params: { username: user1.username }
|
||||
|
||||
expect(response.status).to eq(200)
|
||||
expect(response.parsed_body["valid"][0]).to eq(user1.username)
|
||||
end
|
||||
|
||||
it "finds the group" do
|
||||
sign_in(user1)
|
||||
get "/u/is_local_username.json", params: { username: group.name }
|
||||
expect(response.status).to eq(200)
|
||||
expect(response.parsed_body["valid_groups"]).to include(group.name)
|
||||
expect(response.parsed_body["mentionable_groups"].find { |g| g['name'] == group.name }).to be_present
|
||||
end
|
||||
|
||||
it "finds unmentionable groups" do
|
||||
sign_in(user1)
|
||||
get "/u/is_local_username.json", params: { username: unmentionable.name }
|
||||
expect(response.status).to eq(200)
|
||||
expect(response.parsed_body["valid_groups"]).to include(unmentionable.name)
|
||||
expect(response.parsed_body["mentionable_groups"]).to be_blank
|
||||
end
|
||||
|
||||
it "supports multiples usernames" do
|
||||
get "/u/is_local_username.json", params: { usernames: [user1.username, "system"] }
|
||||
|
||||
expect(response.status).to eq(200)
|
||||
expect(response.parsed_body["valid"]).to contain_exactly(user1.username, "system")
|
||||
end
|
||||
|
||||
it "never includes staged accounts" do
|
||||
staged = Fabricate(:user, staged: true)
|
||||
|
||||
get "/u/is_local_username.json", params: { usernames: [staged.username] }
|
||||
|
||||
expect(response.status).to eq(200)
|
||||
expect(response.parsed_body["valid"]).to be_blank
|
||||
end
|
||||
|
||||
it "returns user who cannot see topic" do
|
||||
Guardian.any_instance.expects(:can_see?).with(topic).returns(false)
|
||||
|
||||
get "/u/is_local_username.json", params: {
|
||||
usernames: [user1.username], topic_id: topic.id
|
||||
}
|
||||
|
||||
expect(response.status).to eq(200)
|
||||
expect(response.parsed_body["cannot_see"][user1.username]).to eq("category")
|
||||
end
|
||||
|
||||
it "never returns a user who can see the topic" do
|
||||
get "/u/is_local_username.json", params: {
|
||||
usernames: [user1.username], topic_id: topic.id
|
||||
}
|
||||
|
||||
expect(response.status).to eq(200)
|
||||
expect(response.parsed_body["cannot_see"]).to be_blank
|
||||
end
|
||||
|
||||
it "returns user who cannot see a private topic" do
|
||||
get "/u/is_local_username.json", params: {
|
||||
usernames: [user1.username], topic_id: private_topic.id
|
||||
}
|
||||
|
||||
expect(response.status).to eq(200)
|
||||
expect(response.parsed_body["cannot_see"][user1.username]).to eq("private")
|
||||
end
|
||||
|
||||
it "returns user who was not invited to topic" do
|
||||
sign_in(Fabricate(:admin))
|
||||
|
||||
get "/u/is_local_username.json", params: {
|
||||
usernames: [admin.username], topic_id: private_topic.id
|
||||
}
|
||||
|
||||
expect(response.status).to eq(200)
|
||||
expect(response.parsed_body["cannot_see"][admin.username]).to eq("not_allowed")
|
||||
end
|
||||
|
||||
it "never returns a user who can see the topic" do
|
||||
get "/u/is_local_username.json", params: {
|
||||
usernames: [allowed_user.username], topic_id: private_topic.id
|
||||
}
|
||||
|
||||
expect(response.status).to eq(200)
|
||||
expect(response.parsed_body["cannot_see"]).to be_blank
|
||||
end
|
||||
|
||||
it "returns the appropriate reason why user cannot see the topic" do
|
||||
TopicUser.create!(user_id: user1.id, topic_id: topic.id, notification_level: TopicUser.notification_levels[:muted])
|
||||
|
||||
sign_in(admin)
|
||||
get "/u/is_local_username.json", params: {
|
||||
usernames: [user1.username], topic_id: topic.id
|
||||
}
|
||||
|
||||
expect(response.status).to eq(200)
|
||||
expect(response.parsed_body["cannot_see"][user1.username]).to eq("muted_topic")
|
||||
end
|
||||
end
|
||||
|
||||
describe '#topic_tracking_state' do
|
||||
context 'when anon' do
|
||||
it "raises an error on anon for topic_tracking_state" do
|
||||
|
Reference in New Issue
Block a user