# frozen_string_literal: true
require 'spec_helper'
describe Geoblacklight::Metadata::Base do
subject(:metadata) { described_class.new(reference) }
let(:connection) { instance_double(Faraday::Connection) }
let(:response) { instance_double(Faraday::Response) }
let(:reference) do
Geoblacklight::Reference.new(['http://www.loc.gov/mods/v3', 'http://purl.stanford.edu/cg357zz0321.mods'])
end
before do
allow(Faraday).to receive(:new).with(url: 'http://purl.stanford.edu/cg357zz0321.mods').and_return(connection)
end
describe '#document' do
context 'with valid XML data at an endpoint URL' do
before do
allow(response).to receive(:status).and_return(200)
allow(response).to receive(:body).and_return('data')
allow(connection).to receive(:get).and_return(response)
end
it 'returns an XML Document containing the payload from an endpoint url' do
expect(metadata.document).to be_a Nokogiri::XML::Document
end
end
context 'when attempts to connect to an endpoint URL fail' do
subject { metadata.document }
before do
allow(connection).to receive(:get).and_raise(Faraday::ConnectionFailed, 'test connection failures')
end
it 'returns nil when a connection error' do
expect(subject).to be_a Nokogiri::XML::Document
expect(subject.children.empty?).to be true
end
end
end
context 'when attempts to connect to an endpoint URL raise an OpenSSL error' do
subject { metadata.document }
before do
expect(Geoblacklight.logger).to receive(:error).with(/dh key too small/)
allow(connection).to receive(:get).and_raise(OpenSSL::SSL::SSLError, 'dh key too small')
end
it 'returns nil when a connection error' do
expect(subject).to be_a Nokogiri::XML::Document
expect(subject.children.empty?).to be true
end
end
describe '#blank?' do
before do
allow(Faraday).to receive(:new).with(url: 'http://purl.stanford.edu/cg357zz0321.mods').and_return(connection)
end
context 'with valid XML data at an endpoint URL' do
before do
allow(response).to receive(:status).and_return(200)
allow(response).to receive(:body).and_return('data')
allow(connection).to receive(:get).and_return(response)
end
it 'returns false' do
expect(metadata.blank?).to be false
end
end
context 'when attempts to connect to an endpoint URL fail' do
before do
allow(connection).to receive(:get).and_raise(Faraday::ConnectionFailed, 'test connection failures')
end
it 'returns true' do
expect(metadata.blank?).to be true
end
end
end
describe '#endpoint' do
before do
allow(Faraday).to receive(:new).with(url: 'http://purl.stanford.edu/cg357zz0321.mods').and_return(connection)
allow(response).to receive(:status).and_return(200)
allow(response).to receive(:body).and_return('data')
allow(connection).to receive(:get).and_return(response)
end
it 'returns the URI' do
expect(metadata.endpoint).to eq 'http://purl.stanford.edu/cg357zz0321.mods'
end
end
describe '#to_html' do
let(:ns) { 'http://www.opengis.net/cat/csw/csdgm' }
let(:url) { 'https://raw.githubusercontent.com/OpenGeoMetadata/edu.tufts/master/165/242/110/132/fgdc.xml' }
let(:reference) do
Geoblacklight::Reference.new([ns, url])
end
let(:connection) { instance_double(Faraday::Connection) }
let(:response) { instance_double(Faraday::Response) }
let(:geocombine_metadata) { instance_double(GeoCombine::Iso19139) }
let(:html) { '' }
let(:status) { 200 }
before do
allow(GeoCombine::Metadata).to receive(:new).and_return(geocombine_metadata)
allow(connection).to receive(:use)
allow(connection).to receive(:adapter)
allow(Faraday).to receive(:new).and_yield(connection).and_return(connection)
allow(response).to receive(:status).and_return(status)
allow(response).to receive(:body).and_return('')
end
it 'retrieves the metadata and transforms it into the HTML' do
allow(geocombine_metadata).to receive(:to_html).and_return(html)
allow(connection).to receive(:get).and_return(response)
expect(metadata.to_html).to eq html
end
context 'when the metadata resource cannot be found' do
let(:status) { 404 }
before do
allow(Geoblacklight.logger).to receive(:error).with("Could not reach #{url}")
end
it 'logs an error and returns an empty String' do
allow(geocombine_metadata).to receive(:to_html).and_return('')
allow(connection).to receive(:get).and_return(response)
expect(Geoblacklight.logger).to receive(:error)
expect(metadata.to_html).to be_empty
end
end
context 'when requesting the metadata resource times out' do
before do
allow(geocombine_metadata).to receive(:to_html).and_return('')
allow(connection).to receive(:get).and_raise(Faraday::TimeoutError)
allow(Geoblacklight.logger).to receive(:error).with('#>')
end
it 'logs an error and returns an empty String' do
expect(Geoblacklight.logger).to receive(:error)
expect(metadata.to_html).to be_empty
end
end
end
end