From 60bbd8160749e30576273d37d171798e4bd5690b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Mon, 14 Sep 2015 19:27:54 +0200 Subject: [PATCH] FIX: polls with votes were preventing users from updating the post --- plugins/poll/plugin.rb | 14 ++++--- .../spec/controllers/posts_controller_spec.rb | 41 +++++++++++++++---- 2 files changed, 41 insertions(+), 14 deletions(-) diff --git a/plugins/poll/plugin.rb b/plugins/poll/plugin.rb index 34e71188b..0f061e5b5 100644 --- a/plugins/poll/plugin.rb +++ b/plugins/poll/plugin.rb @@ -17,6 +17,9 @@ PLUGIN_NAME ||= "discourse_poll".freeze POLLS_CUSTOM_FIELD ||= "polls".freeze VOTES_CUSTOM_FIELD ||= "polls-votes".freeze +DATA_PREFIX ||= "data-poll-".freeze +DEFAULT_POLL_NAME ||= "poll".freeze + after_initialize do # remove "Vote Now!" & "Show Results" links in emails @@ -157,6 +160,7 @@ after_initialize do end require_dependency "application_controller" + class DiscoursePoll::PollsController < ::ApplicationController requires_plugin PLUGIN_NAME @@ -217,9 +221,6 @@ after_initialize do end end - DATA_PREFIX ||= "data-poll-".freeze - DEFAULT_POLL_NAME ||= "poll".freeze - validate(:post, :validate_polls) do # only care when raw has changed! return unless self.raw_changed? @@ -285,9 +286,12 @@ after_initialize do # load previous polls previous_polls = post.custom_fields[POLLS_CUSTOM_FIELD] || {} + # extract options + current_options = polls.values.map { |p| p["options"].map { |o| o["id"] } }.flatten.sort + previous_options = previous_polls.values.map { |p| p["options"].map { |o| o["id"] } }.flatten.sort + # are the polls different? - if polls.keys != previous_polls.keys || - polls.values.map { |p| p["options"] } != previous_polls.values.map { |p| p["options"] } + if polls.keys != previous_polls.keys || current_options != previous_options # outside of the 5-minute edit window? if post.created_at < 5.minutes.ago diff --git a/plugins/poll/spec/controllers/posts_controller_spec.rb b/plugins/poll/spec/controllers/posts_controller_spec.rb index a647be132..a47d7def2 100644 --- a/plugins/poll/spec/controllers/posts_controller_spec.rb +++ b/plugins/poll/spec/controllers/posts_controller_spec.rb @@ -10,7 +10,6 @@ describe PostsController do describe "polls" do - it "works" do xhr :post, :create, { title: title, raw: "[poll]\n- A\n- B\n[/poll]" } expect(response).to be_success @@ -91,7 +90,7 @@ describe PostsController do describe "within the first 5 minutes" do let(:post_id) do - Timecop.freeze(3.minutes.ago) do + Timecop.freeze(4.minutes.ago) do xhr :post, :create, { title: title, raw: "[poll]\n- A\n- B\n[/poll]" } ::JSON.parse(response.body)["id"] end @@ -116,30 +115,54 @@ describe PostsController do describe "after the first 5 minutes" do + let(:poll) { "[poll]\n- A\n- B[/poll]" } + let(:new_option) { "[poll]\n- A\n- C[/poll]" } + let(:updated) { "before\n\n[poll]\n- A\n- B[/poll]\n\nafter" } + let(:post_id) do Timecop.freeze(6.minutes.ago) do - xhr :post, :create, { title: title, raw: "[poll]\n- A\n- B\n[/poll]" } + xhr :post, :create, { title: title, raw: poll } ::JSON.parse(response.body)["id"] end end - let(:new_raw) { "[poll]\n- A\n- C[/poll]" } - - it "cannot be changed by OP" do - xhr :put, :update, { id: post_id, post: { raw: new_raw } } + 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 "can be edited by staff" do + it "staff can change the options" do log_in_user(Fabricate(:moderator)) - xhr :put, :update, { id: post_id, post: { raw: new_raw } } + 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 + + describe "with at least one vote" do + + before do + DiscoursePoll::Poll.vote(post_id, "poll", ["5c24fc1df56d764b550ceae1b9319125"], user.id) + 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 + + end + end end