diff --git a/app/components/sdg_management/menu_component.rb b/app/components/sdg_management/menu_component.rb index 0f719ab2b..53e27c231 100644 --- a/app/components/sdg_management/menu_component.rb +++ b/app/components/sdg_management/menu_component.rb @@ -13,6 +13,8 @@ class SDGManagement::MenuComponent < ApplicationComponent def relatable_links SDG::Related::RELATABLE_TYPES.map do |type| + next unless setting["process.#{process_name(type)}"] && setting["sdg.process.#{process_name(type)}"] + [ t("sdg_management.menu.#{table_name(type)}"), relatable_type_path(type), @@ -37,4 +39,14 @@ class SDGManagement::MenuComponent < ApplicationComponent def table_name(type) type.constantize.table_name end + + def process_name(type) + process_name = type.split("::").first + + if process_name == "Legislation" + "legislation" + else + process_name.constantize.table_name + end + end end diff --git a/app/controllers/sdg_management/relations_controller.rb b/app/controllers/sdg_management/relations_controller.rb index 4f6ab77e6..8f2924864 100644 --- a/app/controllers/sdg_management/relations_controller.rb +++ b/app/controllers/sdg_management/relations_controller.rb @@ -1,4 +1,5 @@ class SDGManagement::RelationsController < SDGManagement::BaseController + before_action :check_feature_flags before_action :load_record, only: [:edit, :update] def index @@ -23,4 +24,12 @@ class SDGManagement::RelationsController < SDGManagement::BaseController def relatable_class params[:relatable_type].classify.constantize end + + def check_feature_flags + process_name = params[:relatable_type].split("/").first + process_name = process_name.pluralize unless process_name == "legislation" + + check_feature_flag(process_name) + raise FeatureDisabled, process_name unless Setting["sdg.process.#{process_name}"] + end end diff --git a/spec/components/sdg_management/menu_component_spec.rb b/spec/components/sdg_management/menu_component_spec.rb new file mode 100644 index 000000000..10547e4dd --- /dev/null +++ b/spec/components/sdg_management/menu_component_spec.rb @@ -0,0 +1,92 @@ +require "rails_helper" + +describe SDGManagement::MenuComponent, type: :component do + let(:component) { SDGManagement::MenuComponent.new } + + before do + Setting["sdg.process.budgets"] = true + Setting["sdg.process.debates"] = true + Setting["sdg.process.legislation"] = true + Setting["sdg.process.polls"] = true + Setting["sdg.process.proposals"] = true + end + + context "processes enabled" do + it "generates links to all processes" do + render_inline component + + expect(page).to have_link "Goals and Targets" + expect(page).to have_link "Participatory budgets" + expect(page).to have_link "Debates" + expect(page).to have_link "Collaborative legislation" + expect(page).to have_link "Polls" + expect(page).to have_link "Proposals" + end + end + + context "processes disabled" do + before do + Setting["process.budgets"] = false + Setting["process.debates"] = false + Setting["process.legislation"] = false + Setting["process.polls"] = false + Setting["process.proposals"] = false + end + + it "does not generate links to any processes" do + render_inline component + + expect(page).to have_css "a", count: 1 + expect(page).to have_link "Goals and Targets" + end + end + + context "SDG processes disabled" do + before do + Setting["sdg.process.budgets"] = false + Setting["sdg.process.debates"] = false + Setting["sdg.process.legislation"] = false + Setting["sdg.process.polls"] = false + Setting["sdg.process.proposals"] = false + end + + it "does not generate links to any processes" do + render_inline component + + expect(page).to have_css "a", count: 1 + expect(page).to have_link "Goals and Targets" + end + end + + context "one process disabled" do + before { Setting["process.debates"] = false } + + it "generates links to the enabled processes" do + render_inline component + + expect(page).to have_link "Goals and Targets" + expect(page).to have_link "Participatory budgets" + expect(page).to have_link "Collaborative legislation" + expect(page).to have_link "Polls" + expect(page).to have_link "Proposals" + + expect(page).not_to have_link "Debates" + end + end + + context "one SDG process disabled" do + before { Setting["sdg.process.legislation"] = false } + + it "generates links to the enabled processes" do + render_inline component + + expect(page).to have_link "Goals and Targets" + expect(page).to have_link "Debates" + expect(page).to have_link "Participatory budgets" + expect(page).to have_link "Polls" + expect(page).to have_link "Proposals" + + expect(page).not_to have_link "Collaborative legislation" + end + end +end diff --git a/spec/controllers/sdg_management/relations_spec.rb b/spec/controllers/sdg_management/relations_spec.rb new file mode 100644 index 000000000..fc5e8ecb7 --- /dev/null +++ b/spec/controllers/sdg_management/relations_spec.rb @@ -0,0 +1,98 @@ +require "rails_helper" + +describe SDGManagement::RelationsController do + before do + sign_in create(:administrator).user + + Setting["feature.sdg"] = true + Setting["sdg.process.budgets"] = true + Setting["sdg.process.debates"] = true + Setting["sdg.process.legislation"] = true + Setting["sdg.process.polls"] = true + Setting["sdg.process.proposals"] = true + end + + context "processes disabled" do + it "raises feature disabled for budgets" do + Setting["process.budgets"] = false + + expect do + get :index, params: { relatable_type: "budget/investments" } + end.to raise_exception(FeatureFlags::FeatureDisabled) + end + + it "raises feature disabled for debates" do + Setting["process.debates"] = false + + expect do + get :index, params: { relatable_type: "debates" } + end.to raise_exception(FeatureFlags::FeatureDisabled) + end + + it "raises feature disabled for legislation processes" do + Setting["process.legislation"] = false + + expect do + get :index, params: { relatable_type: "legislation/processes" } + end.to raise_exception(FeatureFlags::FeatureDisabled) + end + + it "raises feature disabled for polls" do + Setting["process.polls"] = false + + expect do + get :index, params: { relatable_type: "polls" } + end.to raise_exception(FeatureFlags::FeatureDisabled) + end + + it "raises feature disabled for proposals" do + Setting["process.proposals"] = false + + expect do + get :index, params: { relatable_type: "proposals" } + end.to raise_exception(FeatureFlags::FeatureDisabled) + end + end + + context "SDG processes disabled" do + it "raises feature disabled for budgets" do + Setting["sdg.process.budgets"] = false + + expect do + get :index, params: { relatable_type: "budget/investments" } + end.to raise_exception(FeatureFlags::FeatureDisabled) + end + + it "raises feature disabled for debates" do + Setting["sdg.process.debates"] = false + + expect do + get :index, params: { relatable_type: "debates" } + end.to raise_exception(FeatureFlags::FeatureDisabled) + end + + it "raises feature disabled for legislation processes" do + Setting["sdg.process.legislation"] = false + + expect do + get :index, params: { relatable_type: "legislation/processes" } + end.to raise_exception(FeatureFlags::FeatureDisabled) + end + + it "raises feature disabled for polls" do + Setting["sdg.process.polls"] = false + + expect do + get :index, params: { relatable_type: "polls" } + end.to raise_exception(FeatureFlags::FeatureDisabled) + end + + it "raises feature disabled for proposals" do + Setting["sdg.process.proposals"] = false + + expect do + get :index, params: { relatable_type: "proposals" } + end.to raise_exception(FeatureFlags::FeatureDisabled) + end + end +end diff --git a/spec/system/sdg_management/relations_spec.rb b/spec/system/sdg_management/relations_spec.rb index af598c6c0..4b477ffdb 100644 --- a/spec/system/sdg_management/relations_spec.rb +++ b/spec/system/sdg_management/relations_spec.rb @@ -4,6 +4,11 @@ describe "SDG Relations", :js do before do login_as(create(:administrator).user) Setting["feature.sdg"] = true + Setting["sdg.process.budgets"] = true + Setting["sdg.process.debates"] = true + Setting["sdg.process.legislation"] = true + Setting["sdg.process.polls"] = true + Setting["sdg.process.proposals"] = true end scenario "navigation" do