diff --git a/plugins/poll/plugin.rb b/plugins/poll/plugin.rb index 0f061e5b5f1..c53ef167bf8 100644 --- a/plugins/poll/plugin.rb +++ b/plugins/poll/plugin.rb @@ -293,8 +293,10 @@ after_initialize do # are the polls different? if polls.keys != previous_polls.keys || current_options != previous_options + has_votes = previous_polls.keys.map { |p| previous_polls[p]["voters"].to_i }.sum > 0 + # outside of the 5-minute edit window? - if post.created_at < 5.minutes.ago + if post.created_at < 5.minutes.ago && has_votes # cannot add/remove/rename polls if polls.keys.sort != previous_polls.keys.sort post.errors.add(:base, I18n.t("poll.cannot_change_polls_after_5_minutes")) @@ -305,7 +307,7 @@ after_initialize do if User.staff.pluck(:id).include?(post.last_editor_id) # staff can only edit options polls.each_key do |poll_name| - if polls[poll_name]["options"].size != previous_polls[poll_name]["options"].size + if polls[poll_name]["options"].size != previous_polls[poll_name]["options"].size && previous_polls[poll_name]["voters"].to_i > 0 post.errors.add(:base, I18n.t("poll.staff_cannot_add_or_remove_options_after_5_minutes")) return end diff --git a/plugins/poll/spec/controllers/posts_controller_spec.rb b/plugins/poll/spec/controllers/posts_controller_spec.rb index a47d7def267..00e68e842bb 100644 --- a/plugins/poll/spec/controllers/posts_controller_spec.rb +++ b/plugins/poll/spec/controllers/posts_controller_spec.rb @@ -126,26 +126,30 @@ describe PostsController do end end - it "OP cannot change the options" do - xhr :put, :update, { id: post_id, post: { raw: new_option } } - expect(response).not_to be_success - json = ::JSON.parse(response.body) - expect(json["errors"][0]).to eq(I18n.t("poll.op_cannot_edit_options_after_5_minutes")) - end + describe "with no vote" do - it "staff can change the options" do - log_in_user(Fabricate(:moderator)) - xhr :put, :update, { id: post_id, post: { raw: new_option } } - expect(response).to be_success - json = ::JSON.parse(response.body) - expect(json["post"]["polls"]["poll"]["options"][1]["html"]).to eq("C") - end + it "OP can change the options" do + xhr :put, :update, { id: post_id, post: { raw: new_option } } + expect(response).to be_success + json = ::JSON.parse(response.body) + expect(json["post"]["polls"]["poll"]["options"][1]["html"]).to eq("C") + end + + it "staff can change the options" do + log_in_user(Fabricate(:moderator)) + xhr :put, :update, { id: post_id, post: { raw: new_option } } + expect(response).to be_success + json = ::JSON.parse(response.body) + expect(json["post"]["polls"]["poll"]["options"][1]["html"]).to eq("C") + end + + it "support changes on the post" do + xhr :put, :update, { id: post_id, post: { raw: updated } } + expect(response).to be_success + json = ::JSON.parse(response.body) + expect(json["post"]["cooked"]).to match("before") + end - it "support changes on the post" do - xhr :put, :update, { id: post_id, post: { raw: updated } } - expect(response).to be_success - json = ::JSON.parse(response.body) - expect(json["post"]["cooked"]).to match("before") end describe "with at least one vote" do @@ -154,6 +158,21 @@ describe PostsController do DiscoursePoll::Poll.vote(post_id, "poll", ["5c24fc1df56d764b550ceae1b9319125"], user.id) end + it "OP cannot change the options" do + xhr :put, :update, { id: post_id, post: { raw: new_option } } + expect(response).not_to be_success + json = ::JSON.parse(response.body) + expect(json["errors"][0]).to eq(I18n.t("poll.op_cannot_edit_options_after_5_minutes")) + end + + it "staff can change the options" do + log_in_user(Fabricate(:moderator)) + xhr :put, :update, { id: post_id, post: { raw: new_option } } + expect(response).to be_success + json = ::JSON.parse(response.body) + expect(json["post"]["polls"]["poll"]["options"][1]["html"]).to eq("C") + end + it "support changes on the post" do xhr :put, :update, { id: post_id, post: { raw: updated } } expect(response).to be_success