diff --git a/app/controllers/sectors_controller.rb b/app/controllers/sectors_controller.rb index 7cef37be8..cdad9b8e7 100644 --- a/app/controllers/sectors_controller.rb +++ b/app/controllers/sectors_controller.rb @@ -5,8 +5,7 @@ def index authorize! per_page = params[:number_of_items_per_page].presence || 25 base_scope = authorized_scope(Sector.all) - filtered = base_scope.sector_name(params[:sector_name]) - .published(params[:published]) + filtered = base_scope.filter_scope(params) @sectors = filtered.order(:name).paginate(page: params[:page], per_page: per_page) @count_display = filtered.count == base_scope.count ? base_scope.count : "#{filtered.count}/#{base_scope.count}" diff --git a/app/models/sector.rb b/app/models/sector.rb index bb794ff5e..929ddec68 100644 --- a/app/models/sector.rb +++ b/app/models/sector.rb @@ -21,6 +21,14 @@ class Sector < ApplicationRecord sector_name.present? ? where("sectors.name LIKE ?", "%#{sector_name}%") : all } scope :has_taggings, -> { joins(:sectorable_items).distinct } + scope :filter_scope, ->(params) do + filtered = self.all + filtered = filtered.sector_name(params[:sector_name]) + filtered = filtered.published if params[:published] == "true" + filtered = filtered.where(published: false) if params[:published] == "false" + filtered + end + private def expire_sectors_cache diff --git a/app/views/sectors/_search_boxes.html.erb b/app/views/sectors/_search_boxes.html.erb index 8ec02cdb8..80d57b6bf 100644 --- a/app/views/sectors/_search_boxes.html.erb +++ b/app/views/sectors/_search_boxes.html.erb @@ -22,7 +22,7 @@ class: "block text-sm font-medium text-gray-700" %> <%= f.select :published, - options_for_select([["All", ""], ["Published", "true"], ["Hidden", "false"]], params[:published]), + options_for_select([["All", ""], %w[Published true], %w[Unpublished false]], params[:published]), {}, class: "mt-1 block w-full rounded-md border border-gray-300 p-2", onchange: "this.form.requestSubmit()" %> diff --git a/spec/system/sectors_controller_spec.rb b/spec/system/sectors_controller_spec.rb new file mode 100644 index 000000000..275b7c4d3 --- /dev/null +++ b/spec/system/sectors_controller_spec.rb @@ -0,0 +1,82 @@ +require 'rails_helper' + +RSpec.describe SectorsController, type: :system do + describe "#index" do + let!(:admin) { create(:user, :admin) } + + before do + sign_in(admin) + end + + subject { visit sectors_path(params) } + + let!(:sectors) do + [ + create(:sector, name: "Sector1", published: true), + create(:sector, name: "Sector2", published: true), + create(:sector, name: "Sector3", published: false), + create(:sector, name: "Sector4", published: false) + ] + end + + context "without filters" do + let(:params) { {} } + + it "returns all sectors" do + subject + within "table" do + sectors.each do |sector| + expect(page).to have_content(sector.name) + expect(page).to have_content(sector.published ? "Yes" : "No") + end + end + end + end + + context "with published filter" do + let(:params) { { published: "true" } } + let(:published_sectors) { sectors.select(&:published) } + + it "returns only published sectors" do + subject + within "table" do + sectors.select(&:published).each do |sector| + expect(page).to have_content(sector.name) + expect(page).to have_content("Yes") + end + expect(page).to have_css('table tbody tr', count: published_sectors.size) + end + end + end + + context "with unpublished filter" do + let(:params) { { published: "false" } } + let(:unpublished_sectors) { sectors.reject(&:published) } + + it "returns only unpublished sectors" do + subject + within "table" do + sectors.reject(&:published).each do |sector| + expect(page).to have_content(sector.name) + expect(page).to have_content("No") + end + expect(page).to have_css('table tbody tr', count: unpublished_sectors.size) + end + end + end + + context "with name filter" do + let(:params) { { sector_name: "Sector1" } } + + it "returns sectors matching the name filter" do + subject + within "table" do + expect(page).to have_content("Sector1") + expect(page).not_to have_content("Sector2") + expect(page).not_to have_content("Sector3") + expect(page).not_to have_content("Sector4") + end + end + end + end + end