diff --git a/app/programs/assemble_marc_files.rb b/app/programs/assemble_marc_files.rb new file mode 100644 index 0000000..21f5967 --- /dev/null +++ b/app/programs/assemble_marc_files.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +module AssembleMarcFiles + class << self + def run + program = AssembleMarcFiles.new + log = program.execute + NotifierMailer.administrators(log).deliver_now unless log.empty? + rescue StandardError => e + text = <<~MSG + AssembleMarcFiles run error (#{e}) + MSG + NotifierMailer.administrators(text).deliver_now + end + end +end diff --git a/app/programs/assemble_marc_files/assemble_marc_files.rb b/app/programs/assemble_marc_files/assemble_marc_files.rb new file mode 100644 index 0000000..94cb145 --- /dev/null +++ b/app/programs/assemble_marc_files/assemble_marc_files.rb @@ -0,0 +1,72 @@ +# frozen_string_literal: true + +module AssembleMarcFiles + class AssembleMarcFiles + def execute + log = +'' + lib_ptg_box = LibPtgBox::LibPtgBox.new + log += synchronize(lib_ptg_box) + lib_ptg_box.product_families.each do |product_family| + log += assemble_marc_files(product_family) + end + log + end + + def synchronize(lib_ptg_box) + log = +'' + lib_ptg_box.product_families.each do |product_family| + product_family.products.each do |product| + log += product_family.name + " " + product.name + "\n" + # product.works.each do |work| + # + # end + end + end + log + end + + def assemble_marc_files(product_family) + log = +'' + log += product_family.name + "\n" + log + end + + # def run + # umpebc_products_modified.each do |modified_product| + # generate_product_marc_files(modified_product) + # end + # rescue StandardError => e + # text = <<~MSG + # AssembleMarcFiles run error (#{e}) + # MSG + # NotifierMailer.administrators(text).deliver_now + # end + # + # private + # + # def generate_product_marc_files(product) + # product.dois.each do |doi| + # end + # end + # + # def umpebc_products_modified + # umpebc_product_family.products.map { |product| product if product.modified? }.compact + # end + # + # def umpebc_product_family + # @umpebc_product_family ||= begin + # product_families = LibPtgBox::LibPtgBox.new.product_families + # umpebc_family = nil + # product_families.each do |family| + # next unless /umpebc/i.match?(family.name) + # + # umpebc_family = family + # break + # end + # raise 'umpebc product family not found' unless umpebc_family + # + # umpebc_family + # end + # end + end +end diff --git a/config/initializers/scheduler.rb b/config/initializers/scheduler.rb index 2b3458f..c0a5cfe 100644 --- a/config/initializers/scheduler.rb +++ b/config/initializers/scheduler.rb @@ -29,7 +29,8 @@ # Daily - do something every day # (see "man 5 crontab" in your terminal) scheduler.cron '0 0 * * *' do - NotifierMailer.administrators("Daily").deliver_now Rails.logger.info "Daily #{Time.now}" Rails.logger.flush + NotifierMailer.administrators("Daily").deliver_now + AssembleMarcFiles.run end diff --git a/spec/programs/assemble_marc_files/assemble_marc_files_spec.rb b/spec/programs/assemble_marc_files/assemble_marc_files_spec.rb new file mode 100644 index 0000000..6997439 --- /dev/null +++ b/spec/programs/assemble_marc_files/assemble_marc_files_spec.rb @@ -0,0 +1,79 @@ +# frozen_string_literal: true + +require 'rails_helper' + +require 'support/mock_boxr' + +module Boxr + MOCK_ROOT = Rails.root.join('spec', 'fixtures') + + class Client + def initialize + @init = true + end + + def file_from_path(path) + mock_client.file_from_path(File.join(MOCK_ROOT, path)) + end + + def folder_from_path(path) + mock_client.folder_from_path(File.join(MOCK_ROOT, path)) + end + + def folder_items(folder, options) + mock_client.folder_items(folder, options) + end + + def download_file(file) + mock_client.download_file(file) + end + + def upload_file(path, folder) + mock_client.upload_file(path, folder) + end + + private + + def mock_client + @mock_client ||= MockBoxr::Client.new + end + end +end + +RSpec.describe AssembleMarcFiles::AssembleMarcFiles do + subject(:program) { described_class.new } + + before { program } + + describe '#execute' do + subject { program.execute } + + let(:lib_ptg_box) { instance_double(LibPtgBox::LibPtgBox, 'lib_ptg_box', product_families: [product_family]) } + let(:product_family) { instance_double(LibPtgBox::ProductFamily, 'product_family') } + + before do + allow(LibPtgBox::LibPtgBox).to receive(:new).and_return(lib_ptg_box) + allow(program).to receive(:synchronize).with(lib_ptg_box).and_return("synchronize\n") + allow(program).to receive(:assemble_marc_files).with(product_family).and_return("product_family\n") + end + + it { is_expected.to eq("synchronize\nproduct_family\n") } + end + + describe '#synchronize' do + subject { program.synchronize(lib_ptg_box) } + + # let(:lib_ptg_box) { instance_double(LibPtgBox::LibPtgBox, 'lib_ptg_box') } + let(:lib_ptg_box) { LibPtgBox::LibPtgBox.new } + + it { is_expected.to eq("synchronize\n") } + end + + describe '#assemble_marc_files' do + subject { program.assemble_marc_files(product_family) } + + let(:product_family) { instance_double(LibPtgBox::ProductFamily, 'product_family', name: 'product_name') } + + it { is_expected.to eq(product_family.name + "\n") } + end +end diff --git a/spec/programs/assemble_marc_files_spec.rb b/spec/programs/assemble_marc_files_spec.rb new file mode 100644 index 0000000..ba3e8c4 --- /dev/null +++ b/spec/programs/assemble_marc_files_spec.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe AssembleMarcFiles do + describe '#run' do + let(:assemble_marc_files) { instance_double(AssembleMarcFiles::AssembleMarcFiles, "AssembleMarcFiles") } + let(:mailer) { double("NotifierMailer") } # rubocop:disable RSpec/VerifiedDoubles + + before do + allow(AssembleMarcFiles::AssembleMarcFiles).to receive(:new).and_return(assemble_marc_files) + allow(mailer).to receive(:deliver_now) + end + + context 'when log empty' do + before do + allow(assemble_marc_files).to receive(:execute).and_return("") + allow(NotifierMailer).to receive(:administrators).with(anything).and_return(mailer) + end + + it 'does not notifies administrators' do + described_class.run + expect(assemble_marc_files).to have_received(:execute) + expect(mailer).not_to have_received(:deliver_now) + end + end + + context 'when log non-empty' do + before do + allow(assemble_marc_files).to receive(:execute).and_return("log\n") + allow(NotifierMailer).to receive(:administrators).with("log\n").and_return(mailer) + end + + it 'notifies administrators' do + described_class.run + expect(assemble_marc_files).to have_received(:execute) + expect(mailer).to have_received(:deliver_now) + end + end + + context 'when standard error' do + before do + allow(assemble_marc_files).to receive(:execute).and_raise(StandardError) + allow(NotifierMailer).to receive(:administrators).with("AssembleMarcFiles run error (StandardError)\n").and_return(mailer) + end + + it 'notifies administrators' do + described_class.run + expect(mailer).to have_received(:deliver_now) + end + end + end +end diff --git a/spec/runners/assemble_marc_files_spec.rb b/spec/runners/assemble_marc_files_spec.rb deleted file mode 100644 index 891f3c7..0000000 --- a/spec/runners/assemble_marc_files_spec.rb +++ /dev/null @@ -1,51 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -require 'support/mock_boxr' - -module Boxr - MOCK_ROOT = Rails.root.join('spec', 'fixtures') - - class Client - def initialize - @init = true - end - - def file_from_path(path) - mock_client.file_from_path(File.join(MOCK_ROOT, path)) - end - - def folder_from_path(path) - mock_client.folder_from_path(File.join(MOCK_ROOT, path)) - end - - def folder_items(folder, options) - mock_client.folder_items(folder, options) - end - - def download_file(file) - mock_client.download_file(file) - end - - def upload_file(path, folder) - mock_client.upload_file(path, folder) - end - - private - - def mock_client - @mock_client ||= MockBoxr::Client.new - end - end -end - -RSpec.describe AssembleMarcFiles do - subject(:assemble_marc_files) { described_class.new } - - describe '#run' do - subject { assemble_marc_files.run } - - it { is_expected.to be_nil } - end -end