mirror of
https://github.com/discourse/discourse.git
synced 2024-11-24 06:56:01 +08:00
e62e93f83a
This will replace `enable_personal_messages` and `min_trust_to_send_messages`, this commit introduces the setting `personal_message_enabled_groups` and uses it in all places that `enable_personal_messages` and `min_trust_to_send_messages` currently apply. A migration is included to set `personal_message_enabled_groups` based on the following rules: * If `enable_personal_messages` was false, then set `personal_message_enabled_groups` to `3`, which is the staff auto group * If `min_trust_to_send_messages` is not default (1) and the above condition is false, then set the `personal_message_enabled_groups` setting to the appropriate auto group based on the trust level * Otherwise just set `personal_message_enabled_groups` to 11 which is the TL1 auto group After follow-up PRs to plugins using these old settings, we will be able to drop the old settings from core, in the meantime I've added DEPRECATED notices to their descriptions and added them to the deprecated site settings list. This commit also introduces a `_map` shortcut method definition for all `group_list` site settings, e.g. `SiteSetting.personal_message_enabled_groups` also has `SiteSetting.personal_message_enabled_groups_map` available, which automatically splits the setting by `|` and converts it into an array of integers.
264 lines
7.6 KiB
Ruby
264 lines
7.6 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
RSpec.describe PostActionsController do
|
|
fab!(:user) { Fabricate(:user) }
|
|
fab!(:coding_horror) { Fabricate(:coding_horror) }
|
|
|
|
before do
|
|
Group.refresh_automatic_groups!
|
|
end
|
|
|
|
describe '#destroy' do
|
|
fab!(:post) { Fabricate(:post, user: coding_horror) }
|
|
|
|
it 'requires you to be logged in' do
|
|
delete "/post_actions/#{post.id}.json"
|
|
expect(response.status).to eq(403)
|
|
end
|
|
|
|
context 'when logged in' do
|
|
before do
|
|
sign_in(user)
|
|
end
|
|
|
|
it 'raises an error when the post_action_type_id is missing' do
|
|
delete "/post_actions/#{post.id}.json"
|
|
expect(response.status).to eq(400)
|
|
end
|
|
|
|
it "returns 404 when the post action type doesn't exist for that user" do
|
|
delete "/post_actions/#{post.id}.json", params: { post_action_type_id: PostActionType.types[:like] }
|
|
expect(response.status).to eq(404)
|
|
end
|
|
|
|
context 'with a post_action record ' do
|
|
let!(:post_action) do
|
|
PostAction.create!(
|
|
user_id: user.id,
|
|
post_id: post.id,
|
|
post_action_type_id: PostActionType.types[:like]
|
|
)
|
|
end
|
|
|
|
it 'returns success' do
|
|
delete "/post_actions/#{post.id}.json", params: { post_action_type_id: PostActionType.types[:like] }
|
|
expect(response.status).to eq(200)
|
|
end
|
|
|
|
it 'deletes the action' do
|
|
delete "/post_actions/#{post.id}.json", params: {
|
|
post_action_type_id: PostActionType.types[:like]
|
|
}
|
|
|
|
expect(response.status).to eq(200)
|
|
expect(PostAction.exists?(
|
|
user_id: user.id,
|
|
post_id: post.id,
|
|
post_action_type_id: PostActionType.types[:like],
|
|
deleted_at: nil
|
|
)).to eq(false)
|
|
end
|
|
|
|
it "isn't deleted when the user doesn't have permission" do
|
|
post_action.update!(created_at: 1.day.ago)
|
|
|
|
delete "/post_actions/#{post.id}.json", params: {
|
|
post_action_type_id: PostActionType.types[:like]
|
|
}
|
|
|
|
expect(response).to be_forbidden
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
describe '#create' do
|
|
it 'requires you to be logged in' do
|
|
post '/post_actions.json'
|
|
expect(response.status).to eq(403)
|
|
end
|
|
|
|
it 'fails when the user does not have permission to see the post' do
|
|
sign_in(user)
|
|
pm = Fabricate(:private_message_post, user: coding_horror)
|
|
|
|
post "/post_actions.json", params: {
|
|
id: pm.id,
|
|
post_action_type_id: PostActionType.types[:like]
|
|
}
|
|
|
|
expect(response.status).to eq(403)
|
|
end
|
|
|
|
it 'fails when the user tries to notify user that has disabled PM' do
|
|
sign_in(user)
|
|
user2 = Fabricate(:user)
|
|
|
|
post = Fabricate(:post, user: user2)
|
|
user2.user_option.update!(allow_private_messages: false)
|
|
|
|
post "/post_actions.json", params: {
|
|
id: post.id,
|
|
post_action_type_id: PostActionType.types[:notify_user],
|
|
message: 'testing',
|
|
flag_topic: false
|
|
}
|
|
|
|
expect(response.status).to eq(422)
|
|
|
|
expect(response.parsed_body["errors"].first).to eq(I18n.t(
|
|
:not_accepting_pms, username: user2.username
|
|
))
|
|
end
|
|
|
|
describe 'as a moderator' do
|
|
fab!(:user) { Fabricate(:moderator) }
|
|
fab!(:post_1) { Fabricate(:post, user: coding_horror) }
|
|
|
|
before do
|
|
sign_in(user)
|
|
end
|
|
|
|
it 'raises an error when the id is missing' do
|
|
post "/post_actions.json", params: {
|
|
post_action_type_id: PostActionType.types[:like]
|
|
}
|
|
expect(response.status).to eq(400)
|
|
end
|
|
|
|
it 'fails when the id is invalid' do
|
|
post "/post_actions.json", params: {
|
|
post_action_type_id: PostActionType.types[:like], id: -1
|
|
}
|
|
|
|
expect(response.status).to eq(404)
|
|
end
|
|
|
|
it 'raises an error when the post_action_type_id index is missing' do
|
|
post "/post_actions.json", params: { id: post_1.id }
|
|
expect(response.status).to eq(400)
|
|
end
|
|
|
|
it "fails when the user doesn't have permission to see the post" do
|
|
post_1 = Fabricate(:private_message_post, user: Fabricate(:user))
|
|
|
|
post "/post_actions.json", params: {
|
|
id: post_1.id, post_action_type_id: PostActionType.types[:like]
|
|
}
|
|
|
|
expect(response).to be_forbidden
|
|
end
|
|
|
|
it 'allows us to create an post action on a post' do
|
|
expect do
|
|
post "/post_actions.json", params: {
|
|
id: post_1.id, post_action_type_id: PostActionType.types[:like]
|
|
}
|
|
end.to change { PostAction.count }.by(1)
|
|
|
|
post_action = PostAction.last
|
|
|
|
expect(response.status).to eq(200)
|
|
expect(post_action.post_id).to eq(post_1.id)
|
|
expect(post_action.post_action_type_id).to eq(PostActionType.types[:like])
|
|
end
|
|
|
|
it "passes a list of taken actions through" do
|
|
PostAction.create!(
|
|
post_id: post_1.id,
|
|
user_id: user.id,
|
|
post_action_type_id: PostActionType.types[:inappropriate]
|
|
)
|
|
|
|
post "/post_actions.json", params: {
|
|
id: post_1.id, post_action_type_id: PostActionType.types[:off_topic]
|
|
}
|
|
|
|
expect(response).to be_forbidden
|
|
end
|
|
|
|
it 'passes the message through' do
|
|
message = 'action message goes here'
|
|
|
|
post "/post_actions.json", params: {
|
|
id: post_1.id,
|
|
post_action_type_id: PostActionType.types[:notify_user],
|
|
message: message
|
|
}
|
|
|
|
expect(response.status).to eq(200)
|
|
expect(PostAction.last.post_id).to eq(post_1.id)
|
|
expect(Post.last.raw).to include(message)
|
|
end
|
|
|
|
it 'passes the message through as warning' do
|
|
message = 'action message goes here'
|
|
|
|
post "/post_actions.json", params: {
|
|
id: post_1.id,
|
|
post_action_type_id: PostActionType.types[:notify_user],
|
|
message: message,
|
|
is_warning: true
|
|
}
|
|
|
|
expect(response.status).to eq(200)
|
|
expect(PostAction.last.post_id).to eq(post_1.id)
|
|
|
|
post = Post.last
|
|
|
|
expect(post.raw).to include(message)
|
|
expect(post.topic.is_official_warning?).to eq(true)
|
|
end
|
|
|
|
it "doesn't create message as a warning if the user isn't staff" do
|
|
sign_in(Fabricate(:user))
|
|
|
|
post "/post_actions.json", params: {
|
|
id: post_1.id,
|
|
post_action_type_id: PostActionType.types[:notify_user],
|
|
message: 'action message goes here',
|
|
is_warning: true
|
|
}
|
|
|
|
expect(response.status).to eq(403)
|
|
end
|
|
|
|
it 'passes take_action through' do
|
|
post "/post_actions.json", params: {
|
|
id: post_1.id,
|
|
post_action_type_id: PostActionType.types[:spam],
|
|
take_action: 'true'
|
|
}
|
|
|
|
expect(response.status).to eq(200)
|
|
|
|
post_action = PostAction.find_by(post: post_1)
|
|
expect(post_action.staff_took_action).to eq(true)
|
|
|
|
reviewable = ReviewableFlaggedPost.find_by(target: post_1)
|
|
score = reviewable.reviewable_scores.first
|
|
expect(score.took_action?).to eq(true)
|
|
end
|
|
|
|
it "doesn't pass take_action through if the user isn't staff" do
|
|
sign_in(Fabricate(:user))
|
|
|
|
post "/post_actions.json", params: {
|
|
id: post_1.id,
|
|
post_action_type_id: PostActionType.types[:inappropriate]
|
|
}
|
|
|
|
expect(response.status).to eq(200)
|
|
|
|
post_action = PostAction.find_by(post: post_1)
|
|
expect(post_action.staff_took_action).to eq(false)
|
|
|
|
reviewable = ReviewableFlaggedPost.find_by(target: post_1)
|
|
score = reviewable.reviewable_scores.first
|
|
expect(score.took_action?).to eq(false)
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|