From 620c9f4c556aeec67562ad48bb3d386c7cf2907c Mon Sep 17 00:00:00 2001 From: Kat Date: Wed, 31 Jul 2024 08:52:49 +0100 Subject: [PATCH] Update filter helpers --- app/helpers/filters_helper.rb | 51 +++-- app/models/organisation.rb | 2 +- spec/helpers/filters_helper_spec.rb | 298 +++++++++++++++++++++++++--- spec/models/user_spec.rb | 4 +- 4 files changed, 305 insertions(+), 50 deletions(-) diff --git a/app/helpers/filters_helper.rb b/app/helpers/filters_helper.rb index 5d88b5ab5..0d5b00796 100644 --- a/app/helpers/filters_helper.rb +++ b/app/helpers/filters_helper.rb @@ -85,21 +85,32 @@ module FiltersHelper end def owning_organisation_filter_options(user, filter_type) - if applied_filters(filter_type)["owning_organisation"].present? && user.support? - org = Organisation.find(applied_filters(filter_type)["owning_organisation"]) - [OpenStruct.new(id: org.id, name: org.name)] - else - [OpenStruct.new(id: "", name: "Select an option")] + if applied_filters(filter_type)["owning_organisation"].present? + organisation_id = applied_filters(filter_type)["owning_organisation"] + + org = if user.support? + Organisation.where(id: organisation_id)&.first + else + Organisation.affiliated_organisations(user.organisation).where(id: organisation_id)&.first + end + return [OpenStruct.new(id: org.id, name: org.name)] if org.present? end + + [OpenStruct.new(id: "", name: "Select an option")] end def assigned_to_filter_options(filter_type) if applied_filters(filter_type)["assigned_to"] == "specific_user" && applied_filters(filter_type)["user"].present? - user = User.find(applied_filters(filter_type)["user"]) # make sure this doesn't expose anything weird - [OpenStruct.new(id: user.id, name: user.name, hint: user.email)] - else - [OpenStruct.new(id: "", name: "Select an option", hint: "")] + user_id = applied_filters(filter_type)["user"] + user = if user.support? + User.where(id: user_id)&.first + else + User.affiliated_users(user.organisation).where(id: user_id)&.first + end + + return [OpenStruct.new(id: user.id, name: user.name, hint: user.email)] if user.present? end + [OpenStruct.new(id: "", name: "Select an option", hint: "")] end def filter_search_url(category) @@ -143,12 +154,18 @@ module FiltersHelper end def managing_organisation_filter_options(user, filter_type) - if applied_filters(filter_type)["managing_organisation"].present? && user.support? - org = Organisation.find(applied_filters(filter_type)["managing_organisation"]) # make sure this doesn't expose anything weird - [OpenStruct.new(id: org.id, name: org.name)] - else - [OpenStruct.new(id: "", name: "Select an option")] + if applied_filters(filter_type)["managing_organisation"].present? + organisation_id = applied_filters(filter_type)["managing_organisation"] + + org = if user.support? + Organisation.where(id: organisation_id)&.first + else + Organisation.affiliated_organisations(user.organisation).where(id: organisation_id)&.first + end + return [OpenStruct.new(id: org.id, name: org.name)] if org.present? end + + [OpenStruct.new(id: "", name: "Select an option")] end def show_scheme_managing_org_filter?(user) @@ -277,11 +294,11 @@ private return "All" if session_filters["assigned_to"].include?("all") return "You" if session_filters["assigned_to"].include?("you") - User.affiliated_users(current_user.organisationq).find(session_filters["user"].to_i).name - selected_user_option = User.affiliated_users(current_user.organisationq).find(session_filters["user"].to_i).name + User.affiliated_users(current_user.organisation).find(session_filters["user"].to_i).name + selected_user_option = User.affiliated_users(current_user.organisation).find(session_filters["user"].to_i) return unless selected_user_option - "#{selected_user_option.name} (#{selected_user_option.hint})" + "#{selected_user_option.name} (#{selected_user_option.email})" end def formatted_owned_by_filter(session_filters, filter_type) diff --git a/app/models/organisation.rb b/app/models/organisation.rb index f0e8ca243..65b35c24e 100644 --- a/app/models/organisation.rb +++ b/app/models/organisation.rb @@ -18,7 +18,7 @@ class Organisation < ApplicationRecord belongs_to :absorbing_organisation, class_name: "Organisation", optional: true has_many :absorbed_organisations, class_name: "Organisation", foreign_key: "absorbing_organisation_id" scope :visible, -> { where(discarded_at: nil) } - scope :affiliated_organisations, ->(organisation) { where(id: (organisation.child_organisations + [organisation] + organisation.parent_organisations).map(&:id)) } + scope :affiliated_organisations, ->(organisation) { where(id: (organisation.child_organisations + [organisation] + organisation.parent_organisations + organisation.absorbed_organisations).map(&:id)) } def affiliated_stock_owners ids = [] diff --git a/spec/helpers/filters_helper_spec.rb b/spec/helpers/filters_helper_spec.rb index 27420b299..c57f92311 100644 --- a/spec/helpers/filters_helper_spec.rb +++ b/spec/helpers/filters_helper_spec.rb @@ -175,27 +175,146 @@ RSpec.describe FiltersHelper do context "with a support user" do let(:user) { FactoryBot.create(:user, :support, organisation: child_organisation) } - it "returns a list of all organisations" do - expect(owning_organisation_filter_options(user, "lettings_logs")).to match_array([ - OpenStruct.new(id: "", name: "Select an option"), - OpenStruct.new(id: child_organisation.id, name: "Child organisation"), - OpenStruct.new(id: absorbed_organisation.id, name: "Absorbed organisation"), - OpenStruct.new(id: parent_organisation.id, name: "Parent organisation"), - OpenStruct.new(id: 99, name: "Other organisation"), - ]) + context "when no organisation is selected in the filters" do + it "returns an empty list" do + expect(owning_organisation_filter_options(user.reload, "lettings_logs")).to eq([ + OpenStruct.new(id: "", name: "Select an option"), + ]) + end + end + + context "when a specific child organisation is selected in the filters" do + before do + session[:lettings_logs_filters] = { "owning_organisation": child_organisation.id }.to_json + end + + it "returns the selected organisation in the list" do + expect(owning_organisation_filter_options(user.reload, "lettings_logs")).to eq([ + OpenStruct.new(id: child_organisation.id, name: "Child organisation"), + ]) + end + end + + context "when a specific parent organisation is selected in the filters" do + before do + session[:lettings_logs_filters] = { "owning_organisation": parent_organisation.id }.to_json + end + + it "returns the selected organisation in the list" do + expect(owning_organisation_filter_options(user.reload, "lettings_logs")).to eq([ + OpenStruct.new(id: parent_organisation.id, name: "Parent organisation"), + ]) + end + end + + context "when a specific absorbed organisation is selected in the filters" do + before do + session[:lettings_logs_filters] = { "owning_organisation": absorbed_organisation.id }.to_json + end + + it "returns the selected organisation in the list" do + expect(owning_organisation_filter_options(user.reload, "lettings_logs")).to eq([ + OpenStruct.new(id: absorbed_organisation.id, name: "Absorbed organisation"), + ]) + end + end + + context "when a specific non related organisation is selected in the filters" do + let(:unrelated_organisation) { create(:organisation, name: "Unrelated organisation") } + + before do + session[:lettings_logs_filters] = { "owning_organisation": unrelated_organisation.id }.to_json + end + + it "returns the selected organisation in the list" do + expect(owning_organisation_filter_options(user.reload, "lettings_logs")).to eq([ + OpenStruct.new(id: unrelated_organisation.id, name: "Unrelated organisation"), + ]) + end + end + + context "when a non existing organisation is selected in the filters" do + before do + session[:lettings_logs_filters] = { "owning_organisation": 143_542_542 }.to_json + end + + it "returns an empty list" do + expect(owning_organisation_filter_options(user.reload, "lettings_logs")).to eq([ + OpenStruct.new(id: "", name: "Select an option"), + ]) + end end end context "with a data coordinator user" do let(:user) { FactoryBot.create(:user, :data_coordinator, organisation: child_organisation) } - it "returns a list of parent orgs and your own organisation" do - expect(owning_organisation_filter_options(user.reload, "lettings_logs")).to eq([ - OpenStruct.new(id: "", name: "Select an option"), - OpenStruct.new(id: child_organisation.id, name: "Child organisation"), - OpenStruct.new(id: parent_organisation.id, name: "Parent organisation"), - OpenStruct.new(id: absorbed_organisation.id, name: "Absorbed organisation"), - ]) + context "when no organisation is selected in the filters" do + it "returns an empty list" do + expect(owning_organisation_filter_options(user.reload, "lettings_logs")).to eq([ + OpenStruct.new(id: "", name: "Select an option"), + ]) + end + end + + context "when a specific child organisation is selected in the filters" do + before do + session[:lettings_logs_filters] = { "owning_organisation": child_organisation.id }.to_json + end + + it "returns the selected organisation in the list" do + expect(owning_organisation_filter_options(user.reload, "lettings_logs")).to eq([ + OpenStruct.new(id: child_organisation.id, name: "Child organisation"), + ]) + end + end + + context "when a specific parent organisation is selected in the filters" do + before do + session[:lettings_logs_filters] = { "owning_organisation": parent_organisation.id }.to_json + end + + it "returns the selected organisation in the list" do + expect(owning_organisation_filter_options(user.reload, "lettings_logs")).to eq([ + OpenStruct.new(id: parent_organisation.id, name: "Parent organisation"), + ]) + end + end + + context "when a specific absorbed organisation is selected in the filters" do + before do + session[:lettings_logs_filters] = { "owning_organisation": absorbed_organisation.id }.to_json + end + + it "returns the selected organisation in the list" do + expect(owning_organisation_filter_options(user.reload, "lettings_logs")).to eq([ + OpenStruct.new(id: absorbed_organisation.id, name: "Absorbed organisation"), + ]) + end + end + + context "when a specific non related organisation is selected in the filters" do + before do + session[:lettings_logs_filters] = { "owning_organisation": create(:organisation).id }.to_json + end + + it "returns an empty list" do + expect(owning_organisation_filter_options(user.reload, "lettings_logs")).to eq([ + OpenStruct.new(id: "", name: "Select an option"), + ]) + end + end + + context "when a non existing organisation is selected in the filters" do + before do + session[:lettings_logs_filters] = { "owning_organisation": 143_542_542 }.to_json + end + + it "returns an empty list" do + expect(owning_organisation_filter_options(user.reload, "lettings_logs")).to eq([ + OpenStruct.new(id: "", name: "Select an option"), + ]) + end end end end @@ -214,27 +333,146 @@ RSpec.describe FiltersHelper do context "with a support user" do let(:user) { FactoryBot.create(:user, :support, organisation: parent_organisation) } - it "returns a list of all organisations" do - expect(managing_organisation_filter_options(user, "lettings_logs")).to eq([ - OpenStruct.new(id: "", name: "Select an option"), - OpenStruct.new(id: parent_organisation.id, name: "Parent organisation"), - OpenStruct.new(id: absorbed_organisation.id, name: "Absorbed organisation"), - OpenStruct.new(id: child_organisation.id, name: "Child organisation"), - OpenStruct.new(id: 99, name: "Other organisation"), - ]) + context "when no organisation is selected in the filters" do + it "returns an empty list" do + expect(managing_organisation_filter_options(user.reload, "lettings_logs")).to eq([ + OpenStruct.new(id: "", name: "Select an option"), + ]) + end + end + + context "when a specific child organisation is selected in the filters" do + before do + session[:lettings_logs_filters] = { "managing_organisation": child_organisation.id }.to_json + end + + it "returns the selected organisation in the list" do + expect(managing_organisation_filter_options(user.reload, "lettings_logs")).to eq([ + OpenStruct.new(id: child_organisation.id, name: "Child organisation"), + ]) + end + end + + context "when a specific parent organisation is selected in the filters" do + before do + session[:lettings_logs_filters] = { "managing_organisation": parent_organisation.id }.to_json + end + + it "returns the selected organisation in the list" do + expect(managing_organisation_filter_options(user.reload, "lettings_logs")).to eq([ + OpenStruct.new(id: parent_organisation.id, name: "Parent organisation"), + ]) + end + end + + context "when a specific absorbed organisation is selected in the filters" do + before do + session[:lettings_logs_filters] = { "managing_organisation": absorbed_organisation.id }.to_json + end + + it "returns the selected organisation in the list" do + expect(managing_organisation_filter_options(user.reload, "lettings_logs")).to eq([ + OpenStruct.new(id: absorbed_organisation.id, name: "Absorbed organisation"), + ]) + end + end + + context "when a specific non related organisation is selected in the filters" do + let(:unrelated_organisation) { create(:organisation, name: "Unrelated organisation") } + + before do + session[:lettings_logs_filters] = { "managing_organisation": unrelated_organisation.id }.to_json + end + + it "returns the selected organisation in the list" do + expect(managing_organisation_filter_options(user.reload, "lettings_logs")).to eq([ + OpenStruct.new(id: unrelated_organisation.id, name: "Unrelated organisation"), + ]) + end + end + + context "when a non existing organisation is selected in the filters" do + before do + session[:lettings_logs_filters] = { "managing_organisation": 143_542_542 }.to_json + end + + it "returns an empty list" do + expect(managing_organisation_filter_options(user.reload, "lettings_logs")).to eq([ + OpenStruct.new(id: "", name: "Select an option"), + ]) + end end end context "with a data coordinator user" do let(:user) { FactoryBot.create(:user, :data_coordinator, organisation: parent_organisation) } - it "returns a list of child orgs and your own organisation" do - expect(managing_organisation_filter_options(user.reload, "lettings_logs")).to eq([ - OpenStruct.new(id: "", name: "Select an option"), - OpenStruct.new(id: parent_organisation.id, name: "Parent organisation"), - OpenStruct.new(id: child_organisation.id, name: "Child organisation"), - OpenStruct.new(id: absorbed_organisation.id, name: "Absorbed organisation"), - ]) + context "when no organisation is selected in the filters" do + it "returns an empty list" do + expect(managing_organisation_filter_options(user.reload, "lettings_logs")).to eq([ + OpenStruct.new(id: "", name: "Select an option"), + ]) + end + end + + context "when a specific child organisation is selected in the filters" do + before do + session[:lettings_logs_filters] = { "managing_organisation": child_organisation.id }.to_json + end + + it "returns the selected organisation in the list" do + expect(managing_organisation_filter_options(user.reload, "lettings_logs")).to eq([ + OpenStruct.new(id: child_organisation.id, name: "Child organisation"), + ]) + end + end + + context "when a specific parent organisation is selected in the filters" do + before do + session[:lettings_logs_filters] = { "managing_organisation": parent_organisation.id }.to_json + end + + it "returns the selected organisation in the list" do + expect(managing_organisation_filter_options(user.reload, "lettings_logs")).to eq([ + OpenStruct.new(id: parent_organisation.id, name: "Parent organisation"), + ]) + end + end + + context "when a specific absorbed organisation is selected in the filters" do + before do + session[:lettings_logs_filters] = { "managing_organisation": absorbed_organisation.id }.to_json + end + + it "returns the selected organisation in the list" do + expect(managing_organisation_filter_options(user.reload, "lettings_logs")).to eq([ + OpenStruct.new(id: absorbed_organisation.id, name: "Absorbed organisation"), + ]) + end + end + + context "when a specific non related organisation is selected in the filters" do + before do + session[:lettings_logs_filters] = { "managing_organisation": create(:organisation).id }.to_json + end + + it "returns an empty list" do + expect(managing_organisation_filter_options(user.reload, "lettings_logs")).to eq([ + OpenStruct.new(id: "", name: "Select an option"), + ]) + end + end + + context "when a non existing organisation is selected in the filters" do + before do + session[:lettings_logs_filters] = { "managing_organisation": 143_542_542 }.to_json + end + + it "returns an empty list" do + expect(managing_organisation_filter_options(user.reload, "lettings_logs")).to eq([ + OpenStruct.new(id: "", name: "Select an option"), + ]) + end end end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index edb998ac3..fab37e591 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -174,7 +174,7 @@ RSpec.describe User, type: :model do end it "can filter lettings logs by user, year, status, managing_organisation and owning_organisation" do - expect(user.logs_filters).to match_array(%w[years status needstypes assigned_to user managing_organisation owning_organisation bulk_upload_id]) + expect(user.logs_filters).to match_array(%w[years status needstypes assigned_to user managing_organisation owning_organisation bulk_upload_id managing_organisation_text_search owning_organisation_text_search user_text_search]) end end end @@ -215,7 +215,7 @@ RSpec.describe User, type: :model do end it "can filter lettings logs by user, year, status, managing_organisation and owning_organisation" do - expect(user.logs_filters).to match_array(%w[years status needstypes assigned_to user owning_organisation managing_organisation bulk_upload_id]) + expect(user.logs_filters).to match_array(%w[years status needstypes assigned_to user owning_organisation managing_organisation bulk_upload_id managing_organisation_text_search owning_organisation_text_search user_text_search]) end end