Browse Source

Scope user selection when data coordinator

pull/1533/head
Jack S 3 years ago
parent
commit
5366ce9af5
  1. 18
      app/models/form/common/questions/created_by_id.rb
  2. 22
      app/models/form/lettings/questions/created_by_id.rb
  3. 2
      spec/models/form/common/pages/created_by_spec.rb
  4. 69
      spec/models/form/common/questions/created_by_id_spec.rb
  5. 2
      spec/models/form/lettings/pages/created_by_spec.rb
  6. 89
      spec/models/form/lettings/questions/created_by_id_spec.rb

18
app/models/form/common/questions/created_by_id.rb

@ -1,4 +1,6 @@
class Form::Common::Questions::CreatedById < ::Form::Question class Form::Common::Questions::CreatedById < ::Form::Question
ANSWER_OPTS = { "" => "Select an option" }.freeze
def initialize(id, hsh, page) def initialize(id, hsh, page)
super super
@id = "created_by_id" @id = "created_by_id"
@ -8,19 +10,23 @@ class Form::Common::Questions::CreatedById < ::Form::Question
end end
def answer_options 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[user.id] = "#{user.name} (#{user.email})"
hsh hsh
end end
end end
def displayed_answer_options(log, _user = nil) def displayed_answer_options(log, user = nil)
return answer_options unless log.owning_organisation 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) } answer_options.select { |k, _v| user_ids.include?(k) }
end end

22
app/models/form/lettings/questions/created_by_id.rb

@ -1,4 +1,6 @@
class Form::Lettings::Questions::CreatedById < ::Form::Question class Form::Lettings::Questions::CreatedById < ::Form::Question
ANSWER_OPTS = { "" => "Select an option" }.freeze
def initialize(id, hsh, page) def initialize(id, hsh, page)
super super
@id = "created_by_id" @id = "created_by_id"
@ -8,21 +10,27 @@ class Form::Lettings::Questions::CreatedById < ::Form::Question
end end
def answer_options 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[user.id] = "#{user.name} (#{user.email})"
hsh hsh
end end
end end
def displayed_answer_options(log, _user = nil) def displayed_answer_options(log, user = nil)
return answer_options unless log.owning_organisation && log.managing_organisation return ANSWER_OPTS unless user
return ANSWER_OPTS unless user.support? || user.data_coordinator?
user_ids = [""] user_ids = [""]
user_ids += log.owning_organisation.users.pluck(:id) user_ids += if user.support?
user_ids += log.managing_organisation.users.pluck(:id) [
(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) } answer_options.select { |k, _v| user_ids.include?(k) }
end end

2
spec/models/form/common/pages/created_by_spec.rb

@ -49,7 +49,7 @@ RSpec.describe Form::Common::Pages::CreatedBy, type: :model do
end end
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) } let(:user) { build(:user) }
it "is not shown" do it "is not shown" do

69
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 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, support_user)).to be false
end 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 end
context "when the current user is data_coordinator" do 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 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
end end
context "when the current user is data_provider" do 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 it "is not shown in check answers" do
expect(question.hidden_in_check_answers?(nil, user)).to be true expect(question.hidden_in_check_answers?(nil, data_provider)).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})",
}
end end
it "only displays users that belong to that organisation" do describe "#displayed_answer_options" do
expect(question.displayed_answer_options(lettings_log)).to eq(expected_answer_options) 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 end
end end

2
spec/models/form/lettings/pages/created_by_spec.rb

@ -28,7 +28,7 @@ RSpec.describe Form::Lettings::Pages::CreatedBy, type: :model do
end end
end end
context "when not support" do context "when data provider" do
it "is not shown" do it "is not shown" do
expect(page.routed_to?(nil, create(:user))).to eq(false) expect(page.routed_to?(nil, create(:user))).to eq(false)
end end

89
spec/models/form/lettings/questions/created_by_id_spec.rb

@ -52,48 +52,85 @@ RSpec.describe Form::Lettings::Questions::CreatedById, type: :model do
end end
context "when the current user is support" do 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 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, support_user)).to be false
end 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 end
context "when the current user is daa coordinator" do context "when the current user is data_coordinator" do
let(:user) { build(:user, :data_coordinator) } let(:managing_org_user) { create(:user) }
let(:data_coordinator) { create(:user, :data_coordinator) }
it "is shown in check answers" do 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
end
context "when the current user is not support" do describe "#displayed_answer_options" do
let(:user) { build(:user) } 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 let(:user_in_same_org) { create(:user, organisation: data_coordinator.organisation) }
expect(question.hidden_in_check_answers?(nil, user)).to be true
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
end end
context "when the owning organisation is already set" do context "when the current user is data_provider" do
let(:lettings_log) do let(:data_provider) { create(:user, :data_provider) }
create(
:lettings_log, it "is not shown in check answers" do
created_by: user_2, expect(question.hidden_in_check_answers?(nil, data_provider)).to be true
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})",
}
end end
it "only displays users that belong to that organisation" do describe "#displayed_answer_options" do
expect(question.displayed_answer_options(lettings_log)).to eq(expected_answer_options) 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 end
end end

Loading…
Cancel
Save