diff --git a/Gemfile.lock b/Gemfile.lock index 2b1cf651c..309657330 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -505,7 +505,7 @@ GEM sprockets-rails tilt scrub_rb (1.0.1) - selenium-webdriver (4.10.0) + selenium-webdriver (4.11.0) rexml (~> 3.2, >= 3.2.5) rubyzip (>= 1.2.2, < 3.0) websocket (~> 1.0) diff --git a/app/controllers/requests/request_controller.rb b/app/controllers/requests/request_controller.rb index 4d6eec7b7..ae769c6e6 100644 --- a/app/controllers/requests/request_controller.rb +++ b/app/controllers/requests/request_controller.rb @@ -41,7 +41,7 @@ def redirect_single_aeon_thesis_numistatics ### redirect to Aeon for thesis or coin items or single Aeon requestable ### or over 500 Aeon requestable if @request.thesis? || @request.numismatics? - redirect_to "#{Requests::Config[:aeon_base]}?#{@request.requestable.first.aeon_mapped_params.to_query}" + redirect_to "#{aeon_base}?#{@request.requestable.first.aeon_mapped_params.to_query}" elsif @request.single_aeon_requestable? redirect_to @request.first_filtered_requestable.aeon_request_url end diff --git a/app/helpers/requests/application_helper.rb b/app/helpers/requests/application_helper.rb index 4727255dc..6cbd80f20 100644 --- a/app/helpers/requests/application_helper.rb +++ b/app/helpers/requests/application_helper.rb @@ -382,6 +382,10 @@ def single_pickup(is_charged, name, id, location) label = label_tag id, "Pick-up location: #{location[:label]}", class: 'single-pick-up', style: style.to_s hidden + label end + + def aeon_base + Flipflop.deprecated_aeon_base? ? Requests::Config[:aeon_base_deprecated] : Requests::Config[:aeon_base] + end end end # rubocop:enable Metrics/ModuleLength diff --git a/app/models/requests/aeon_url.rb b/app/models/requests/aeon_url.rb index 0e15c8eb0..c4c382f22 100644 --- a/app/models/requests/aeon_url.rb +++ b/app/models/requests/aeon_url.rb @@ -12,7 +12,9 @@ def initialize(document:, holding: nil, item: nil) end def to_s - @compiled_string ||= "#{Requests::Config[:aeon_base]}/OpenURL?#{query_string}" + aeon_url = Flipflop.deprecated_aeon_base? ? Requests::Config[:aeon_base_deprecated] : Requests::Config[:aeon_base] + aeon_connector = Flipflop.deprecated_aeon_base? ? "/OpenURL?" : "?Action=10&Form=30&" + @compiled_string ||= "#{aeon_url}#{aeon_connector}#{query_string}" end private diff --git a/app/models/requests/requestable_decorator.rb b/app/models/requests/requestable_decorator.rb index eceea87ab..b3273fecf 100644 --- a/app/models/requests/requestable_decorator.rb +++ b/app/models/requests/requestable_decorator.rb @@ -145,7 +145,8 @@ def aeon_url(_request_ctx) if requestable.alma_managed? requestable.aeon_request_url else - "#{Requests::Config[:aeon_base]}?#{requestable.aeon_mapped_params.to_query}" + aeon_url = Flipflop.deprecated_aeon_base? ? Requests::Config[:aeon_base_deprecated] : Requests::Config[:aeon_base] + "#{aeon_url}?#{requestable.aeon_mapped_params.to_query}" end end diff --git a/config/alma.yml b/config/alma.yml index fc4463ccb..8e0a76f5e 100644 --- a/config/alma.yml +++ b/config/alma.yml @@ -8,7 +8,7 @@ test: <<: *default read_write_apikey: 'TESTME' -alma_qa: +qa: <<: *default staging: diff --git a/config/blacklight.yml b/config/blacklight.yml index 5186269b6..078e90bd6 100644 --- a/config/blacklight.yml +++ b/config/blacklight.yml @@ -19,9 +19,6 @@ test: &test staging: adapter: solr url: <%= ENV['SOLR_URL'] || "http://127.0.0.1:8983/solr/blacklight-core" %> -alma_qa: - adapter: solr - url: <%= ENV['SOLR_URL'] || "http://127.0.0.1:8983/solr/blacklight-core" %> qa: adapter: solr url: <%= ENV['SOLR_URL'] || "http://127.0.0.1:8983/solr/blacklight-core" %> diff --git a/config/database.yml b/config/database.yml index a0d37186f..183a6871c 100644 --- a/config/database.yml +++ b/config/database.yml @@ -64,7 +64,5 @@ production: staging: <<: *default -alma_qa: - <<: *default qa: <<: *default diff --git a/config/deploy/qa.rb b/config/deploy/qa.rb index 05fca2c34..ea78eb509 100644 --- a/config/deploy/qa.rb +++ b/config/deploy/qa.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true set :rvm_ruby_string, :local # use the same ruby as used locally for deployment -set :rails_env, 'alma_qa' +set :rails_env, 'qa' set :branch, ENV['BRANCH'] || 'main' server 'catalog-qa1.princeton.edu', user: 'deploy', roles: %i[web app db worker mailcatcher cron_db] diff --git a/config/features.rb b/config/features.rb index 8997ba1cc..72e4469a7 100644 --- a/config/features.rb +++ b/config/features.rb @@ -31,6 +31,10 @@ default: false, description: "When on / true, displays the message set by the announcement rake task." + feature :deprecated_aeon_base, + default: true, + description: "When on / true use the old Aeon base URL instead of the new ones. Uses the Atlas-hosted url in staging and QA." + group :blacklight_8 do feature :json_query_dsl, description: "When on / true, use the JSON query DSL for search fields in the advanced search. When off / false, use query params" diff --git a/config/orangelight.yml b/config/orangelight.yml index 3183f70e3..ca9f033c1 100644 --- a/config/orangelight.yml +++ b/config/orangelight.yml @@ -71,15 +71,6 @@ staging: exchange: 'orangelight_events' firestone_locator_base_url: https://locator-staging.princeton.edu -alma_qa: - <<: *defaults - redis: - host: <%= ENV['OL_REDIS_HOST'] %> - port: <%= ENV['OL_REDIS_PORT'] || '6379' %> - db: 'orangelight_qa' - events: - server: <%= ENV['OL_RABBIT_SERVER'] || 'amqp://localhost:5672' %> - exchange: 'orangelight_events' qa: <<: *defaults redis: diff --git a/config/redis.yml b/config/redis.yml index 4f2cc5e58..a91985f68 100644 --- a/config/redis.yml +++ b/config/redis.yml @@ -18,10 +18,6 @@ staging: <<: *defaults host: <%= ENV['OL_REDIS_HOST'] %> port: <%= ENV['OL_REDIS_PORT'] || '6379' %> -alma_qa: - <<: *defaults - host: <%= ENV['OL_REDIS_HOST'] %> - port: <%= ENV['OL_REDIS_PORT'] || '6379' %> qa: <<: *defaults host: <%= ENV['OL_REDIS_HOST'] %> diff --git a/config/requests.yml b/config/requests.yml index c4bb8a478..c7605373e 100644 --- a/config/requests.yml +++ b/config/requests.yml @@ -4,7 +4,8 @@ defaults: &defaults bibdata_base: <%= ENV['BIBDATA_BASE'] || "https://bibdata.princeton.edu" %> proxy_base: https://login.ezproxy.princeton.edu/login?url= pulsearch_base: https://catalog.princeton.edu - aeon_base: https://lib-aeon.princeton.edu/aeon/aeon.dll + aeon_base_deprecated: https://lib-aeon.princeton.edu/aeon/aeon.dll + aeon_base: https://lib-aeon.princeton.edu/logon gfa_base: http://libweb5.princeton.edu/ReCAPNoUI/Default.aspx ill_base: https://lib-illiad.princeton.edu/illiad/illiad.dll/OpenURL scsb_base: https://scsb.recaplib.org:9093 @@ -28,10 +29,12 @@ production: <<: *defaults staging: <<: *defaults + aeon_base: https://princeton.aeon.atlas-sys.com/logon pulsearch_base: https://catalog-staging.princeton.edu bibdata_base: <%= ENV['BIBDATA_BASE'] || "https://bibdata-staging.princeton.edu" %> qa: <<: *defaults + aeon_base: https://princeton.aeon.atlas-sys.com/logon bibdata_base: <%= ENV['BIBDATA_BASE'] || "https://bibdata-qa.princeton.edu" %> # scsb_base: https://uat-recap.htcinc.com:9093 scsb_base: https://scsb.recaplib.org:9093 diff --git a/config/secrets.yml b/config/secrets.yml index bb3b7d2aa..c9f270e05 100644 --- a/config/secrets.yml +++ b/config/secrets.yml @@ -23,7 +23,5 @@ production: staging: secret_key_base: <%= ENV['OL_SECRET_KEY_BASE'] %> -alma_qa: - secret_key_base: <%= ENV['OL_SECRET_KEY_BASE'] %> qa: secret_key_base: <%= ENV['OL_SECRET_KEY_BASE'] %> diff --git a/solr/conf/schema.xml b/solr/conf/schema.xml index a72e9d4bf..3c9752530 100644 --- a/solr/conf/schema.xml +++ b/solr/conf/schema.xml @@ -190,11 +190,29 @@ - + - + + + + + + + + + + + + + + + + + + @@ -255,139 +273,12 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -577,12 +468,6 @@ - - - @@ -750,7 +635,6 @@ - diff --git a/solr/conf/solrconfig.xml b/solr/conf/solrconfig.xml index ffa3baaf6..fb0123701 100644 --- a/solr/conf/solrconfig.xml +++ b/solr/conf/solrconfig.xml @@ -361,6 +361,246 @@ + + + + + lucene + explicit + 10 + on + text + *:* + + + + + + + + + title_a_index^1500 + author_main_unstem_search^1000 + title_unstem_search^40 + title_display^40 + author_unstem_search^40 + subject_topic_unstem_search^18 + subject_unstem_search^15 + siku_subject_unstem_search^15 + local_subject_unstem_search^15 + homoit_subject_unstem_search^15 + subject_topic_index^12 + genre_unstem_search^10 + subject_t^10 + subject_addl_unstem_search^8 + subject_addl_t^4 + isbn_t^3 + issn_s^3 + lccn_s^3 + uncontrolled_keyword_unstem_search^3 + text + description_t + cjk_all + cjk_text + + + title_245a_lr^16000 + title_245_lr^16000 + title_a_index^12000 + author_main_unstem_search^10000 + title_unstem_search^400 + title_display^400 + author_unstem_search^400 + subject_topic_unstem_search^180 + subject_unstem_search^150 + siku_subject_unstem_search^150 + local_subject_unstem_search^150 + homoit_subject_unstem_search^150 + subject_topic_index^120 + genre_unstem_search^100 + subject_t^100 + subject_addl_unstem_search^80 + subject_addl_t^40 + isbn_t^30 + issn_s^30 + lccn_s^30 + uncontrolled_keyword_unstem_search^10 + text^10 + description_t^10 + cjk_all^10 + cjk_text^10 + + + author_main_unstem_search^20 + author_unstem_search^10 + cjk_author + + + author_main_unstem_search^200 + author_unstem_search^100 + cjk_author^10 + + + title_245a_la^50 + title_245_la^10 + title_la^2 + title_addl_la + + + title_245a_lr^600 + title_245_lr^600 + title_245a_la^500 + title_245_la^100 + title_lr^100 + title_la^20 + title_addl_la^10 + + + more_in_this_series_la + + + more_in_this_series_la + + + pub_created_unstem_search + cjk_publisher + + + pub_created_unstem_search + cjk_publisher + + + notes_index + cjk_notes + cjk_notes_copied + + + notes_index + cjk_notes + cjk_notes_copied + + + series_title_index^5 + series_ae_index + series_statement_index + linked_series_title_index + linked_series_index + original_version_series_index + cjk_series_title + + + series_title_index^50 + series_ae_index^10 + series_statement_index^10 + linked_series_title_index^10 + linked_series_index^10 + original_version_series_index^10 + cjk_series_title^10 + + + title_a_index^500 + title_unstem_search^100 + title_display^50 + other_title_index^5 + series_title_index^5 + uniform_title_s^5 + title_vern_display + content_title_index + contains_title_index + linked_title_index + series_ae_index + series_statement_index + linked_series_title_index + linked_series_index + original_version_series_index + cjk_title + + + title_245a_lr^5500 + title_245_lr^5500 + title_a_index^5000 + title_unstem_search^1000 + title_display^500 + other_title_index^50 + series_title_index^50 + uniform_title_s^50 + title_vern_display^10 + content_title_index^10 + contains_title_index^10 + linked_title_index^10 + series_ae_index^10 + series_statement_index^10 + linked_series_title_index^10 + linked_series_index^10 + original_version_series_index^10 + cjk_title^10 + + + subject_topic_unstem_search^25 + subject_unstem_search^20 + genre_unstem_search^15 + siku_subject_unstem_search + local_subject_unstem_search + homoit_subject_unstem_search + cjk_subject + + + subject_topic_unstem_search^250 + subject_unstem_search^200 + genre_unstem_search^150 + siku_subject_unstem_search^10 + local_subject_unstem_search^10 + homoit_subject_unstem_search^10 + cjk_subject^10 + + + 3 + 0.01 + + + id, + score, + author_display, + marc_relator_display, + format, + pub_created_display, + title_display, + title_vern_display, + isbn_s, + oclc_s, + lccn_s, + holdings_1display, + electronic_access_1display, + electronic_portfolio_s, + cataloged_tdt, + contained_in_s + + + true + 1 + 10 + format + language_facet + pub_date_start_sort + advanced_location_s + index + index + 1000 + 500 + + + diff --git a/spec/features/login_account_spec.rb b/spec/features/login_account_spec.rb index 8a41cface..33115d507 100644 --- a/spec/features/login_account_spec.rb +++ b/spec/features/login_account_spec.rb @@ -152,12 +152,27 @@ stub_catalog_raw(bib_id: 'coin-1167', type: 'numismatics') stub_single_holding_location('rare$num') end - - it 'does not require authentication', js: true do - visit "/catalog/coin-1167" - expect(page).to have_link('Reading Room Request', href: Regexp.new('https://lib-aeon\.princeton\.edu/aeon/aeon\.dll/OpenURL.*Coin.1167')) - click_link('Reading Room Request') - expect(page.current_url).to include(Requests::Config[:aeon_base]) + describe 'using the deprecated aeon base' do + before do + allow(Flipflop).to receive(:deprecated_aeon_base?).and_return(true) + end + it 'does not require authentication', js: true do + visit "/catalog/coin-1167" + expect(page).to have_link('Reading Room Request', href: Regexp.new('https://lib-aeon\.princeton\.edu/aeon/aeon\.dll/OpenURL.*Coin.1167')) + click_link('Reading Room Request') + expect(page.current_url).to include(Requests::Config[:aeon_base_deprecated]) + end + end + describe 'using the new aeon base' do + before do + allow(Flipflop).to receive(:deprecated_aeon_base?).and_return(false) + end + it 'does not require authentication', js: true do + visit "/catalog/coin-1167" + expect(page).to have_link('Reading Room Request', href: Regexp.new('https://lib-aeon\.princeton\.edu/logon.*Coin.1167')) + click_link('Reading Room Request') + expect(page.current_url).to include(Requests::Config[:aeon_base]) + end end end describe 'requesting a thesis' do @@ -165,11 +180,27 @@ stub_catalog_raw(bib_id: 'dsp01tq57ns24j', type: 'theses_and_dissertations') stub_single_holding_location('mudd$stacks') end - it 'does not require authentication', js: true do - visit "/catalog/dsp01tq57ns24j" - expect(page).to have_link('Reading Room Request', href: Regexp.new('https://lib-aeon\.princeton\.edu/aeon/aeon\.dll/OpenURL.*dsp01tq57ns24j')) - click_link('Reading Room Request') - expect(page.current_url).to include(Requests::Config[:aeon_base]) + describe 'using the deprecated aeon base' do + before do + allow(Flipflop).to receive(:deprecated_aeon_base?).and_return(true) + end + it 'does not require authentication', js: true do + visit "/catalog/dsp01tq57ns24j" + expect(page).to have_link('Reading Room Request', href: Regexp.new('https://lib-aeon\.princeton\.edu/aeon/aeon\.dll/OpenURL.*dsp01tq57ns24j')) + click_link('Reading Room Request') + expect(page.current_url).to include(Requests::Config[:aeon_base_deprecated]) + end + end + describe 'using the new aeon base' do + before do + allow(Flipflop).to receive(:deprecated_aeon_base?).and_return(false) + end + it 'does not require authentication', js: true do + visit "/catalog/dsp01tq57ns24j" + expect(page).to have_link('Reading Room Request', href: Regexp.new('https://lib-aeon\.princeton\.edu/logon.*dsp01tq57ns24j')) + click_link('Reading Room Request') + expect(page.current_url).to include(Requests::Config[:aeon_base]) + end end end describe 'requesting a special collections holding with a single item' do @@ -180,11 +211,27 @@ stub_single_holding_location('rare$map') stub_availability_by_holding_id(bib_id:, holding_id: '22745123330006421') end - it 'does not require authentication', js: true do - visit "/catalog/#{bib_id}" - expect(page).to have_link('Reading Room Request', href: Regexp.new('https://lib-aeon\.princeton\.edu/aeon/aeon\.dll/OpenURL.*CallNumber\=RECAP-94760855')) - click_link('Reading Room Request', href: Regexp.new('https://lib-aeon\.princeton\.edu/aeon/aeon\.dll/OpenURL.*CallNumber\=RECAP-94760855')) - expect(page.current_url).to include(Requests::Config[:aeon_base]) + describe 'using the deprecated aeon base' do + before do + allow(Flipflop).to receive(:deprecated_aeon_base?).and_return(true) + end + it 'does not require authentication', js: true do + visit "/catalog/#{bib_id}" + expect(page).to have_link('Reading Room Request', href: Regexp.new('https://lib-aeon\.princeton\.edu/aeon/aeon\.dll/OpenURL.*CallNumber\=RECAP-94760855')) + click_link('Reading Room Request', href: Regexp.new('https://lib-aeon\.princeton\.edu/aeon/aeon\.dll/OpenURL.*CallNumber\=RECAP-94760855')) + expect(page.current_url).to include(Requests::Config[:aeon_base_deprecated]) + end + end + describe 'using the new aeon base' do + before do + allow(Flipflop).to receive(:deprecated_aeon_base?).and_return(false) + end + it 'does not require authentication', js: true do + visit "/catalog/#{bib_id}" + expect(page).to have_link('Reading Room Request', href: Regexp.new('https://lib-aeon\.princeton\.edu/logon.*CallNumber\=RECAP-94760855')) + click_link('Reading Room Request', href: Regexp.new('https://lib-aeon\.princeton\.edu/logon.*CallNumber\=RECAP-94760855')) + expect(page.current_url).to include(Requests::Config[:aeon_base]) + end end end end diff --git a/spec/models/requests/aeon_url_spec.rb b/spec/models/requests/aeon_url_spec.rb index 0aa54466a..95db329e1 100644 --- a/spec/models/requests/aeon_url_spec.rb +++ b/spec/models/requests/aeon_url_spec.rb @@ -22,9 +22,6 @@ stub_holding_locations end subject { described_class.new(document:).to_s } - it 'begins with the aeon prefix' do - expect(subject).to match(/^#{Requests::Config[:aeon_base]}/) - end it 'uses the document id as the ReferenceNumber' do expect(subject).to include('ReferenceNumber=9999999') end @@ -43,6 +40,22 @@ it 'takes the ItemNumber from the barcode' do expect(subject).to include('ItemNumber=24680') end + context 'when using the deprecated aeon base url' do + before do + allow(Flipflop).to receive(:deprecated_aeon_base?).and_return(true) + end + it 'begins with the aeon prefix' do + expect(subject).to match(/^#{Requests::Config[:aeon_base_deprecated]}/) + end + end + context 'when using the new aeon base url' do + before do + allow(Flipflop).to receive(:deprecated_aeon_base?).and_return(false) + end + it 'begins with the aeon prefix' do + expect(subject).to match(/^#{Requests::Config[:aeon_base]}/) + end + end context 'when the location is at a Mudd location' do let(:holdings) do { "12345" => { diff --git a/spec/models/requests/requestable_spec.rb b/spec/models/requests/requestable_spec.rb index bfb0ec470..e9d1a57dc 100644 --- a/spec/models/requests/requestable_spec.rb +++ b/spec/models/requests/requestable_spec.rb @@ -682,10 +682,24 @@ end end - describe '#aeon_request_url' do - it 'beings with Aeon GFA base' do - stub_holding_locations - expect(requestable.aeon_request_url).to match(/^#{Requests::Config[:aeon_base]}/) + context 'with aeon base feature flipper' do + describe '#aeon_request_url with deprecated aeon base' do + before do + allow(Flipflop).to receive(:deprecated_aeon_base?).and_return(true) + end + it 'beings with Aeon GFA base' do + stub_holding_locations + expect(requestable.aeon_request_url).to match(/^#{Requests::Config[:aeon_base_deprecated]}/) + end + end + describe '#aeon_request_url with new aeon base' do + before do + allow(Flipflop).to receive(:deprecated_aeon_base?).and_return(false) + end + it 'beings with Aeon GFA base' do + stub_holding_locations + expect(requestable.aeon_request_url).to match(/^#{Requests::Config[:aeon_base]}/) + end end end