From 5366ce9af5b07bb1566bde48c447ed60e0904d7b Mon Sep 17 00:00:00 2001 From: Jack S Date: Tue, 18 Apr 2023 14:34:23 +0100 Subject: [PATCH] Scope user selection when data coordinator --- .../form/common/questions/created_by_id.rb | 18 ++-- .../form/lettings/questions/created_by_id.rb | 22 +++-- .../form/common/pages/created_by_spec.rb | 2 +- .../common/questions/created_by_id_spec.rb | 69 ++++++++++---- .../form/lettings/pages/created_by_spec.rb | 2 +- .../lettings/questions/created_by_id_spec.rb | 89 +++++++++++++------ 6 files changed, 145 insertions(+), 57 deletions(-) diff --git a/app/models/form/common/questions/created_by_id.rb b/app/models/form/common/questions/created_by_id.rb index 1e29ccdcf..1ce4deec7 100644 --- a/app/models/form/common/questions/created_by_id.rb +++ b/app/models/form/common/questions/created_by_id.rb @@ -1,4 +1,6 @@ class Form::Common::Questions::CreatedById < ::Form::Question + ANSWER_OPTS = { "" => "Select an option" }.freeze + def initialize(id, hsh, page) super @id = "created_by_id" @@ -8,19 +10,23 @@ class Form::Common::Questions::CreatedById < ::Form::Question end def answer_options - answer_opts = { "" => "Select an option" } - return answer_opts unless ActiveRecord::Base.connected? + return ANSWER_OPTS unless ActiveRecord::Base.connected? - User.select(:id, :name, :email).each_with_object(answer_opts) do |user, hsh| + User.select(:id, :name, :email).each_with_object(ANSWER_OPTS.dup) do |user, hsh| hsh[user.id] = "#{user.name} (#{user.email})" hsh end end - def displayed_answer_options(log, _user = nil) - return answer_options unless log.owning_organisation + def displayed_answer_options(log, user = nil) + return ANSWER_OPTS unless log.owning_organisation + return ANSWER_OPTS unless user + return ANSWER_OPTS unless user.support? || user.data_coordinator? + + users = user.support? ? log.owning_organisation.users : user.organisation.users + + user_ids = users.pluck(:id) + [""] - user_ids = log.owning_organisation.users.pluck(:id) + [""] answer_options.select { |k, _v| user_ids.include?(k) } end diff --git a/app/models/form/lettings/questions/created_by_id.rb b/app/models/form/lettings/questions/created_by_id.rb index 30cbc2c5b..72b08d3fc 100644 --- a/app/models/form/lettings/questions/created_by_id.rb +++ b/app/models/form/lettings/questions/created_by_id.rb @@ -1,4 +1,6 @@ class Form::Lettings::Questions::CreatedById < ::Form::Question + ANSWER_OPTS = { "" => "Select an option" }.freeze + def initialize(id, hsh, page) super @id = "created_by_id" @@ -8,21 +10,27 @@ class Form::Lettings::Questions::CreatedById < ::Form::Question end def answer_options - answer_opts = { "" => "Select an option" } - return answer_opts unless ActiveRecord::Base.connected? + return ANSWER_OPTS unless ActiveRecord::Base.connected? - User.select(:id, :name, :email).each_with_object(answer_opts) do |user, hsh| + User.select(:id, :name, :email).each_with_object(ANSWER_OPTS.dup) do |user, hsh| hsh[user.id] = "#{user.name} (#{user.email})" hsh end end - def displayed_answer_options(log, _user = nil) - return answer_options unless log.owning_organisation && log.managing_organisation + def displayed_answer_options(log, user = nil) + return ANSWER_OPTS unless user + return ANSWER_OPTS unless user.support? || user.data_coordinator? user_ids = [""] - user_ids += log.owning_organisation.users.pluck(:id) - user_ids += log.managing_organisation.users.pluck(:id) + user_ids += if user.support? + [ + (log.owning_organisation&.users&.pluck(:id) if log.owning_organisation), + (log.managing_organisation&.users&.pluck(:id) if log.managing_organisation), + ] + else + user.organisation.users.pluck(:id) + end.flatten.uniq answer_options.select { |k, _v| user_ids.include?(k) } end diff --git a/spec/models/form/common/pages/created_by_spec.rb b/spec/models/form/common/pages/created_by_spec.rb index 9c5fddc5f..b095b1a30 100644 --- a/spec/models/form/common/pages/created_by_spec.rb +++ b/spec/models/form/common/pages/created_by_spec.rb @@ -49,7 +49,7 @@ RSpec.describe Form::Common::Pages::CreatedBy, type: :model do end end - context "when the current user is not a support user" do + context "when the current user is a data provider" do let(:user) { build(:user) } it "is not shown" do diff --git a/spec/models/form/common/questions/created_by_id_spec.rb b/spec/models/form/common/questions/created_by_id_spec.rb index 45f1a95af..e287198b1 100644 --- a/spec/models/form/common/questions/created_by_id_spec.rb +++ b/spec/models/form/common/questions/created_by_id_spec.rb @@ -56,35 +56,72 @@ RSpec.describe Form::Common::Questions::CreatedById, type: :model do it "is shown in check answers" do expect(question.hidden_in_check_answers?(nil, support_user)).to be false end + + describe "#displayed_answer_options" do + let(:owning_org_user) { create(:user) } + let(:sales_log) { create(:sales_log, owning_organisation: owning_org_user.organisation) } + let(:expected_answer_options) do + { + "" => "Select an option", + owning_org_user.id => "#{owning_org_user.name} (#{owning_org_user.email})", + } + end + + it "only displays users that belong to the owning organisation" do + expect(question.displayed_answer_options(sales_log, support_user)).to eq(expected_answer_options) + end + end end context "when the current user is data_coordinator" do - let(:support_user) { build(:user, :data_coordinator) } + let(:data_coordinator) { create(:user, :data_coordinator) } it "is shown in check answers" do - expect(question.hidden_in_check_answers?(nil, support_user)).to be false + expect(question.hidden_in_check_answers?(nil, data_coordinator)).to be false + end + + describe "#displayed_answer_options" do + let(:owning_org_user) { create(:user) } + let(:sales_log) { create(:sales_log, owning_organisation: owning_org_user.organisation) } + let(:user_in_same_org) { create(:user, organisation: data_coordinator.organisation) } + + let(:expected_answer_options) do + { + "" => "Select an option", + user_in_same_org.id => "#{user_in_same_org.name} (#{user_in_same_org.email})", + data_coordinator.id => "#{data_coordinator.name} (#{data_coordinator.email})", + } + end + + it "only displays users that belong user's org" do + expect(question.displayed_answer_options(sales_log, data_coordinator)).to eq(expected_answer_options) + end end end context "when the current user is data_provider" do - let(:user) { build(:user, :data_provider) } + let(:data_provider) { create(:user, :data_provider) } it "is not shown in check answers" do - expect(question.hidden_in_check_answers?(nil, user)).to be true - end - end - - context "when the owning organisation is already set" do - let(:lettings_log) { create(:lettings_log, owning_organisation: user_2.organisation) } - let(:expected_answer_options) do - { - "" => "Select an option", - user_2.id => "#{user_2.name} (#{user_2.email})", - } + expect(question.hidden_in_check_answers?(nil, data_provider)).to be true end - it "only displays users that belong to that organisation" do - expect(question.displayed_answer_options(lettings_log)).to eq(expected_answer_options) + describe "#displayed_answer_options" do + let(:owning_org_user) { create(:user) } + let(:sales_log) { create(:sales_log, owning_organisation: owning_org_user.organisation) } + let(:user_in_same_org) { create(:user, organisation: data_provider.organisation) } + + let(:expected_answer_options) do + { + "" => "Select an option", + user_in_same_org.id => "#{user_in_same_org.name} (#{user_in_same_org.email})", + data_provider.id => "#{data_provider.name} (#{data_provider.email})", + } + end + + it "only displays users that belong user's org" do + expect(question.displayed_answer_options(sales_log, data_provider)).to eq(Form::Common::Questions::CreatedById::ANSWER_OPTS) + end end end end diff --git a/spec/models/form/lettings/pages/created_by_spec.rb b/spec/models/form/lettings/pages/created_by_spec.rb index dd98c0fa6..24b7b90d5 100644 --- a/spec/models/form/lettings/pages/created_by_spec.rb +++ b/spec/models/form/lettings/pages/created_by_spec.rb @@ -28,7 +28,7 @@ RSpec.describe Form::Lettings::Pages::CreatedBy, type: :model do end end - context "when not support" do + context "when data provider" do it "is not shown" do expect(page.routed_to?(nil, create(:user))).to eq(false) end diff --git a/spec/models/form/lettings/questions/created_by_id_spec.rb b/spec/models/form/lettings/questions/created_by_id_spec.rb index 9378e355f..aff15e93e 100644 --- a/spec/models/form/lettings/questions/created_by_id_spec.rb +++ b/spec/models/form/lettings/questions/created_by_id_spec.rb @@ -52,48 +52,85 @@ RSpec.describe Form::Lettings::Questions::CreatedById, type: :model do end context "when the current user is support" do - let(:support_user) { build(:user, :support) } + let(:owning_org_user) { create(:user) } + let(:managing_org_user) { create(:user) } + let(:support_user) { create(:user, :support, organisation: owning_org_user.organisation) } it "is shown in check answers" do expect(question.hidden_in_check_answers?(nil, support_user)).to be false end + + describe "#displayed_answer_options" do + let(:lettings_log) do + create(:lettings_log, created_by: support_user, owning_organisation: owning_org_user.organisation, managing_organisation: managing_org_user.organisation) + end + + let(:expected_answer_options) do + { + "" => "Select an option", + managing_org_user.id => "#{managing_org_user.name} (#{managing_org_user.email})", + owning_org_user.id => "#{owning_org_user.name} (#{owning_org_user.email})", + support_user.id => "#{support_user.name} (#{support_user.email})", + } + end + + it "only displays users that belong to owning and managing organisations" do + expect(question.displayed_answer_options(lettings_log, support_user)).to eq(expected_answer_options) + end + end end - context "when the current user is daa coordinator" do - let(:user) { build(:user, :data_coordinator) } + context "when the current user is data_coordinator" do + let(:managing_org_user) { create(:user) } + let(:data_coordinator) { create(:user, :data_coordinator) } it "is shown in check answers" do - expect(question.hidden_in_check_answers?(nil, user)).to be false + expect(question.hidden_in_check_answers?(nil, data_coordinator)).to be false end - end - context "when the current user is not support" do - let(:user) { build(:user) } + describe "#displayed_answer_options" do + let(:lettings_log) do + create(:lettings_log, created_by: data_coordinator, owning_organisation: data_coordinator.organisation, managing_organisation: managing_org_user.organisation) + end - it "is not shown in check answers" do - expect(question.hidden_in_check_answers?(nil, user)).to be true + let(:user_in_same_org) { create(:user, organisation: data_coordinator.organisation) } + + let(:expected_answer_options) do + { + "" => "Select an option", + data_coordinator.id => "#{data_coordinator.name} (#{data_coordinator.email})", + } + end + + it "only displays users that belong user's org" do + expect(question.displayed_answer_options(lettings_log, data_coordinator)).to eq(expected_answer_options) + end end end - context "when the owning organisation is already set" do - let(:lettings_log) do - create( - :lettings_log, - created_by: user_2, - owning_organisation: user_2.organisation, - managing_organisation: user_3.organisation, - ) - end - let(:expected_answer_options) do - { - "" => "Select an option", - user_2.id => "#{user_2.name} (#{user_2.email})", - user_3.id => "#{user_3.name} (#{user_3.email})", - } + context "when the current user is data_provider" do + let(:data_provider) { create(:user, :data_provider) } + + it "is not shown in check answers" do + expect(question.hidden_in_check_answers?(nil, data_provider)).to be true end - it "only displays users that belong to that organisation" do - expect(question.displayed_answer_options(lettings_log)).to eq(expected_answer_options) + describe "#displayed_answer_options" do + let(:owning_org_user) { create(:user) } + let(:lettings_log) { create(:lettings_log, owning_organisation: owning_org_user.organisation) } + let(:user_in_same_org) { create(:user, organisation: data_provider.organisation) } + + let(:expected_answer_options) do + { + "" => "Select an option", + user_in_same_org.id => "#{user_in_same_org.name} (#{user_in_same_org.email})", + data_provider.id => "#{data_provider.name} (#{data_provider.email})", + } + end + + it "only displays users that belong user's org" do + expect(question.displayed_answer_options(lettings_log, data_provider)).to eq(Form::Common::Questions::CreatedById::ANSWER_OPTS) + end end end end