From 7070b0915b20c43bb7b5ba3ff910a0147f30d47d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javi=20Mart=C3=ADn?= Date: Wed, 11 Oct 2023 14:11:27 +0200 Subject: [PATCH] Allow liking/unliking when JavaScript is disabled Even if pretty much nobody uses a browser with JavaScript disabled when navigating our sites, there might be times where JavaScript isn't loaded for reasons like a slow internet connections not getting the JavaScript files or a technical issue. So we're making it possible to still use the like/unlike buttons in these cases. --- app/controllers/comments/votes_controller.rb | 2 ++ app/controllers/debates/votes_controller.rb | 2 ++ .../legislation/proposals/votes_controller.rb | 2 ++ config/locales/en/responders.yml | 2 ++ .../comments/votes_controller_spec.rb | 26 ++++++++++++++++++- .../debates/votes_controller_spec.rb | 24 +++++++++++++++++ .../proposals/votes_controller_spec.rb | 24 +++++++++++++++++ 7 files changed, 81 insertions(+), 1 deletion(-) diff --git a/app/controllers/comments/votes_controller.rb b/app/controllers/comments/votes_controller.rb index d8289f9cf..e5ed1dfad 100644 --- a/app/controllers/comments/votes_controller.rb +++ b/app/controllers/comments/votes_controller.rb @@ -10,6 +10,7 @@ module Comments @comment.vote_by(voter: current_user, vote: params[:value]) respond_to do |format| + format.html { redirect_to request.referer, notice: I18n.t("flash.actions.create.vote") } format.js { render :show } end end @@ -18,6 +19,7 @@ module Comments @comment.unvote_by(current_user) respond_to do |format| + format.html { redirect_to request.referer, notice: I18n.t("flash.actions.destroy.vote") } format.js { render :show } end end diff --git a/app/controllers/debates/votes_controller.rb b/app/controllers/debates/votes_controller.rb index ae0cf33d5..23cbbd477 100644 --- a/app/controllers/debates/votes_controller.rb +++ b/app/controllers/debates/votes_controller.rb @@ -9,6 +9,7 @@ module Debates @debate.register_vote(current_user, params[:value]) respond_to do |format| + format.html { redirect_to request.referer, notice: I18n.t("flash.actions.create.vote") } format.js { render :show } end end @@ -17,6 +18,7 @@ module Debates @debate.unvote_by(current_user) respond_to do |format| + format.html { redirect_to request.referer, notice: I18n.t("flash.actions.destroy.vote") } format.js { render :show } end end diff --git a/app/controllers/legislation/proposals/votes_controller.rb b/app/controllers/legislation/proposals/votes_controller.rb index 5f70a5b95..d60715678 100644 --- a/app/controllers/legislation/proposals/votes_controller.rb +++ b/app/controllers/legislation/proposals/votes_controller.rb @@ -13,6 +13,7 @@ module Legislation @proposal.vote_by(voter: current_user, vote: params[:value]) respond_to do |format| + format.html { redirect_to request.referer, notice: I18n.t("flash.actions.create.vote") } format.js { render :show } end end @@ -21,6 +22,7 @@ module Legislation @proposal.unvote_by(current_user) respond_to do |format| + format.html { redirect_to request.referer, notice: I18n.t("flash.actions.destroy.vote") } format.js { render :show } end end diff --git a/config/locales/en/responders.yml b/config/locales/en/responders.yml index be118de2a..31e9350b0 100644 --- a/config/locales/en/responders.yml +++ b/config/locales/en/responders.yml @@ -17,6 +17,7 @@ en: support: "Investment supported successfully" topic: "Topic created successfully." valuator_group: "Valuator group created successfully" + vote: "Vote created successfully" save_changes: notice: Changes saved update: @@ -35,3 +36,4 @@ en: topic: "Topic deleted successfully." poll_question_answer_video: "Answer video deleted successfully." valuator_group: "Valuator group deleted successfully" + vote: "Vote deleted successfully" diff --git a/spec/controllers/comments/votes_controller_spec.rb b/spec/controllers/comments/votes_controller_spec.rb index cc164423f..fb8ee489a 100644 --- a/spec/controllers/comments/votes_controller_spec.rb +++ b/spec/controllers/comments/votes_controller_spec.rb @@ -1,7 +1,7 @@ require "rails_helper" describe Comments::VotesController do - let(:comment) { create(:comment) } + let(:comment) { create(:debate_comment) } describe "POST create" do it "allows voting" do @@ -11,6 +11,18 @@ describe Comments::VotesController do post :create, xhr: true, params: { comment_id: comment.id, value: "yes" } end.to change { comment.reload.votes_for.size }.by(1) end + + it "redirects authenticated users without JavaScript to the same page" do + request.env["HTTP_REFERER"] = comment_path(comment) + sign_in create(:user) + + expect do + post :create, params: { comment_id: comment.id, value: "yes" } + end.to change { comment.reload.votes_for.size }.by(1) + + expect(response).to redirect_to comment_path(comment) + expect(flash[:notice]).to eq "Vote created successfully" + end end describe "DELETE destroy" do @@ -30,5 +42,17 @@ describe Comments::VotesController do delete :destroy, xhr: true, params: { comment_id: comment.id, id: vote } end.to change { comment.reload.votes_for.size }.by(-1) end + + it "redirects authenticated users without JavaScript to the same page" do + request.env["HTTP_REFERER"] = debate_path(comment.commentable) + sign_in user + + expect do + delete :destroy, params: { comment_id: comment.id, id: vote } + end.to change { comment.reload.votes_for.size }.by(-1) + + expect(response).to redirect_to debate_path(comment.commentable) + expect(flash[:notice]).to eq "Vote deleted successfully" + end end end diff --git a/spec/controllers/debates/votes_controller_spec.rb b/spec/controllers/debates/votes_controller_spec.rb index 74bd009d2..0e55aa3a3 100644 --- a/spec/controllers/debates/votes_controller_spec.rb +++ b/spec/controllers/debates/votes_controller_spec.rb @@ -18,6 +18,19 @@ describe Debates::VotesController do expect(response).to redirect_to new_user_session_path end + it "redirects authenticated users without JavaScript to the same page" do + debate = create(:debate) + request.env["HTTP_REFERER"] = debate_path(debate) + sign_in create(:user) + + expect do + post :create, params: { debate_id: debate.id, value: "yes" } + end.to change { debate.reload.votes_for.size }.by(1) + + expect(response).to redirect_to debate_path(debate) + expect(flash[:notice]).to eq "Vote created successfully" + end + describe "Vote with too many anonymous votes" do it "allows vote if user is allowed" do Setting["max_ratio_anon_votes_on_debates"] = 100 @@ -52,5 +65,16 @@ describe Debates::VotesController do delete :destroy, xhr: true, params: { debate_id: debate.id, id: vote } end.to change { debate.reload.votes_for.size }.by(-1) end + + it "redirects authenticated users without JavaScript to the same page" do + request.env["HTTP_REFERER"] = debates_path + + expect do + delete :destroy, params: { debate_id: debate.id, id: vote } + end.to change { debate.reload.votes_for.size }.by(-1) + + expect(response).to redirect_to debates_path + expect(flash[:notice]).to eq "Vote deleted successfully" + end end end diff --git a/spec/controllers/legislation/proposals/votes_controller_spec.rb b/spec/controllers/legislation/proposals/votes_controller_spec.rb index f618277b1..e43560027 100644 --- a/spec/controllers/legislation/proposals/votes_controller_spec.rb +++ b/spec/controllers/legislation/proposals/votes_controller_spec.rb @@ -36,6 +36,18 @@ describe Legislation::Proposals::VotesController do post :create, xhr: true, params: vote_params end.not_to change { proposal.reload.votes_for.size } end + + it "redirects authenticated users without JavaScript to the same page" do + request.env["HTTP_REFERER"] = legislation_process_proposal_path(legislation_process, proposal) + sign_in create(:user, :level_two) + + expect do + post :create, params: vote_params + end.to change { proposal.reload.votes_for.size }.by(1) + + expect(response).to redirect_to legislation_process_proposal_path(legislation_process, proposal) + expect(flash[:notice]).to eq "Vote created successfully" + end end describe "DELETE destroy" do @@ -52,5 +64,17 @@ describe Legislation::Proposals::VotesController do delete :destroy, xhr: true, params: vote_params end.to change { proposal.reload.votes_for.size }.by(-1) end + + it "redirects authenticated users without JavaScript to the same page" do + request.env["HTTP_REFERER"] = legislation_process_proposals_path(legislation_process) + sign_in user + + expect do + delete :destroy, params: vote_params + end.to change { proposal.reload.votes_for.size }.by(-1) + + expect(response).to redirect_to legislation_process_proposals_path(legislation_process) + expect(flash[:notice]).to eq "Vote deleted successfully" + end end end