Skip to content

Commit

Permalink
Merge pull request #4340 from pulibrary/router-finish-refactor
Browse files Browse the repository at this point in the history
Finish refactoring router into an array of ServiceEligibility objects
  • Loading branch information
christinach committed Sep 16, 2024
2 parents e325d0b + 1cc1e4b commit e8548e6
Show file tree
Hide file tree
Showing 12 changed files with 115 additions and 49 deletions.
65 changes: 22 additions & 43 deletions app/models/requests/router.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ def initialize(requestable:, user:, any_loanable: false)
end

# Current Service Types Assigned
# :online - material is available online at a URL
# :aeon - material is stored in a location where it can be requested via Aeon
# :annex - material is stored in an Annex location
# :on_shelf - material is stored in a campus library location
Expand All @@ -37,54 +36,34 @@ def routed_request
requestable
end

# top level call, returns a hash of symbols with service objects as values
# returns a hash of symbols with service objects as values
# services[:service_name] = Requests::Service::GenericService
def calculate_services
if (requestable.alma_managed? || requestable.partner_holding?) && !requestable.aeon?
calculate_alma_or_scsb_services
else # Default Service is Aeon
['aeon']
end
eligibility_checks.select(&:eligible?).map(&:to_s)
end

private

def calculate_alma_or_scsb_services
return [] unless auth_user?
if requestable.charged?
calculate_unavailable_services
else
[
ServiceEligibility::OnOrder.new(requestable:, user:),
ServiceEligibility::Annex.new(requestable:, user:),
ServiceEligibility::OnShelfDigitize.new(requestable:, user:),
ServiceEligibility::OnShelfPickup.new(requestable:, user:),
ServiceEligibility::ClancyUnavailable.new(user:, requestable:),
ServiceEligibility::ClancyInLibrary.new(user:, requestable:),
ServiceEligibility::ClancyEdd.new(user:, requestable:),
ServiceEligibility::InProcess.new(requestable:, user:),
ServiceEligibility::MarquandInLibrary.new(user:, requestable:),
ServiceEligibility::MarquandEdd.new(user:, requestable:),
ServiceEligibility::Recap::NoItems.new(requestable:, user:),
ServiceEligibility::Recap::InLibrary.new(requestable:, user:),
ServiceEligibility::Recap::AskMe.new(requestable:, user:),
ServiceEligibility::Recap::Digitize.new(requestable:, user:),
ServiceEligibility::Recap::Pickup.new(requestable:, user:)
].select(&:eligible?).map(&:to_s)
end
end

def calculate_unavailable_services
ill_eligibility = ServiceEligibility::ILL.new(requestable:, user:, any_loanable:)
if ill_eligibility.eligible?
[ill_eligibility.to_s]
else
[]
end
end

def auth_user?
cas_provider? || alma_provider?
def eligibility_checks
[
ServiceEligibility::ILL.new(requestable:, user:, any_loanable:),
ServiceEligibility::OnOrder.new(requestable:, user:),
ServiceEligibility::Annex.new(requestable:, user:),
ServiceEligibility::OnShelfDigitize.new(requestable:, user:),
ServiceEligibility::OnShelfPickup.new(requestable:, user:),
ServiceEligibility::ClancyUnavailable.new(user:, requestable:),
ServiceEligibility::ClancyInLibrary.new(user:, requestable:),
ServiceEligibility::ClancyEdd.new(user:, requestable:),
ServiceEligibility::InProcess.new(requestable:, user:),
ServiceEligibility::MarquandInLibrary.new(user:, requestable:),
ServiceEligibility::MarquandEdd.new(user:, requestable:),
ServiceEligibility::Recap::NoItems.new(requestable:, user:),
ServiceEligibility::Recap::InLibrary.new(requestable:, user:),
ServiceEligibility::Recap::AskMe.new(requestable:, user:),
ServiceEligibility::Recap::Digitize.new(requestable:, user:),
ServiceEligibility::Recap::Pickup.new(requestable:, user:),
ServiceEligibility::Aeon.new(requestable:)
]
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ def on_shelf_eligible?
!requestable.aeon? && !requestable.charged? &&
!requestable.in_process? &&
!requestable.on_order? &&
requestable.alma_managed? &&
!(requestable.recap? || requestable.recap_pf?) &&
!requestable.held_at_marquand_library?
end
Expand Down
24 changes: 24 additions & 0 deletions app/models/requests/service_eligibility/aeon.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# frozen_string_literal: true
module Requests
module ServiceEligibility
# This class is responsible for determining if a specific
# resource can be requested via Aeon
class Aeon
def initialize(requestable:)
@requestable = requestable
end

def to_s
'aeon'
end

def eligible?
requestable.aeon? || !(requestable.alma_managed? || requestable.partner_holding?)
end

private

attr_reader :requestable
end
end
end
3 changes: 2 additions & 1 deletion app/models/requests/service_eligibility/recap/digitize.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ def requestable_eligible?
!requestable.recap_pf? &&
requestable.recap_edd? &&
requestable.item_data? &&
!requestable.scsb_in_library_use?
!requestable.scsb_in_library_use? &&
!requestable.charged?
end
end
end
Expand Down
3 changes: 2 additions & 1 deletion app/models/requests/service_eligibility/recap/pickup.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ def requestable_eligible?
!requestable.recap_pf? &&
!requestable.holding_library_in_library_only? &&
!(!requestable.circulates? && !requestable.recap_edd?) &&
!(requestable.scsb_in_library_use? && requestable.item[:collection_code] != "MR")
!(requestable.scsb_in_library_use? && requestable.item[:collection_code] != "MR") &&
!requestable.charged?
end

def patron_eligible?
Expand Down
1 change: 1 addition & 0 deletions spec/models/requests/router_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,7 @@
before do
stubbed_questions[:alma_managed?] = false
stubbed_questions[:partner_holding?] = false
stubbed_questions[:circulates?] = true
end
it "returns aeon in the services" do
expect(router.calculate_services).to eq(['aeon'])
Expand Down
17 changes: 17 additions & 0 deletions spec/models/requests/service_eligibility/aeon_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# frozen_string_literal: true
require 'rails_helper'

RSpec.describe Requests::ServiceEligibility::Aeon, requests: true do
describe '#eligible?' do
it 'returns true if Alma-managed and aeon true' do
requestable = instance_double(Requests::Requestable)
allow(requestable).to receive_messages(
alma_managed?: true,
aeon?: true
)
eligibility = described_class.new(requestable:)

expect(eligibility.eligible?).to be(true)
end
end
end
2 changes: 2 additions & 0 deletions spec/models/requests/service_eligibility/annex_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
in_process?: false,
on_order?: false,
annex?: true,
alma_managed?: true,
recap?: false,
recap_pf?: false,
held_at_marquand_library?: false
Expand All @@ -27,6 +28,7 @@
in_process?: false,
on_order?: false,
annex?: false,
alma_managed?: true,
recap?: false,
recap_pf?: false,
held_at_marquand_library?: false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
charged?: false,
in_process?: false,
on_order?: false,
alma_managed?: true,
annex?: false,
recap?: false,
recap_pf?: false,
Expand All @@ -25,6 +26,7 @@
aeon?: false,
charged?: false,
in_process?: false,
alma_managed?: true,
on_order?: false,
annex?: true,
recap?: false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
requestable = instance_double(Requests::Requestable)
allow(requestable).to receive_messages(
aeon?: false,
alma_managed?: true,
charged?: false,
in_process?: false,
circulates?: true,
Expand All @@ -25,6 +26,7 @@
allow(requestable).to receive_messages(
aeon?: false,
charged?: false,
alma_managed?: true,
in_process?: false,
circulates?: true,
on_order?: false,
Expand Down
21 changes: 19 additions & 2 deletions spec/models/requests/service_eligibility/recap/digitize_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
recap_pf?: false,
recap_edd?: true,
item_data?: true,
scsb_in_library_use?: false
scsb_in_library_use?: false,
charged?: false
)
eligibility = described_class.new(requestable:, user: FactoryBot.create(:user))

Expand All @@ -22,7 +23,23 @@
allow(requestable).to receive_messages(
recap?: true,
recap_pf?: false,
recap_edd?: false
recap_edd?: false,
charged?: false
)
eligibility = described_class.new(requestable:, user: FactoryBot.create(:user))

expect(eligibility.eligible?).to be(false)
end

it 'returns false if the requestable is charged' do
requestable = instance_double(Requests::Requestable)
allow(requestable).to receive_messages(
charged?: true,
recap?: true,
recap_pf?: false,
recap_edd?: true,
item_data?: true,
scsb_in_library_use?: false
)
eligibility = described_class.new(requestable:, user: FactoryBot.create(:user))

Expand Down
23 changes: 21 additions & 2 deletions spec/models/requests/service_eligibility/recap/pickup_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@
circulates?: true,
eligible_for_library_services?: true,
item_data?: true,
scsb_in_library_use?: false
scsb_in_library_use?: false,
charged?: false
)
eligibility = described_class.new(requestable:, user:)

Expand All @@ -28,7 +29,25 @@
holding_library_in_library_only?: true,
circulates?: false,
eligible_for_library_services?: false,
item_data?: true
item_data?: true,
charged?: false
)
eligibility = described_class.new(requestable:, user:)

expect(eligibility.eligible?).to be(false)
end

it 'returns false if the item is charged' do
requestable = instance_double(Requests::Requestable)
allow(requestable).to receive_messages(
charged?: true,
recap?: true,
recap_pf?: false,
holding_library_in_library_only?: false,
circulates?: true,
eligible_for_library_services?: true,
item_data?: true,
scsb_in_library_use?: false
)
eligibility = described_class.new(requestable:, user:)

Expand Down

0 comments on commit e8548e6

Please sign in to comment.