diff --git a/app/controllers/admin/legislation/proposals_controller.rb b/app/controllers/admin/legislation/proposals_controller.rb index aee02f7b0..8022e8628 100644 --- a/app/controllers/admin/legislation/proposals_controller.rb +++ b/app/controllers/admin/legislation/proposals_controller.rb @@ -11,12 +11,18 @@ class Admin::Legislation::ProposalsController < Admin::Legislation::BaseControll def select @proposal.update!(selected: true) - render :toggle_selection + respond_to do |format| + format.html { redirect_to request.referer, notice: t("flash.actions.update.proposal") } + format.js { render :toggle_selection } + end end def deselect @proposal.update!(selected: false) - render :toggle_selection + respond_to do |format| + format.html { redirect_to request.referer, notice: t("flash.actions.update.proposal") } + format.js { render :toggle_selection } + end end end diff --git a/app/controllers/admin/proposals_controller.rb b/app/controllers/admin/proposals_controller.rb index b2046e6b5..5e9e52b49 100644 --- a/app/controllers/admin/proposals_controller.rb +++ b/app/controllers/admin/proposals_controller.rb @@ -22,13 +22,19 @@ class Admin::ProposalsController < Admin::BaseController def select @proposal.update!(selected: true) - render :toggle_selection + respond_to do |format| + format.html { redirect_to request.referer, notice: t("flash.actions.update.proposal") } + format.js { render :toggle_selection } + end end def deselect @proposal.update!(selected: false) - render :toggle_selection + respond_to do |format| + format.html { redirect_to request.referer, notice: t("flash.actions.update.proposal") } + format.js { render :toggle_selection } + end end private diff --git a/spec/controllers/admin/legislation/proposals_controller_spec.rb b/spec/controllers/admin/legislation/proposals_controller_spec.rb new file mode 100644 index 000000000..6cd64562c --- /dev/null +++ b/spec/controllers/admin/legislation/proposals_controller_spec.rb @@ -0,0 +1,61 @@ +require "rails_helper" + +describe Admin::Legislation::ProposalsController, :admin do + describe "PATCH select" do + let(:proposal) { create(:legislation_proposal) } + + it "selects the proposal" do + expect do + patch :select, xhr: true, params: { id: proposal.id, process_id: proposal.process.id } + end.to change { proposal.reload.selected? }.from(false).to(true) + + expect(response).to be_successful + end + + it "does not modify already selected proposals" do + proposal.update!(selected: true) + + expect do + patch :select, xhr: true, params: { id: proposal.id, process_id: proposal.process.id } + end.not_to change { proposal.reload.selected? } + end + + it "redirects admins without JavaScript to the same page" do + request.env["HTTP_REFERER"] = admin_proposals_path + + patch :select, params: { id: proposal.id, process_id: proposal.process.id } + + expect(response).to redirect_to admin_proposals_path + expect(flash[:notice]).to eq "Proposal updated successfully." + end + end + + describe "PATCH deselect" do + let(:proposal) { create(:legislation_proposal, :selected) } + + it "deselects the proposal" do + expect do + patch :deselect, xhr: true, params: { id: proposal.id, process_id: proposal.process.id } + end.to change { proposal.reload.selected? }.from(true).to(false) + + expect(response).to be_successful + end + + it "does not modify non-selected proposals" do + proposal.update!(selected: false) + + expect do + patch :deselect, xhr: true, params: { id: proposal.id, process_id: proposal.process.id } + end.not_to change { proposal.reload.selected? } + end + + it "redirects admins without JavaScript to the same page" do + request.env["HTTP_REFERER"] = admin_proposals_path + + patch :deselect, params: { id: proposal.id, process_id: proposal.process.id } + + expect(response).to redirect_to admin_proposals_path + expect(flash[:notice]).to eq "Proposal updated successfully." + end + end +end diff --git a/spec/controllers/admin/proposals_controller_spec.rb b/spec/controllers/admin/proposals_controller_spec.rb new file mode 100644 index 000000000..b23369adb --- /dev/null +++ b/spec/controllers/admin/proposals_controller_spec.rb @@ -0,0 +1,61 @@ +require "rails_helper" + +describe Admin::ProposalsController, :admin do + describe "PATCH select" do + let(:proposal) { create(:proposal) } + + it "selects the proposal" do + expect do + patch :select, xhr: true, params: { id: proposal.id } + end.to change { proposal.reload.selected? }.from(false).to(true) + + expect(response).to be_successful + end + + it "does not modify already selected proposals" do + proposal.update!(selected: true) + + expect do + patch :select, xhr: true, params: { id: proposal.id } + end.not_to change { proposal.reload.selected? } + end + + it "redirects admins without JavaScript to the same page" do + request.env["HTTP_REFERER"] = admin_proposals_path + + patch :select, params: { id: proposal.id } + + expect(response).to redirect_to admin_proposals_path + expect(flash[:notice]).to eq "Proposal updated successfully." + end + end + + describe "PATCH deselect" do + let(:proposal) { create(:proposal, :selected) } + + it "deselects the proposal" do + expect do + patch :deselect, xhr: true, params: { id: proposal.id } + end.to change { proposal.reload.selected? }.from(true).to(false) + + expect(response).to be_successful + end + + it "does not modify non-selected proposals" do + proposal.update!(selected: false) + + expect do + patch :deselect, xhr: true, params: { id: proposal.id } + end.not_to change { proposal.reload.selected? } + end + + it "redirects admins without JavaScript to the same page" do + request.env["HTTP_REFERER"] = admin_proposals_path + + patch :deselect, params: { id: proposal.id } + + expect(response).to redirect_to admin_proposals_path + expect(flash[:notice]).to eq "Proposal updated successfully." + end + end +end diff --git a/spec/factories/legislations.rb b/spec/factories/legislations.rb index 4ae250317..5c27fc3f5 100644 --- a/spec/factories/legislations.rb +++ b/spec/factories/legislations.rb @@ -177,5 +177,9 @@ FactoryBot.define do trait :hidden do hidden_at { Time.current } end + + trait :selected do + selected { true } + end end end