require 'spec_helper'
describe Qa::Authorities::Getty::Ulan do
let(:authority) { described_class.new }
describe "#build_query_url" do
subject { authority.build_query_url("foo") }
it { is_expected.to match(/^http:\/\/vocab\.getty\.edu\//) }
end
describe "#find_url" do
subject { authority.find_url("500026846") }
it { is_expected.to eq "http://vocab.getty.edu/download/json?uri=http://vocab.getty.edu/ulan/500026846.json" }
end
describe "#search" do
context "authorities" do
before do
stub_request(:get, /vocab\.getty\.edu.*/)
.to_return(body: webmock_fixture("ulan-response.txt"), status: 200)
end
subject { authority.search('whatever') }
it "has id and label keys" do
expect(subject.first).to eq("id" => 'http://vocab.getty.edu/ulan/500233743', "label" => "Alan Turner and Associates (British architectural firm, contemporary)")
expect(subject.last).to eq("id" => 'http://vocab.getty.edu/ulan/500023812', "label" => "Warren, Charles Turner (English engraver, 1762-1823)")
expect(subject.size).to eq(142)
end
context 'when Getty returns an error,' do
before do
stub_request(:get, /vocab\.getty\.edu.*/)
.to_return(body: webmock_fixture("getty-error-response.txt"), status: 500)
end
it 'logs error and returns empty results' do
expect(Rails.logger).to receive(:warn).with(" ERROR fetching Getty response: undefined method `[]' for nil:NilClass; cause: UNKNOWN")
expect(subject).to be {}
end
end
end
end
describe "#untaint" do
subject { authority.untaint(value) }
context "with a good string" do
let(:value) { 'Turner' }
it { is_expected.to eq 'Turner' }
end
context "bad stuff" do
let(:value) { './"' }
it { is_expected.to eq '' }
end
end
describe "#find" do
context "using a subject id" do
before do
stub_request(:get, "http://vocab.getty.edu/download/json?uri=http://vocab.getty.edu/ulan/500026846.json")
.to_return(status: 200, body: webmock_fixture("getty-ulan-find-response.json"))
end
subject { authority.find("500026846") }
it "returns the complete record for a given subject" do
expect(subject['results']['bindings'].size).to eq 880
expect(subject['results']['bindings']).to all(have_key('Subject'))
expect(subject['results']['bindings']).to all(have_key('Predicate'))
expect(subject['results']['bindings']).to all(have_key('Object'))
end
end
end
describe "#request_options" do
subject { authority.request_options }
it { is_expected.to eq(accept: "application/sparql-results+json") }
end
describe "#sparql" do
context "using a single subject term" do
subject { authority.sparql('search_term') }
it {
is_expected.to eq 'SELECT DISTINCT ?s ?name ?bio {
?s a skos:Concept; luc:term "search_term";
skos:inScheme ;
gvp:prefLabelGVP [skosxl:literalForm ?name] ;
foaf:focus/gvp:biographyPreferred [schema:description ?bio] ;
skos:altLabel ?alt .
FILTER regex(?name, "search_term", "i") .
} ORDER BY ?name'.gsub(/[\s\n]+/, ' ') }
end
context "using a two subject terms" do
subject { authority.sparql('search term') }
it {
is_expected.to eq %(SELECT DISTINCT ?s ?name ?bio {
?s a skos:Concept; luc:term "search term";
skos:inScheme ;
gvp:prefLabelGVP [skosxl:literalForm ?name] ;
foaf:focus/gvp:biographyPreferred [schema:description ?bio] ;
skos:altLabel ?alt .
FILTER ((regex(?name, "search", "i") || regex(?alt, "search", "i")) && (regex(?name, "term", "i") || regex(?alt, "term", "i"))) .
} ORDER BY ?name).gsub(/[\s\n]+/, ' ') }
end
end
end