252 lines
8.6 KiB
Ruby
252 lines
8.6 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
RSpec.describe ComposerController do
|
|
describe '#mentions' do
|
|
fab!(:current_user) { Fabricate(:user) }
|
|
fab!(:user) { Fabricate(:user) }
|
|
|
|
fab!(:group) { Fabricate(:group, messageable_level: Group::ALIAS_LEVELS[:everyone], mentionable_level: Group::ALIAS_LEVELS[:everyone]) }
|
|
fab!(:invisible_group) { Fabricate(:group, visibility_level: Group.visibility_levels[:owners]) }
|
|
fab!(:unmessageable_group) { Fabricate(:group, messageable_level: Group::ALIAS_LEVELS[:nobody], mentionable_level: Group::ALIAS_LEVELS[:everyone]) }
|
|
fab!(:unmentionable_group) { Fabricate(:group, messageable_level: Group::ALIAS_LEVELS[:everyone], mentionable_level: Group::ALIAS_LEVELS[:nobody]) }
|
|
|
|
before do
|
|
sign_in(current_user)
|
|
end
|
|
|
|
context 'without a topic' do
|
|
it 'finds mentions' do
|
|
get '/composer/mentions.json', params: {
|
|
names: [
|
|
'invaliduserorgroup',
|
|
user.username,
|
|
group.name,
|
|
invisible_group.name,
|
|
unmessageable_group.name,
|
|
unmentionable_group.name
|
|
],
|
|
}
|
|
|
|
expect(response.status).to eq(200)
|
|
|
|
expect(response.parsed_body['users']).to contain_exactly(user.username)
|
|
expect(response.parsed_body['user_reasons']).to eq({})
|
|
|
|
expect(response.parsed_body['groups']).to eq({
|
|
group.name => { 'user_count' => group.user_count },
|
|
unmessageable_group.name => { 'user_count' => unmessageable_group.user_count },
|
|
unmentionable_group.name => { 'user_count' => unmentionable_group.user_count },
|
|
})
|
|
expect(response.parsed_body['group_reasons']).to eq({
|
|
unmentionable_group.name => 'not_mentionable',
|
|
})
|
|
|
|
expect(response.parsed_body['max_users_notified_per_group_mention'])
|
|
.to eq(SiteSetting.max_users_notified_per_group_mention)
|
|
end
|
|
end
|
|
|
|
context 'with a regular topic' do
|
|
fab!(:topic) { Fabricate(:topic) }
|
|
|
|
it 'finds mentions' do
|
|
get '/composer/mentions.json', params: {
|
|
names: [
|
|
'invaliduserorgroup',
|
|
user.username,
|
|
group.name,
|
|
invisible_group.name,
|
|
unmessageable_group.name,
|
|
unmentionable_group.name
|
|
],
|
|
topic_id: topic.id,
|
|
}
|
|
|
|
expect(response.status).to eq(200)
|
|
|
|
expect(response.parsed_body['users']).to contain_exactly(user.username)
|
|
expect(response.parsed_body['user_reasons']).to eq({})
|
|
|
|
expect(response.parsed_body['groups']).to eq(
|
|
group.name => { 'user_count' => group.user_count },
|
|
unmessageable_group.name => { 'user_count' => unmessageable_group.user_count },
|
|
unmentionable_group.name => { 'user_count' => unmentionable_group.user_count },
|
|
)
|
|
expect(response.parsed_body['group_reasons']).to eq(
|
|
unmentionable_group.name => 'not_mentionable',
|
|
)
|
|
|
|
expect(response.parsed_body['max_users_notified_per_group_mention'])
|
|
.to eq(SiteSetting.max_users_notified_per_group_mention)
|
|
end
|
|
end
|
|
|
|
context 'with a private message' do
|
|
fab!(:allowed_user) { Fabricate(:user) }
|
|
fab!(:topic) { Fabricate(:private_message_topic, user: allowed_user) }
|
|
|
|
it 'does not work if topic is not visible' do
|
|
get '/composer/mentions.json', params: {
|
|
names: [allowed_user.username], topic_id: topic.id
|
|
}
|
|
|
|
expect(response.status).to eq(403)
|
|
end
|
|
|
|
it 'finds mentions' do
|
|
sign_in(allowed_user)
|
|
topic.invite_group(Discourse.system_user, unmentionable_group)
|
|
|
|
get '/composer/mentions.json', params: {
|
|
names: [
|
|
'invaliduserorgroup',
|
|
user.username,
|
|
allowed_user.username,
|
|
group.name,
|
|
invisible_group.name,
|
|
unmessageable_group.name,
|
|
unmentionable_group.name
|
|
],
|
|
topic_id: topic.id,
|
|
}
|
|
|
|
expect(response.status).to eq(200)
|
|
|
|
expect(response.parsed_body['users']).to contain_exactly(
|
|
user.username, allowed_user.username
|
|
)
|
|
expect(response.parsed_body['user_reasons']).to eq(
|
|
user.username => 'private'
|
|
)
|
|
|
|
expect(response.parsed_body['groups']).to eq(
|
|
group.name => { 'user_count' => group.user_count },
|
|
unmessageable_group.name => { 'user_count' => unmessageable_group.user_count },
|
|
unmentionable_group.name => { 'user_count' => unmentionable_group.user_count },
|
|
)
|
|
expect(response.parsed_body['group_reasons']).to eq(
|
|
group.name => 'not_allowed',
|
|
unmessageable_group.name => 'not_allowed',
|
|
unmentionable_group.name => 'not_mentionable',
|
|
)
|
|
|
|
expect(response.parsed_body['max_users_notified_per_group_mention'])
|
|
.to eq(SiteSetting.max_users_notified_per_group_mention)
|
|
end
|
|
|
|
it 'returns notified_count' do
|
|
sign_in(allowed_user)
|
|
group.add(user)
|
|
topic.invite_group(Discourse.system_user, group)
|
|
|
|
other_group = Fabricate(:group, mentionable_level: Group::ALIAS_LEVELS[:everyone])
|
|
other_group.add(allowed_user)
|
|
other_group.add(user)
|
|
other_group.add(Fabricate(:user))
|
|
|
|
# Trying to mention other_group which has not been invited, but two of
|
|
# its members have been (allowed_user directly and user via group).
|
|
get '/composer/mentions.json', params: {
|
|
names: [other_group.name],
|
|
topic_id: topic.id,
|
|
}
|
|
|
|
expect(response.status).to eq(200)
|
|
|
|
expect(response.parsed_body['groups']).to eq(
|
|
other_group.name => { 'user_count' => 3, 'notified_count' => 2 }
|
|
)
|
|
expect(response.parsed_body['group_reasons']).to eq(
|
|
other_group.name => 'some_not_allowed'
|
|
)
|
|
end
|
|
end
|
|
|
|
context 'with a new private message' do
|
|
fab!(:allowed_user) { Fabricate(:user) }
|
|
|
|
it 'finds mentions' do
|
|
get '/composer/mentions.json', params: {
|
|
names: [
|
|
'invaliduserorgroup',
|
|
user.username,
|
|
allowed_user.username,
|
|
group.name,
|
|
invisible_group.name,
|
|
unmessageable_group.name,
|
|
unmentionable_group.name
|
|
],
|
|
allowed_names: [allowed_user.username, unmentionable_group.name],
|
|
}
|
|
|
|
expect(response.status).to eq(200)
|
|
|
|
expect(response.parsed_body['users']).to contain_exactly(
|
|
user.username, allowed_user.username
|
|
)
|
|
expect(response.parsed_body['user_reasons']).to eq(
|
|
user.username => 'private',
|
|
)
|
|
|
|
expect(response.parsed_body['groups']).to eq(
|
|
group.name => { 'user_count' => group.user_count },
|
|
unmessageable_group.name => { 'user_count' => unmessageable_group.user_count },
|
|
unmentionable_group.name => { 'user_count' => unmentionable_group.user_count },
|
|
)
|
|
expect(response.parsed_body['group_reasons']).to eq(
|
|
group.name => 'not_allowed',
|
|
unmessageable_group.name => 'not_allowed',
|
|
unmentionable_group.name => 'not_mentionable',
|
|
)
|
|
|
|
expect(response.parsed_body['max_users_notified_per_group_mention'])
|
|
.to eq(SiteSetting.max_users_notified_per_group_mention)
|
|
end
|
|
|
|
it 'returns notified_count' do
|
|
sign_in(allowed_user)
|
|
group.add(user)
|
|
|
|
other_group = Fabricate(:group, mentionable_level: Group::ALIAS_LEVELS[:everyone])
|
|
other_group.add(allowed_user)
|
|
other_group.add(user)
|
|
other_group.add(Fabricate(:user))
|
|
|
|
# Trying to mention other_group which has not been invited, but two of
|
|
# its members have been (allowed_user directly and user via group).
|
|
get '/composer/mentions.json', params: {
|
|
names: [other_group.name],
|
|
allowed_names: [allowed_user.username, group.name],
|
|
}
|
|
|
|
expect(response.status).to eq(200)
|
|
|
|
expect(response.parsed_body['groups']).to eq(
|
|
other_group.name => { 'user_count' => 3, 'notified_count' => 2 }
|
|
)
|
|
expect(response.parsed_body['group_reasons']).to eq(
|
|
other_group.name => 'some_not_allowed'
|
|
)
|
|
end
|
|
end
|
|
|
|
context 'with an invalid topic' do
|
|
it 'returns an error' do
|
|
get '/composer/mentions.json', params: {
|
|
names: [
|
|
'invaliduserorgroup',
|
|
user.username,
|
|
group.name,
|
|
invisible_group.name,
|
|
unmessageable_group.name,
|
|
unmentionable_group.name
|
|
],
|
|
topic_id: -1,
|
|
}
|
|
|
|
expect(response.status).to eq(403)
|
|
end
|
|
end
|
|
end
|
|
end
|