diff --git a/app/models/requests/router.rb b/app/models/requests/router.rb index 2784158e2..b6ca01c8d 100644 --- a/app/models/requests/router.rb +++ b/app/models/requests/router.rb @@ -2,13 +2,10 @@ module Requests # This class assigns "services" a given requestable object is available through class Router - attr_reader :user, :patron, :any_loanable, :requestable - - delegate :cas_provider?, :alma_provider?, to: :user + attr_reader :patron, :any_loanable, :requestable def initialize(requestable:, any_loanable: false, patron: nil) @requestable = requestable - @user = patron.user @patron = patron @any_loanable = any_loanable end @@ -47,20 +44,20 @@ def calculate_services def eligibility_checks [ ServiceEligibility::ILL.new(requestable:, patron:, any_loanable:), - ServiceEligibility::OnOrder.new(requestable:, user:), + ServiceEligibility::OnOrder.new(requestable:, patron:), ServiceEligibility::Annex::Pickup.new(requestable:, patron:), ServiceEligibility::Annex::NoItems.new(requestable:, patron:), ServiceEligibility::OnShelfDigitize.new(requestable:, patron:), ServiceEligibility::OnShelfPickup.new(requestable:, patron:), - ServiceEligibility::InProcess.new(requestable:, user:), - ServiceEligibility::MarquandInLibrary.new(requestable:, user:), - ServiceEligibility::MarquandEdd.new(requestable:, user:), - ServiceEligibility::MarquandPageChargedItem.new(requestable:, user:), - ServiceEligibility::Recap::NoItems.new(requestable:, user:), - ServiceEligibility::Recap::InLibrary.new(requestable:, user:), - ServiceEligibility::Recap::Digitize.new(requestable:, user:), - ServiceEligibility::Recap::Pickup.new(requestable:, user:), - ServiceEligibility::Aeon.new(requestable:) + ServiceEligibility::InProcess.new(requestable:, patron:), + ServiceEligibility::MarquandInLibrary.new(requestable:, patron:), + ServiceEligibility::MarquandEdd.new(requestable:, patron:), + ServiceEligibility::MarquandPageChargedItem.new(requestable:, patron:), + ServiceEligibility::Recap::NoItems.new(requestable:, patron:), + ServiceEligibility::Recap::InLibrary.new(requestable:, patron:), + ServiceEligibility::Recap::Digitize.new(requestable:, patron:), + ServiceEligibility::Recap::Pickup.new(requestable:, patron:), + ServiceEligibility::Aeon.new(requestable:, patron:) ] end end diff --git a/app/models/requests/service_eligibility/abstract_on_shelf.rb b/app/models/requests/service_eligibility/abstract_on_shelf.rb index f7b0931c0..68bef8515 100644 --- a/app/models/requests/service_eligibility/abstract_on_shelf.rb +++ b/app/models/requests/service_eligibility/abstract_on_shelf.rb @@ -13,7 +13,7 @@ def to_s end def eligible? - requestable_eligible? && user_eligible? + requestable_eligible? && patron_group_eligible? end protected @@ -22,10 +22,6 @@ def requestable_eligible? raise "Please implement requestable_eligible? in the subclass" end - def user_eligible? - provider_eligible? && patron_group_eligible? - end - def on_shelf_eligible? !requestable.aeon? && !requestable.charged? && !requestable.in_process? && @@ -35,16 +31,12 @@ def on_shelf_eligible? !requestable.held_at_marquand_library? end - def provider_eligible? - user.cas_provider? || user.alma_provider? - end - def patron_group_eligible? - allowed_patron_groups.include?(patron.patron_group) + allowed_patron_groups.include?(patron.patron_group) && !patron.guest? end def allowed_patron_groups - @allowed_patron_groups ||= %w[P REG GRAD SENR UGRD] + @allowed_patron_groups ||= %w[P REG GRAD SENR UGRD SUM] end attr_reader :requestable, :user, :patron diff --git a/app/models/requests/service_eligibility/aeon.rb b/app/models/requests/service_eligibility/aeon.rb index 6e8a9fff7..474329e3f 100644 --- a/app/models/requests/service_eligibility/aeon.rb +++ b/app/models/requests/service_eligibility/aeon.rb @@ -4,8 +4,9 @@ module ServiceEligibility # This class is responsible for determining if a specific # resource can be requested via Aeon class Aeon - def initialize(requestable:) + def initialize(requestable:, patron:) @requestable = requestable + @patron = patron end def to_s @@ -16,9 +17,17 @@ def eligible? requestable.aeon? || !(requestable.alma_managed? || requestable.partner_holding?) end + def patron_group_eligible? + allowed_patron_groups.include?(patron.patron_group) + end + + def allowed_patron_groups + @allowed_patron_groups ||= %w[P REG GRAD SENR UGRD SUM] + end + private - attr_reader :requestable + attr_reader :requestable, :patron end end end diff --git a/app/models/requests/service_eligibility/ill.rb b/app/models/requests/service_eligibility/ill.rb index d2e9a0ba9..9df6d0b92 100644 --- a/app/models/requests/service_eligibility/ill.rb +++ b/app/models/requests/service_eligibility/ill.rb @@ -6,7 +6,6 @@ module ServiceEligibility class ILL def initialize(requestable:, patron:, any_loanable:) @requestable = requestable - @user = patron.user @any_loanable = any_loanable @patron = patron end @@ -16,7 +15,7 @@ def to_s end def eligible? - requestable_eligible? && user_eligible? && patron_group_eligible? + requestable_eligible? && patron_group_eligible? && !patron.guest? end private @@ -26,19 +25,11 @@ def requestable_eligible? (!any_loanable || requestable.enumerated? || requestable.preservation_conservation?) end - def user_eligible? - user.cas_provider? || user.alma_provider? - end - def patron_group_eligible? - allowed_patron_groups.include?(patron.patron_group) - end - - def allowed_patron_groups - @allowed_patron_groups ||= %w[P REG GRAD SENR UGRD] + patron.core_patron_group? end - attr_reader :requestable, :user, :any_loanable, :patron + attr_reader :requestable, :any_loanable, :patron end end end diff --git a/app/models/requests/service_eligibility/in_process.rb b/app/models/requests/service_eligibility/in_process.rb index 30e1106b0..4e2f5f387 100644 --- a/app/models/requests/service_eligibility/in_process.rb +++ b/app/models/requests/service_eligibility/in_process.rb @@ -2,9 +2,9 @@ module Requests module ServiceEligibility class InProcess - def initialize(requestable:, user:) + def initialize(requestable:, patron:) @requestable = requestable - @user = user + @patron = patron end def to_s @@ -18,13 +18,13 @@ def eligible? private def user_eligible? - user.cas_provider? || user.alma_provider? + patron.core_patron_group? && !patron.guest? end def requestable_eligible? !requestable.aeon? && !requestable.charged? && requestable.in_process? end - attr_reader :requestable, :user + attr_reader :requestable, :patron end end end diff --git a/app/models/requests/service_eligibility/marquand_edd.rb b/app/models/requests/service_eligibility/marquand_edd.rb index eac20f48e..999ef5ae7 100644 --- a/app/models/requests/service_eligibility/marquand_edd.rb +++ b/app/models/requests/service_eligibility/marquand_edd.rb @@ -2,9 +2,9 @@ module Requests module ServiceEligibility class MarquandEdd - def initialize(requestable:, user:) + def initialize(requestable:, patron:) @requestable = requestable - @user = user + @patron = patron end def to_s @@ -12,13 +12,13 @@ def to_s end def eligible? - requestable_eligible? && user_eligible? + requestable_eligible? && patron_group_eligible? && !patron.guest? end private - def user_eligible? - user.cas_provider? || user.alma_provider? + def patron_group_eligible? + patron.core_patron_group? end def requestable_eligible? @@ -31,7 +31,7 @@ def requestable_eligible? (requestable.alma_managed? || requestable.partner_holding?) && !requestable.aeon? end - attr_reader :requestable, :user + attr_reader :requestable, :patron end end end diff --git a/app/models/requests/service_eligibility/marquand_in_library.rb b/app/models/requests/service_eligibility/marquand_in_library.rb index f456acd8a..c9becb224 100644 --- a/app/models/requests/service_eligibility/marquand_in_library.rb +++ b/app/models/requests/service_eligibility/marquand_in_library.rb @@ -2,9 +2,9 @@ module Requests module ServiceEligibility class MarquandInLibrary - def initialize(requestable:, user:) + def initialize(requestable:, patron:) @requestable = requestable - @user = user + @patron = patron end def to_s @@ -12,13 +12,13 @@ def to_s end def eligible? - requestable_eligible? && user_eligible? + requestable_eligible? && patron_group_eligible? && !patron.guest? end private - def user_eligible? - user.cas_provider? || user.alma_provider? + def patron_group_eligible? + patron.core_patron_group? end def requestable_eligible? @@ -31,7 +31,7 @@ def requestable_eligible? (requestable.alma_managed? || requestable.partner_holding?) && !requestable.aeon? end - attr_reader :requestable, :user + attr_reader :requestable, :patron end end end diff --git a/app/models/requests/service_eligibility/marquand_page_charged_item.rb b/app/models/requests/service_eligibility/marquand_page_charged_item.rb index c2ffa4d4e..e09e6c501 100644 --- a/app/models/requests/service_eligibility/marquand_page_charged_item.rb +++ b/app/models/requests/service_eligibility/marquand_page_charged_item.rb @@ -6,13 +6,13 @@ module ServiceEligibility # carrel. The materials in the other user's carrel are charged (checked out), # so this service is only possible for charged materials. class MarquandPageChargedItem - def initialize(requestable:, user:) + def initialize(requestable:, patron:) @requestable = requestable - @user = user + @patron = patron end def eligible? - correct_status? && correct_location? && user_eligible? + correct_status? && correct_location? && patron_group_eligible? && !patron.guest? end def to_s @@ -29,11 +29,11 @@ def correct_location? requestable.held_at_marquand_library? end - def user_eligible? - user.cas_provider? || user.alma_provider? + def patron_group_eligible? + patron.core_patron_group? end - attr_reader :requestable, :user + attr_reader :requestable, :patron end end end diff --git a/app/models/requests/service_eligibility/on_order.rb b/app/models/requests/service_eligibility/on_order.rb index ba4574774..d9b6da956 100644 --- a/app/models/requests/service_eligibility/on_order.rb +++ b/app/models/requests/service_eligibility/on_order.rb @@ -3,9 +3,9 @@ module Requests module ServiceEligibility # on_order - material has a status in Alma that indicates it is ordered but has not yet arrived on campus class OnOrder - def initialize(requestable:, user:) + def initialize(requestable:, patron:) @requestable = requestable - @user = user + @patron = patron end def to_s @@ -13,7 +13,7 @@ def to_s end def eligible? - requestable_eligible? && user_eligible? + requestable_eligible? && patron_group_eligible? && !patron.guest? end private @@ -26,11 +26,11 @@ def requestable_eligible? requestable.on_order? end - def user_eligible? - user.cas_provider? || user.alma_provider? + def patron_group_eligible? + patron.core_patron_group? end - attr_reader :requestable, :user + attr_reader :requestable, :patron end end end diff --git a/app/models/requests/service_eligibility/recap/abstract_recap.rb b/app/models/requests/service_eligibility/recap/abstract_recap.rb index 400206652..3415869f9 100644 --- a/app/models/requests/service_eligibility/recap/abstract_recap.rb +++ b/app/models/requests/service_eligibility/recap/abstract_recap.rb @@ -4,9 +4,9 @@ module ServiceEligibility module Recap # Abstract class for other recap classes to inherit from class AbstractRecap - def initialize(requestable:, user:) + def initialize(requestable:, patron:) @requestable = requestable - @user = user + @patron = patron end def to_s @@ -20,10 +20,10 @@ def requestable_eligible? end def user_eligible? - user.cas_provider? || user.alma_provider? + (patron.core_patron_group? || patron.affiliate_patron_group?) && !patron.guest? end - attr_reader :requestable, :user + attr_reader :requestable, :patron end end end diff --git a/app/models/requests/service_eligibility/recap/pickup.rb b/app/models/requests/service_eligibility/recap/pickup.rb index fada129fd..bca6f9d45 100644 --- a/app/models/requests/service_eligibility/recap/pickup.rb +++ b/app/models/requests/service_eligibility/recap/pickup.rb @@ -19,7 +19,7 @@ def requestable_eligible? requestable.item_data? && !requestable.recap_pf? && !requestable.holding_library_in_library_only? && - !(!requestable.circulates? && !requestable.recap_edd?) && + requestable.circulates? && !(requestable.scsb_in_library_use? && requestable.item[:collection_code] != "MR") && !requestable.charged? end diff --git a/spec/models/requests/service_eligibility/aeon_spec.rb b/spec/models/requests/service_eligibility/aeon_spec.rb index 4c68a2bab..607a99bf9 100644 --- a/spec/models/requests/service_eligibility/aeon_spec.rb +++ b/spec/models/requests/service_eligibility/aeon_spec.rb @@ -2,6 +2,11 @@ require 'rails_helper' RSpec.describe Requests::ServiceEligibility::Aeon, requests: true do + let(:user) { FactoryBot.create(:user) } + let(:valid_patron) { { "netid" => "foo", "patron_group" => "P" }.with_indifferent_access } + let(:patron) do + Requests::Patron.new(user:, patron_hash: valid_patron) + end describe '#eligible?' do it 'returns true if Alma-managed and aeon true' do requestable = instance_double(Requests::Requestable) @@ -9,7 +14,7 @@ alma_managed?: true, aeon?: true ) - eligibility = described_class.new(requestable:) + eligibility = described_class.new(requestable:, patron:) expect(eligibility.eligible?).to be(true) end diff --git a/spec/models/requests/service_eligibility/in_process_spec.rb b/spec/models/requests/service_eligibility/in_process_spec.rb index 42834d1c6..afe5c17bf 100644 --- a/spec/models/requests/service_eligibility/in_process_spec.rb +++ b/spec/models/requests/service_eligibility/in_process_spec.rb @@ -2,6 +2,11 @@ require 'rails_helper' RSpec.describe Requests::ServiceEligibility::InProcess, requests: true do + let(:user) { FactoryBot.create(:user) } + let(:valid_patron) { { "netid" => "foo", "patron_group" => "P" }.with_indifferent_access } + let(:patron) do + Requests::Patron.new(user:, patron_hash: valid_patron) + end describe '#eligible?' do it 'returns true if all criteria are met' do requestable = instance_double(Requests::Requestable) @@ -10,7 +15,7 @@ charged?: false, in_process?: true ) - eligibility = described_class.new(requestable:, user: FactoryBot.create(:user)) + eligibility = described_class.new(requestable:, patron:) expect(eligibility.eligible?).to be(true) end @@ -21,7 +26,7 @@ charged?: false, in_process?: false ) - eligibility = described_class.new(requestable:, user: FactoryBot.create(:user)) + eligibility = described_class.new(requestable:, patron:) expect(eligibility.eligible?).to be(false) end @@ -41,7 +46,7 @@ in_process?: true ) - eligibility = described_class.new(requestable:, user:) + eligibility = described_class.new(requestable:, patron:) expect(eligibility.eligible?).to be(true) end diff --git a/spec/models/requests/service_eligibility/marquand_edd_spec.rb b/spec/models/requests/service_eligibility/marquand_edd_spec.rb index a87f2fed0..9274a392c 100644 --- a/spec/models/requests/service_eligibility/marquand_edd_spec.rb +++ b/spec/models/requests/service_eligibility/marquand_edd_spec.rb @@ -2,6 +2,11 @@ require 'rails_helper' RSpec.describe Requests::ServiceEligibility::MarquandEdd, requests: true do + let(:user) { FactoryBot.create(:user) } + let(:valid_patron) { { "netid" => "foo", "patron_group" => "P" }.with_indifferent_access } + let(:patron) do + Requests::Patron.new(user:, patron_hash: valid_patron) + end describe '#eligible?' do it 'returns true if all criteria are met' do requestable = instance_double(Requests::Requestable) @@ -16,7 +21,7 @@ recap?: false, recap_pf?: false ) - eligibility = described_class.new(requestable:, user: FactoryBot.create(:user)) + eligibility = described_class.new(requestable:, patron:) expect(eligibility.eligible?).to be(true) end diff --git a/spec/models/requests/service_eligibility/marquand_in_library_spec.rb b/spec/models/requests/service_eligibility/marquand_in_library_spec.rb index 0ff28e10b..e3d883b4d 100644 --- a/spec/models/requests/service_eligibility/marquand_in_library_spec.rb +++ b/spec/models/requests/service_eligibility/marquand_in_library_spec.rb @@ -2,6 +2,11 @@ require 'rails_helper' RSpec.describe Requests::ServiceEligibility::MarquandInLibrary, requests: true do + let(:user) { FactoryBot.create(:user) } + let(:valid_patron) { { "netid" => "foo", "patron_group" => "P" }.with_indifferent_access } + let(:patron) do + Requests::Patron.new(user:, patron_hash: valid_patron) + end describe '#eligible?' do it 'returns true if all criteria are met' do requestable = instance_double(Requests::Requestable) @@ -16,7 +21,7 @@ recap?: false, recap_pf?: false ) - eligibility = described_class.new(requestable:, user: FactoryBot.create(:user)) + eligibility = described_class.new(requestable:, patron:) expect(eligibility.eligible?).to be(true) end diff --git a/spec/models/requests/service_eligibility/marquand_page_charged_item_spec.rb b/spec/models/requests/service_eligibility/marquand_page_charged_item_spec.rb index f6b80d871..9465dc863 100644 --- a/spec/models/requests/service_eligibility/marquand_page_charged_item_spec.rb +++ b/spec/models/requests/service_eligibility/marquand_page_charged_item_spec.rb @@ -2,6 +2,11 @@ require 'rails_helper' RSpec.describe Requests::ServiceEligibility::MarquandPageChargedItem, :requests do + let(:user) { FactoryBot.create(:user) } + let(:valid_patron) { { "netid" => "foo", "patron_group" => "P" }.with_indifferent_access } + let(:patron) do + Requests::Patron.new(user:, patron_hash: valid_patron) + end describe '#eligible?' do it 'returns true if all criteria are met' do requestable = instance_double(Requests::Requestable) @@ -14,7 +19,7 @@ on_order?: false, recap?: false ) - eligibility = described_class.new(requestable:, user: FactoryBot.create(:user)) + eligibility = described_class.new(requestable:, patron:) expect(eligibility.eligible?).to be(true) end @@ -30,7 +35,7 @@ on_order?: false, recap?: false ) - eligibility = described_class.new(requestable:, user: FactoryBot.create(:user)) + eligibility = described_class.new(requestable:, patron:) expect(eligibility.eligible?).to be(false) end @@ -46,7 +51,7 @@ on_order?: true, recap?: false ) - eligibility = described_class.new(requestable:, user: FactoryBot.create(:user)) + eligibility = described_class.new(requestable:, patron:) expect(eligibility.eligible?).to be(false) end @@ -62,7 +67,7 @@ on_order?: false, recap?: false ) - eligibility = described_class.new(requestable:, user: FactoryBot.create(:user)) + eligibility = described_class.new(requestable:, patron:) expect(eligibility.eligible?).to be(false) end @@ -78,7 +83,7 @@ on_order?: false, recap?: false ) - eligibility = described_class.new(requestable:, user: FactoryBot.create(:user)) + eligibility = described_class.new(requestable:, patron:) expect(eligibility.eligible?).to be(false) end diff --git a/spec/models/requests/service_eligibility/on_order_spec.rb b/spec/models/requests/service_eligibility/on_order_spec.rb index ab2937191..b88d30293 100644 --- a/spec/models/requests/service_eligibility/on_order_spec.rb +++ b/spec/models/requests/service_eligibility/on_order_spec.rb @@ -3,6 +3,10 @@ RSpec.describe Requests::ServiceEligibility::OnOrder, requests: true do let(:user) { FactoryBot.create(:user) } + let(:valid_patron) { { "netid" => "foo", "patron_group" => "P" }.with_indifferent_access } + let(:patron) do + Requests::Patron.new(user:, patron_hash: valid_patron) + end describe '#eligible?' do it 'returns true if all criteria are met' do requestable = instance_double(Requests::Requestable) @@ -14,7 +18,7 @@ aeon?: false ) - eligibility = described_class.new(requestable:, user:) + eligibility = described_class.new(requestable:, patron:) expect(eligibility.eligible?).to be(true) end @@ -28,7 +32,7 @@ in_process?: false ) - eligibility = described_class.new(requestable:, user:) + eligibility = described_class.new(requestable:, patron:) expect(eligibility.eligible?).to be(false) end @@ -50,7 +54,7 @@ aeon?: false ) - eligibility = described_class.new(requestable:, user:) + eligibility = described_class.new(requestable:, patron:) expect(eligibility.eligible?).to be(true) end diff --git a/spec/models/requests/service_eligibility/recap/digitize_spec.rb b/spec/models/requests/service_eligibility/recap/digitize_spec.rb index 6f7ce66d3..e14ea4e28 100644 --- a/spec/models/requests/service_eligibility/recap/digitize_spec.rb +++ b/spec/models/requests/service_eligibility/recap/digitize_spec.rb @@ -3,6 +3,11 @@ RSpec.describe Requests::ServiceEligibility::Recap::Digitize, requests: true do describe '#eligible?' do + let(:user) { FactoryBot.create(:user) } + let(:valid_patron) { { "netid" => "foo", "patron_group" => "P" }.with_indifferent_access } + let(:patron) do + Requests::Patron.new(user:, patron_hash: valid_patron) + end it 'returns true if all criteria are met' do requestable = instance_double(Requests::Requestable) allow(requestable).to receive_messages( @@ -13,7 +18,7 @@ scsb_in_library_use?: false, charged?: false ) - eligibility = described_class.new(requestable:, user: FactoryBot.create(:user)) + eligibility = described_class.new(requestable:, patron:) expect(eligibility.eligible?).to be(true) end @@ -26,7 +31,7 @@ recap_edd?: false, charged?: false ) - eligibility = described_class.new(requestable:, user: FactoryBot.create(:user)) + eligibility = described_class.new(requestable:, patron:) expect(eligibility.eligible?).to be(false) end @@ -41,7 +46,7 @@ item_data?: true, scsb_in_library_use?: false ) - eligibility = described_class.new(requestable:, user: FactoryBot.create(:user)) + eligibility = described_class.new(requestable:, patron:) expect(eligibility.eligible?).to be(false) end diff --git a/spec/models/requests/service_eligibility/recap/in_library_spec.rb b/spec/models/requests/service_eligibility/recap/in_library_spec.rb index 40ca306ef..232086386 100644 --- a/spec/models/requests/service_eligibility/recap/in_library_spec.rb +++ b/spec/models/requests/service_eligibility/recap/in_library_spec.rb @@ -3,6 +3,10 @@ RSpec.describe Requests::ServiceEligibility::Recap::InLibrary, requests: true do let(:user) { FactoryBot.create(:user) } + let(:valid_patron) { { "netid" => "foo", "patron_group" => "P" }.with_indifferent_access } + let(:patron) do + Requests::Patron.new(user:, patron_hash: valid_patron) + end describe '#eligible?' do it 'returns true if all criteria are met' do requestable = instance_double(Requests::Requestable) @@ -14,7 +18,7 @@ recap_edd?: true, recap_pf?: true ) - eligibility = described_class.new(requestable:, user:) + eligibility = described_class.new(requestable:, patron:) expect(eligibility.eligible?).to be(true) end @@ -29,7 +33,7 @@ recap_edd?: true, recap_pf?: false ) - eligibility = described_class.new(requestable:, user:) + eligibility = described_class.new(requestable:, patron:) expect(eligibility.eligible?).to be(false) end diff --git a/spec/models/requests/service_eligibility/recap/no_items_spec.rb b/spec/models/requests/service_eligibility/recap/no_items_spec.rb index 5c8458ec8..bfe834f00 100644 --- a/spec/models/requests/service_eligibility/recap/no_items_spec.rb +++ b/spec/models/requests/service_eligibility/recap/no_items_spec.rb @@ -3,6 +3,10 @@ RSpec.describe Requests::ServiceEligibility::Recap::NoItems, requests: true do let(:user) { FactoryBot.create(:user) } + let(:valid_patron) { { "netid" => "foo", "patron_group" => "P" }.with_indifferent_access } + let(:patron) do + Requests::Patron.new(user:, patron_hash: valid_patron) + end describe '#eligible?' do it 'returns true if all criteria are met' do requestable = instance_double(Requests::Requestable) @@ -11,7 +15,7 @@ recap?: true, recap_pf?: false ) - eligibility = described_class.new(requestable:, user:) + eligibility = described_class.new(requestable:, patron:) expect(eligibility.eligible?).to be(true) end @@ -23,7 +27,7 @@ recap?: true, recap_pf?: false ) - eligibility = described_class.new(requestable:, user:) + eligibility = described_class.new(requestable:, patron:) expect(eligibility.eligible?).to be(false) end diff --git a/spec/models/requests/service_eligibility/recap/pickup_spec.rb b/spec/models/requests/service_eligibility/recap/pickup_spec.rb index ca6061d81..7b31987bf 100644 --- a/spec/models/requests/service_eligibility/recap/pickup_spec.rb +++ b/spec/models/requests/service_eligibility/recap/pickup_spec.rb @@ -3,6 +3,10 @@ RSpec.describe Requests::ServiceEligibility::Recap::Pickup, requests: true do let(:user) { FactoryBot.create(:user) } + let(:valid_patron) { { "netid" => "foo", "patron_group" => "P" }.with_indifferent_access } + let(:patron) do + Requests::Patron.new(user:, patron_hash: valid_patron) + end describe '#eligible?' do it 'returns true if all criteria are met' do requestable = instance_double(Requests::Requestable) @@ -16,7 +20,7 @@ scsb_in_library_use?: false, charged?: false ) - eligibility = described_class.new(requestable:, user:) + eligibility = described_class.new(requestable:, patron:) expect(eligibility.eligible?).to be(true) end @@ -32,7 +36,7 @@ item_data?: true, charged?: false ) - eligibility = described_class.new(requestable:, user:) + eligibility = described_class.new(requestable:, patron:) expect(eligibility.eligible?).to be(false) end @@ -49,7 +53,7 @@ item_data?: true, scsb_in_library_use?: false ) - eligibility = described_class.new(requestable:, user:) + eligibility = described_class.new(requestable:, patron:) expect(eligibility.eligible?).to be(false) end diff --git a/spec/models/requests/user_group_spec.rb b/spec/models/requests/user_group_spec.rb new file mode 100644 index 000000000..ea377b5a4 --- /dev/null +++ b/spec/models/requests/user_group_spec.rb @@ -0,0 +1,187 @@ +# frozen_string_literal: true +require 'rails_helper' + +RSpec.shared_examples 'shared request type tests' do + let(:stubbed_questions) do + { alma_managed?: true, in_process?: false, + charged?: false, on_order?: false, aeon?: false, + annex?: false, + recap?: false, recap_pf?: false, held_at_marquand_library?: false, + item_data?: false, recap_edd?: false, scsb_in_library_use?: false, item:, + library_code: 'ABC', eligible_for_library_services?: true, + marquand_item?: false } + end + it 'with a recap physical delivery request' do + stubbed_questions[:recap?] = true + stubbed_questions[:item_data?] = true + stubbed_questions[:holding_library_in_library_only?] = false + stubbed_questions[:circulates?] = true + stubbed_questions[:recap_pf?] = false + expect(router.calculate_services).to eq(recap_physical_services) + end + it 'with a recap electronic delivery request' do + stubbed_questions[:recap?] = true + stubbed_questions[:item_data?] = true + stubbed_questions[:recap_edd?] = true + stubbed_questions[:holding_library_in_library_only?] = false + stubbed_questions[:circulates?] = false + stubbed_questions[:recap_pf?] = false + expect(router.calculate_services).to eq(recap_electronic_services) + end + it 'with an annex physical delivery request' do + stubbed_questions[:annex?] = true + stubbed_questions[:circulates?] = true + stubbed_questions[:item_data?] = true + expect(router.calculate_services).to eq(annex_physical_services) + end + it 'with an annex physical delivery request with no item data' do + stubbed_questions[:annex?] = true + stubbed_questions[:circulates?] = true + expect(router.calculate_services).to eq(annex_no_item_services) + end + it 'with an annex electronic delivery request' do + stubbed_questions[:annex?] = true + stubbed_questions[:circulates?] = false + stubbed_questions[:item_data?] = true + expect(router.calculate_services).to eq(annex_electronic_services) + end + it 'with an on order request' do + stubbed_questions[:on_order?] = true + expect(router.calculate_services).to eq(on_order_services) + end + it 'with an in process request' do + stubbed_questions[:in_process?] = true + expect(router.calculate_services).to eq(in_process_services) + end + it 'with a pick-up service (on shelf) request' do + stubbed_questions[:circulates?] = true + expect(router.calculate_services).to eq(on_shelf_services) + end + it 'with a digitization request' do + stubbed_questions[:circulates?] = true + expect(router.calculate_services).to eq(digitization_services) + end + it 'with a resource sharing service request' do + stubbed_questions[:charged?] = true + expect(router.calculate_services).to eq(resource_sharing_services) + end + it 'with a reading room request' do + stubbed_questions[:aeon?] = true + expect(router.calculate_services).to eq(reading_room_services) + end +end + +RSpec.shared_context 'core patron group' do + let(:recap_physical_services) { ['recap'] } + let(:recap_electronic_services) { ['recap_edd'] } + # Should we expect this to include 'on_shelf_edd' since annex items are not considered 'on_shelf'? + let(:annex_physical_services) { ['annex', 'on_shelf_edd'] } + let(:annex_no_item_services) { ['annex_no_items', 'on_shelf_edd'] } + # Should not have 'anex' since it does not circulate + let(:annex_electronic_services) { ['annex', 'on_shelf_edd'] } + let(:on_order_services) { ['on_order'] } + let(:in_process_services) { ['in_process'] } + # Any on_shelf_eligible item will also be on_shelf_edd eligible + let(:on_shelf_services) { ['on_shelf_edd', 'on_shelf'] } + let(:digitization_services) { ['on_shelf_edd', 'on_shelf'] } + let(:resource_sharing_services) { ['ill'] } + let(:reading_room_services) { ['aeon'] } +end + +RSpec.shared_context 'affiliate and guest patron group' do + let(:recap_physical_services) { ['recap'] } + let(:recap_electronic_services) { ['recap_edd'] } + let(:annex_physical_services) { ['annex'] } + let(:annex_no_item_services) { ['annex_no_items'] } + let(:annex_electronic_services) { ['annex'] } + let(:on_order_services) { [] } + let(:in_process_services) { [] } + let(:on_shelf_services) { [] } + let(:digitization_services) { [] } + let(:resource_sharing_services) { [] } + let(:reading_room_services) { ['aeon'] } +end + +RSpec.shared_context 'shared patron setup' do + let(:user) { FactoryBot.create(:user) } + let(:patron) do + Requests::Patron.new(user:, patron_hash: valid_patron) + end + let(:item) { {} } + let(:requestable) { instance_double(Requests::Requestable, stubbed_questions) } + let(:router) { described_class.new(requestable:, patron:) } +end + +RSpec.shared_context 'cas user' do + let(:user) { FactoryBot.create(:user) } +end + +RSpec.shared_context 'alma user' do + let(:user) { FactoryBot.create(:alma_patron) } +end + +RSpec.describe Requests::Router do + context 'with a user in group P' do + let(:valid_patron) { { "netid" => "foo", "patron_group" => "P" }.with_indifferent_access } + include_context 'cas user' + include_context 'shared patron setup' + include_context 'core patron group' + it_behaves_like 'shared request type tests' + end + context 'with a user in group GRAD' do + let(:valid_patron) { { "netid" => "foo", "patron_group" => "GRAD" }.with_indifferent_access } + include_context 'cas user' + include_context 'shared patron setup' + include_context 'core patron group' + it_behaves_like 'shared request type tests' + end + context 'with a user in group REG' do + let(:valid_patron) { { "netid" => "foo", "patron_group" => "REG" }.with_indifferent_access } + include_context 'cas user' + include_context 'shared patron setup' + include_context 'core patron group' + it_behaves_like 'shared request type tests' + end + context 'with a user in group SENR' do + let(:valid_patron) { { "netid" => "foo", "patron_group" => "SENR" }.with_indifferent_access } + include_context 'cas user' + include_context 'shared patron setup' + include_context 'core patron group' + it_behaves_like 'shared request type tests' + end + context 'with a user in group UGRD' do + let(:valid_patron) { { "netid" => "foo", "patron_group" => "UGRD" }.with_indifferent_access } + include_context 'cas user' + include_context 'shared patron setup' + include_context 'core patron group' + it_behaves_like 'shared request type tests' + end + context 'with a user in group SUM' do + let(:valid_patron) { { "netid" => "foo", "patron_group" => "SUM" }.with_indifferent_access } + include_context 'cas user' + include_context 'shared patron setup' + include_context 'core patron group' + it_behaves_like 'shared request type tests' + end + context 'with a user in group Affiliate' do + let(:valid_patron) { { "netid" => "foo", "patron_group" => "Affiliate" }.with_indifferent_access } + include_context 'alma user' + include_context 'shared patron setup' + include_context 'affiliate and guest patron group' + it_behaves_like 'shared request type tests' + end + context 'with a user in group Affiliate-P' do + let(:valid_patron) { { "netid" => "foo", "patron_group" => "Affiliate-P" }.with_indifferent_access } + include_context 'alma user' + include_context 'shared patron setup' + include_context 'affiliate and guest patron group' + it_behaves_like 'shared request type tests' + end + context 'with a user in group GST' do + let(:valid_patron) { { "netid" => "foo", "patron_group" => "GST" }.with_indifferent_access } + include_context 'alma user' + include_context 'shared patron setup' + include_context 'affiliate and guest patron group' + it_behaves_like 'shared request type tests' + end +end