qa 2.1.1 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/README.md +22 -3
- data/app/controllers/qa/application_controller.rb +2 -0
- data/app/controllers/qa/linked_data_terms_controller.rb +108 -49
- data/config/initializers/linked_data_authorities.rb +1 -17
- data/config/routes.rb +3 -0
- data/lib/generators/qa/apidoc/USAGE +11 -0
- data/lib/generators/qa/apidoc/apidoc_generator.rb +22 -0
- data/lib/generators/qa/apidoc/templates/public/qa/apidoc/apidoc.json +1322 -0
- data/lib/generators/qa/apidoc/templates/public/qa/apidoc/favicon-16x16.png +0 -0
- data/lib/generators/qa/apidoc/templates/public/qa/apidoc/favicon-32x32.png +0 -0
- data/lib/generators/qa/apidoc/templates/public/qa/apidoc/index.html +61 -0
- data/lib/generators/qa/apidoc/templates/public/qa/apidoc/oauth2-redirect.html +67 -0
- data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui-bundle.js +93 -0
- data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui-bundle.js.map +1 -0
- data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui-standalone-preset.js +14 -0
- data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui-standalone-preset.js.map +1 -0
- data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui.css +3 -0
- data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui.css.map +1 -0
- data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui.js +9 -0
- data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui.js.map +1 -0
- data/lib/generators/qa/install/install_generator.rb +7 -0
- data/lib/generators/qa/install/templates/config/initializers/qa.rb +6 -0
- data/lib/qa/authorities/getty/aat.rb +13 -6
- data/lib/qa/authorities/getty/tgn.rb +10 -21
- data/lib/qa/authorities/getty/ulan.rb +12 -15
- data/lib/qa/authorities/linked_data.rb +1 -0
- data/lib/qa/authorities/linked_data/authority_service.rb +47 -0
- data/lib/qa/authorities/linked_data/config.rb +1 -1
- data/lib/qa/authorities/linked_data/find_term.rb +2 -1
- data/lib/qa/authorities/linked_data/generic_authority.rb +8 -1
- data/lib/qa/authorities/loc/generic_authority.rb +2 -2
- data/lib/qa/configuration.rb +18 -0
- data/lib/qa/version.rb +1 -1
- data/spec/controllers/linked_data_terms_controller_spec.rb +175 -35
- data/spec/controllers/terms_controller_spec.rb +2 -2
- data/spec/fixtures/authorities/linked_data/lod_term_uri_param_config.json +27 -0
- data/spec/lib/authorities/getty/aat_spec.rb +14 -9
- data/spec/lib/authorities/getty/tgn_spec.rb +6 -17
- data/spec/lib/authorities/getty/ulan_spec.rb +5 -5
- data/spec/lib/authorities/linked_data/authority_service_spec.rb +46 -0
- data/spec/lib/authorities/linked_data/generic_authority_spec.rb +0 -84
- data/spec/lib/authorities/loc_spec.rb +9 -9
- data/spec/lib/configuration_spec.rb +58 -0
- metadata +42 -14
- data/config/authorities/linked_data/agrovoc.json +0 -61
- data/spec/fixtures/lod_agrovoc_query_many_results.json +0 -1
- data/spec/fixtures/lod_agrovoc_query_no_results.json +0 -1
- data/spec/fixtures/lod_agrovoc_term_found.rdf.xml +0 -217
@@ -44,7 +44,7 @@ module Qa::Authorities
|
|
44
44
|
# Return the full configuration for an authority
|
45
45
|
# @return [String] the authority configuration
|
46
46
|
def auth_config
|
47
|
-
@authority_config ||=
|
47
|
+
@authority_config ||= Qa::Authorities::LinkedData::AuthorityService.authority_config(@authority_name)
|
48
48
|
raise Qa::InvalidLinkedDataAuthority, "Unable to initialize linked data authority '#{@authority_name}'" if @authority_config.nil?
|
49
49
|
@authority_config
|
50
50
|
end
|
@@ -33,13 +33,14 @@ module Qa::Authorities
|
|
33
33
|
# "http://schema.org/name":["Cornell University","Ithaca (N.Y.). Cornell University"],
|
34
34
|
# "http://www.w3.org/2004/02/skos/core#altLabel":["Ithaca (N.Y.). Cornell University"],
|
35
35
|
# "http://schema.org/sameAs":["http://id.loc.gov/authorities/names/n79021621","https://viaf.org/viaf/126293486"] } }
|
36
|
-
def find(id, language: nil, replacements: {}, subauth: nil)
|
36
|
+
def find(id, language: nil, replacements: {}, subauth: nil, jsonld: false)
|
37
37
|
raise Qa::InvalidLinkedDataAuthority, "Unable to initialize linked data term sub-authority #{subauth}" unless subauth.nil? || term_subauthority?(subauth)
|
38
38
|
language ||= term_config.term_language
|
39
39
|
url = term_config.term_url_with_replacements(id, subauth, replacements)
|
40
40
|
Rails.logger.info "QA Linked Data term url: #{url}"
|
41
41
|
graph = get_linked_data(url)
|
42
42
|
return "{}" unless graph.size.positive?
|
43
|
+
return graph.dump(:jsonld, standard_prefixes: true) if jsonld
|
43
44
|
parse_term_authority_response(id, graph, language)
|
44
45
|
end
|
45
46
|
|
@@ -22,7 +22,13 @@ module Qa::Authorities
|
|
22
22
|
@auth_config = Qa::Authorities::LinkedData::Config.new(auth_name)
|
23
23
|
end
|
24
24
|
|
25
|
-
|
25
|
+
def reload_authorities
|
26
|
+
@authorities_service.load_authorities
|
27
|
+
end
|
28
|
+
|
29
|
+
def authorities_service
|
30
|
+
@authorities_service ||= Qa::Authorities::LinkedData::AuthorityService
|
31
|
+
end
|
26
32
|
|
27
33
|
def search_service
|
28
34
|
@search_service ||= Qa::Authorities::LinkedData::SearchQuery.new(search_config)
|
@@ -34,6 +40,7 @@ module Qa::Authorities
|
|
34
40
|
|
35
41
|
delegate :search, to: :search_service
|
36
42
|
delegate :find, to: :item_service
|
43
|
+
delegate :load_authorities, :authority_names, to: :authorities_service
|
37
44
|
|
38
45
|
private
|
39
46
|
|
@@ -26,7 +26,7 @@ module Qa::Authorities
|
|
26
26
|
def build_query_url(q)
|
27
27
|
escaped_query = URI.escape(q)
|
28
28
|
authority_fragment = Loc.get_url_for_authority(subauthority) + URI.escape(subauthority)
|
29
|
-
"
|
29
|
+
"https://id.loc.gov/search/?q=#{escaped_query}&q=#{authority_fragment}&format=json"
|
30
30
|
end
|
31
31
|
|
32
32
|
def find(id)
|
@@ -34,7 +34,7 @@ module Qa::Authorities
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def find_url(id)
|
37
|
-
"
|
37
|
+
"https://id.loc.gov/authorities/#{@subauthority}/#{id}.json"
|
38
38
|
end
|
39
39
|
|
40
40
|
private
|
data/lib/qa/configuration.rb
CHANGED
@@ -12,5 +12,23 @@ module Qa
|
|
12
12
|
def disable_cors_headers
|
13
13
|
@cors_headers_enabled = false
|
14
14
|
end
|
15
|
+
|
16
|
+
# Provide a token that allows reloading of linked data authorities through the controller
|
17
|
+
# action '/reload/linked_data/authorities?auth_token=YOUR_AUTH_TOKEN_DEFINED_HERE' without
|
18
|
+
# requiring a restart of rails. By default, reloading through the browser is not allowed
|
19
|
+
# when the token is nil or blank. Change to your approved token string in
|
20
|
+
# config/initializers/qa.rb.
|
21
|
+
attr_writer :authorized_reload_token
|
22
|
+
def authorized_reload_token
|
23
|
+
@authorized_reload_token ||= nil
|
24
|
+
end
|
25
|
+
|
26
|
+
def valid_authority_reload_token?(token)
|
27
|
+
return false if token.blank? || authorized_reload_token.blank?
|
28
|
+
token == authorized_reload_token
|
29
|
+
end
|
30
|
+
|
31
|
+
# Hold linked data authority configs
|
32
|
+
attr_accessor :linked_data_authority_configs
|
15
33
|
end
|
16
34
|
end
|
data/lib/qa/version.rb
CHANGED
@@ -61,6 +61,14 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
61
61
|
end
|
62
62
|
end
|
63
63
|
|
64
|
+
describe '#check_uri_param' do
|
65
|
+
it 'returns 400 if the uri is missing' do
|
66
|
+
expect(Rails.logger).to receive(:warn).with("Required fetch param 'uri' is missing or empty")
|
67
|
+
get :fetch, params: { uri: '', vocab: 'OCLC_FAST' }
|
68
|
+
expect(response.code).to eq('400')
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
64
72
|
describe '#init_authority' do
|
65
73
|
context 'when the authority does not exist' do
|
66
74
|
it 'returns 400' do
|
@@ -71,6 +79,18 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
71
79
|
end
|
72
80
|
end
|
73
81
|
|
82
|
+
describe '#list' do
|
83
|
+
let(:expected_results) { ['Auth1', 'Auth2', 'Auth3'] }
|
84
|
+
before do
|
85
|
+
allow(Qa::Authorities::LinkedData::AuthorityService).to receive(:authority_names).and_return(expected_results)
|
86
|
+
end
|
87
|
+
it 'returns list of authorities' do
|
88
|
+
get :list
|
89
|
+
expect(response).to be_successful
|
90
|
+
expect(response.body).to eq expected_results.to_json
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
74
94
|
describe '#search' do
|
75
95
|
context 'producing internal server error' do
|
76
96
|
context 'when server returns 500' do
|
@@ -195,30 +215,6 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
195
215
|
end
|
196
216
|
end
|
197
217
|
end
|
198
|
-
|
199
|
-
context 'in AGROVOC authority' do
|
200
|
-
context '0 search results' do
|
201
|
-
before do
|
202
|
-
stub_request(:get, 'http://artemide.art.uniroma2.it:8081/agrovoc/rest/v1/search/?lang=en&query=*supercalifragilisticexpialidocious*')
|
203
|
-
.to_return(status: 200, body: webmock_fixture('lod_agrovoc_query_no_results.json'), headers: { 'Content-Type' => 'application/json' })
|
204
|
-
end
|
205
|
-
it 'succeeds' do
|
206
|
-
get :search, params: { q: 'supercalifragilisticexpialidocious', vocab: 'AGROVOC' }
|
207
|
-
expect(response).to be_successful
|
208
|
-
end
|
209
|
-
end
|
210
|
-
|
211
|
-
context '3 search results' do
|
212
|
-
before do
|
213
|
-
stub_request(:get, 'http://artemide.art.uniroma2.it:8081/agrovoc/rest/v1/search/?lang=en&query=*milk*')
|
214
|
-
.to_return(status: 200, body: webmock_fixture('lod_agrovoc_query_many_results.json'), headers: { 'Content-Type' => 'application/json' })
|
215
|
-
end
|
216
|
-
it 'succeeds' do
|
217
|
-
get :search, params: { q: 'milk', vocab: 'AGROVOC' }
|
218
|
-
expect(response).to be_successful
|
219
|
-
end
|
220
|
-
end
|
221
|
-
end
|
222
218
|
end
|
223
219
|
|
224
220
|
describe '#show' do
|
@@ -287,9 +283,27 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
287
283
|
stub_request(:get, 'http://id.worldcat.org/fast/530369')
|
288
284
|
.to_return(status: 200, body: webmock_fixture('lod_oclc_term_found.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
|
289
285
|
end
|
290
|
-
it 'succeeds' do
|
286
|
+
it 'succeeds and defaults to json content type' do
|
291
287
|
get :show, params: { id: '530369', vocab: 'OCLC_FAST' }
|
292
288
|
expect(response).to be_successful
|
289
|
+
expect(response.content_type).to eq 'application/json'
|
290
|
+
end
|
291
|
+
|
292
|
+
context 'and it was requested as json' do
|
293
|
+
it 'succeeds and returns term data as json content type' do
|
294
|
+
get :show, params: { id: '530369', vocab: 'OCLC_FAST', format: 'json' }
|
295
|
+
expect(response).to be_successful
|
296
|
+
expect(response.content_type).to eq 'application/json'
|
297
|
+
end
|
298
|
+
end
|
299
|
+
|
300
|
+
context 'and it was requested as jsonld' do
|
301
|
+
it 'succeeds and returns term data as jsonld content type' do
|
302
|
+
get :show, params: { id: '530369', vocab: 'OCLC_FAST', format: 'jsonld' }
|
303
|
+
expect(response).to be_successful
|
304
|
+
expect(response.content_type).to eq 'application/ld+json'
|
305
|
+
expect(JSON.parse(response.body).keys).to match_array ["@context", "@graph"]
|
306
|
+
end
|
293
307
|
end
|
294
308
|
end
|
295
309
|
|
@@ -318,30 +332,156 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
318
332
|
end
|
319
333
|
end
|
320
334
|
|
321
|
-
context 'in
|
335
|
+
context 'in LOC authority' do
|
322
336
|
context 'term found' do
|
323
337
|
before do
|
324
|
-
stub_request(:get, 'http://
|
325
|
-
.to_return(status: 200, body: webmock_fixture('
|
338
|
+
stub_request(:get, 'http://id.loc.gov/authorities/subjects/sh85118553')
|
339
|
+
.to_return(status: 200, body: webmock_fixture('lod_loc_term_found.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
|
326
340
|
end
|
327
|
-
it 'succeeds' do
|
328
|
-
get :show, params: { id: '
|
341
|
+
it 'succeeds and defaults to json content type' do
|
342
|
+
get :show, params: { id: 'sh85118553', vocab: 'LOC', subauthority: 'subjects' }
|
329
343
|
expect(response).to be_successful
|
344
|
+
expect(response.content_type).to eq 'application/json'
|
330
345
|
end
|
331
346
|
end
|
332
347
|
end
|
348
|
+
end
|
333
349
|
|
334
|
-
|
350
|
+
describe '#fetch' do
|
351
|
+
context 'producing internal server error' do
|
352
|
+
context 'when server returns 500' do
|
353
|
+
before do
|
354
|
+
stub_request(:get, 'http://localhost/test_default/term?uri=http://test.org/530369').to_return(status: 500)
|
355
|
+
end
|
356
|
+
it 'returns 500' do
|
357
|
+
expect(Rails.logger).to receive(:warn).with("Internal Server Error - Fetch term http://test.org/530369 unsuccessful for authority LOD_TERM_URI_PARAM_CONFIG")
|
358
|
+
get :fetch, params: { vocab: 'LOD_TERM_URI_PARAM_CONFIG', uri: 'http://test.org/530369' }
|
359
|
+
expect(response.code).to eq('500')
|
360
|
+
end
|
361
|
+
end
|
362
|
+
|
363
|
+
context 'when rdf format error' do
|
364
|
+
before do
|
365
|
+
stub_request(:get, 'http://localhost/test_default/term?uri=http://test.org/530369').to_return(status: 200)
|
366
|
+
allow(RDF::Graph).to receive(:load).and_raise(RDF::FormatError)
|
367
|
+
end
|
368
|
+
it 'returns 500' do
|
369
|
+
msg = "RDF Format Error - Results from fetch term http://test.org/530369 for authority LOD_TERM_URI_PARAM_CONFIG was not identified as a valid RDF format. " \
|
370
|
+
"You may need to include the linkeddata gem."
|
371
|
+
expect(Rails.logger).to receive(:warn).with(msg)
|
372
|
+
get :fetch, params: { uri: 'http://test.org/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG' }
|
373
|
+
expect(response.code).to eq('500')
|
374
|
+
end
|
375
|
+
end
|
376
|
+
|
377
|
+
context "when error isn't specifically handled" do
|
378
|
+
before do
|
379
|
+
stub_request(:get, 'http://localhost/test_default/term?uri=http://test.org/530369').to_return(status: 501)
|
380
|
+
end
|
381
|
+
it 'returns 500' do
|
382
|
+
expect(Rails.logger).to receive(:warn).with("Internal Server Error - Fetch term http://test.org/530369 unsuccessful for authority LOD_TERM_URI_PARAM_CONFIG")
|
383
|
+
get :fetch, params: { uri: 'http://test.org/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG' }
|
384
|
+
expect(response.code).to eq('500')
|
385
|
+
end
|
386
|
+
end
|
387
|
+
end
|
388
|
+
|
389
|
+
context 'when service unavailable' do
|
390
|
+
before do
|
391
|
+
stub_request(:get, 'http://localhost/test_default/term?uri=http://test.org/530369').to_return(status: 503)
|
392
|
+
end
|
393
|
+
it 'returns 503' do
|
394
|
+
expect(Rails.logger).to receive(:warn).with("Service Unavailable - Fetch term http://test.org/530369 unsuccessful for authority LOD_TERM_URI_PARAM_CONFIG")
|
395
|
+
get :fetch, params: { uri: 'http://test.org/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG' }
|
396
|
+
expect(response.code).to eq('503')
|
397
|
+
end
|
398
|
+
end
|
399
|
+
|
400
|
+
context 'when requested term is not found at the server' do
|
401
|
+
before do
|
402
|
+
stub_request(:get, 'http://localhost/test_default/term?uri=http://test.org/FAKE_ID').to_return(status: 404, body: '', headers: {})
|
403
|
+
end
|
404
|
+
it 'returns 404' do
|
405
|
+
expect(Rails.logger).to receive(:warn).with('Term Not Found - Fetch term http://test.org/FAKE_ID unsuccessful for authority LOD_TERM_URI_PARAM_CONFIG')
|
406
|
+
get :fetch, params: { uri: 'http://test.org/FAKE_ID', vocab: 'LOD_TERM_URI_PARAM_CONFIG' }
|
407
|
+
expect(response.code).to eq('404')
|
408
|
+
end
|
409
|
+
end
|
410
|
+
|
411
|
+
context 'in LOD_TERM_URI_PARAM_CONFIG authority' do
|
335
412
|
context 'term found' do
|
336
413
|
before do
|
337
|
-
stub_request(:get, 'http://
|
338
|
-
.to_return(status: 200, body: webmock_fixture('
|
414
|
+
stub_request(:get, 'http://localhost/test_default/term?uri=http://test.org/530369')
|
415
|
+
.to_return(status: 200, body: webmock_fixture('lod_oclc_term_found.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
|
339
416
|
end
|
340
|
-
|
341
|
-
|
417
|
+
|
418
|
+
it 'succeeds and defaults to json content type' do
|
419
|
+
get :fetch, params: { uri: 'http://test.org/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG' }
|
342
420
|
expect(response).to be_successful
|
421
|
+
expect(response.content_type).to eq 'application/json'
|
422
|
+
end
|
423
|
+
|
424
|
+
context 'and it was requested as json' do
|
425
|
+
it 'succeeds and returns term data as json content type' do
|
426
|
+
get :fetch, params: { uri: 'http://test.org/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG', format: 'json' }
|
427
|
+
expect(response).to be_successful
|
428
|
+
expect(response.content_type).to eq 'application/json'
|
429
|
+
end
|
430
|
+
end
|
431
|
+
|
432
|
+
context 'and it was requested as jsonld' do
|
433
|
+
it 'succeeds and returns term data as jsonld content type' do
|
434
|
+
get :fetch, params: { uri: 'http://test.org/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG', format: 'jsonld' }
|
435
|
+
expect(response).to be_successful
|
436
|
+
expect(response.content_type).to eq 'application/ld+json'
|
437
|
+
expect(JSON.parse(response.body).keys).to match_array ["@context", "@graph"]
|
438
|
+
end
|
439
|
+
end
|
440
|
+
end
|
441
|
+
|
442
|
+
context 'when cors headers are enabled' do
|
443
|
+
before do
|
444
|
+
Qa.config.enable_cors_headers
|
445
|
+
stub_request(:get, 'http://localhost/test_default/term?uri=http://test.org/530369')
|
446
|
+
.to_return(status: 200, body: webmock_fixture('lod_oclc_term_found.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
|
447
|
+
end
|
448
|
+
it 'Access-Control-Allow-Origin is *' do
|
449
|
+
get :fetch, params: { uri: 'http://test.org/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG' }
|
450
|
+
expect(response.headers['Access-Control-Allow-Origin']).to eq '*'
|
451
|
+
end
|
452
|
+
end
|
453
|
+
|
454
|
+
context 'when cors headers are disabled' do
|
455
|
+
before do
|
456
|
+
Qa.config.disable_cors_headers
|
457
|
+
stub_request(:get, 'http://localhost/test_default/term?uri=http://test.org/530369')
|
458
|
+
.to_return(status: 200, body: webmock_fixture('lod_oclc_term_found.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
|
459
|
+
end
|
460
|
+
it 'Access-Control-Allow-Origin is not present' do
|
461
|
+
get :fetch, params: { uri: 'http://test.org/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG' }
|
462
|
+
expect(response.headers.key?('Access-Control-Allow-Origin')).to be false
|
343
463
|
end
|
344
464
|
end
|
345
465
|
end
|
346
466
|
end
|
467
|
+
|
468
|
+
describe '#reload' do
|
469
|
+
before do
|
470
|
+
Qa.config.authorized_reload_token = 'A_TOKEN'
|
471
|
+
end
|
472
|
+
|
473
|
+
context 'when token does not match' do
|
474
|
+
it 'returns 401' do
|
475
|
+
get :reload, params: { auth_token: 'BAD_TOKEN' }
|
476
|
+
expect(response.code).to eq('401')
|
477
|
+
end
|
478
|
+
end
|
479
|
+
|
480
|
+
context 'when token does match' do
|
481
|
+
it 'returns 200' do
|
482
|
+
get :reload, params: { auth_token: 'A_TOKEN' }
|
483
|
+
expect(response.code).to eq('200')
|
484
|
+
end
|
485
|
+
end
|
486
|
+
end
|
347
487
|
end
|
@@ -78,7 +78,7 @@ describe Qa::TermsController, type: :controller do
|
|
78
78
|
|
79
79
|
context "loc" do
|
80
80
|
before do
|
81
|
-
stub_request(:get, "
|
81
|
+
stub_request(:get, "https://id.loc.gov/search/?format=json&q=Berry&q=cs:http://id.loc.gov/authorities/names")
|
82
82
|
.with(headers: { 'Accept' => 'application/json' })
|
83
83
|
.to_return(body: webmock_fixture("loc-names-response.txt"), status: 200)
|
84
84
|
end
|
@@ -184,7 +184,7 @@ describe Qa::TermsController, type: :controller do
|
|
184
184
|
describe "#show" do
|
185
185
|
context "with supported authorities" do
|
186
186
|
before do
|
187
|
-
stub_request(:get, "
|
187
|
+
stub_request(:get, "https://id.loc.gov/authorities/subjects/sh85077565.json")
|
188
188
|
.with(headers: { 'Accept' => 'application/json' })
|
189
189
|
.to_return(status: 200, body: webmock_fixture("loc-names-response.txt"), headers: {})
|
190
190
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
{
|
2
|
+
"term": {
|
3
|
+
"url": {
|
4
|
+
"@context": "http://www.w3.org/ns/hydra/context.jsonld",
|
5
|
+
"@type": "IriTemplate",
|
6
|
+
"template": "http://localhost/test_default/term?uri={?term_uri}",
|
7
|
+
"variableRepresentation": "BasicRepresentation",
|
8
|
+
"mapping": [
|
9
|
+
{
|
10
|
+
"@type": "IriTemplateMapping",
|
11
|
+
"variable": "term_uri",
|
12
|
+
"property": "hydra:freetextQuery",
|
13
|
+
"required": true
|
14
|
+
}
|
15
|
+
]
|
16
|
+
},
|
17
|
+
"qa_replacement_patterns": {
|
18
|
+
"term_id": "term_uri"
|
19
|
+
},
|
20
|
+
"term_id": "URI",
|
21
|
+
"results": {
|
22
|
+
"id_predicate": "http://id.loc.gov/vocabulary/identifiers/lccn",
|
23
|
+
"label_predicate": "http://www.w3.org/2004/02/skos/core#prefLabel"
|
24
|
+
}
|
25
|
+
},
|
26
|
+
"search": {}
|
27
|
+
}
|
@@ -65,15 +65,20 @@ describe Qa::Authorities::Getty::AAT do
|
|
65
65
|
subject { authority.request_options }
|
66
66
|
it { is_expected.to eq(accept: "application/sparql-results+json") }
|
67
67
|
end
|
68
|
-
|
68
|
+
# rubocop:disable Metrics/LineLength
|
69
69
|
describe "#sparql" do
|
70
|
-
subject
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
70
|
+
context "using a single subject term" do
|
71
|
+
subject { authority.sparql('search_term') }
|
72
|
+
it {
|
73
|
+
is_expected.to eq %(SELECT ?s ?name { ?s a skos:Concept; luc:term "search_term"; skos:inScheme <http://vocab.getty.edu/aat/> ; gvp:prefLabelGVP [skosxl:literalForm ?name]. FILTER regex(?name, "search_term", "i") . } ORDER BY ?name)
|
74
|
+
}
|
75
|
+
end
|
76
|
+
context "using a two subject terms" do
|
77
|
+
subject { authority.sparql('search term') }
|
78
|
+
it {
|
79
|
+
is_expected.to eq %(SELECT ?s ?name { ?s a skos:Concept; luc:term "search term"; skos:inScheme <http://vocab.getty.edu/aat/> ; gvp:prefLabelGVP [skosxl:literalForm ?name]. FILTER ((regex(?name, "search", "i")) && (regex(?name, "term", "i"))) . } ORDER BY ?name)
|
80
|
+
}
|
81
|
+
end
|
78
82
|
end
|
83
|
+
# rubocop:enable Metrics/LineLength
|
79
84
|
end
|
@@ -65,31 +65,20 @@ describe Qa::Authorities::Getty::TGN do
|
|
65
65
|
subject { authority.request_options }
|
66
66
|
it { is_expected.to eq(accept: "application/sparql-results+json") }
|
67
67
|
end
|
68
|
-
|
68
|
+
# rubocop:disable Metrics/LineLength
|
69
69
|
describe "#sparql" do
|
70
70
|
context "using a single subject term" do
|
71
71
|
subject { authority.sparql('search_term') }
|
72
72
|
it {
|
73
|
-
is_expected.to eq
|
74
|
-
|
75
|
-
skos:inScheme <http://vocab.getty.edu/tgn/> ;
|
76
|
-
gvp:prefLabelGVP [skosxl:literalForm ?name] ;
|
77
|
-
gvp:parentString ?par .
|
78
|
-
FILTER regex(?name, "search_term", "i") .
|
79
|
-
} ORDER BY ?name ASC(?par)' }
|
73
|
+
is_expected.to eq %(SELECT DISTINCT ?s ?name ?par { ?s a skos:Concept; luc:term "search_term"; skos:inScheme <http://vocab.getty.edu/ulan/> ; gvp:prefLabelGVP [skosxl:literalForm ?name] ; gvp:parentString ?par . FILTER regex(?name, "search_term", "i") . } ORDER BY ?name ASC(?par))
|
74
|
+
}
|
80
75
|
end
|
81
76
|
context "using a two subject terms" do
|
82
77
|
subject { authority.sparql('search term') }
|
83
|
-
# rubocop:disable Metrics/LineLength
|
84
78
|
it {
|
85
|
-
is_expected.to eq
|
86
|
-
|
87
|
-
skos:inScheme <http://vocab.getty.edu/tgn/> ;
|
88
|
-
gvp:prefLabelGVP [skosxl:literalForm ?name] ;
|
89
|
-
gvp:parentString ?par .
|
90
|
-
FILTER ((regex(CONCAT(?name, ', ', REPLACE(str(?par), \",[^,]+,[^,]+$\", \"\")), \"search\",\"i\" ) && regex(CONCAT(?name, ', ', REPLACE(str(?par), \",[^,]+,[^,]+$\", \"\")), \"term\",\"i\" ) ) && (regex(?name, \"search\",\"i\" ) || regex(?name, \"term\",\"i\" ) ) ) .
|
91
|
-
} ORDER BY ?name ASC(?par)" }
|
92
|
-
# rubocop:enable Metrics/LineLength
|
79
|
+
is_expected.to eq %(SELECT DISTINCT ?s ?name ?par { ?s a skos:Concept; luc:term "search term"; skos:inScheme <http://vocab.getty.edu/ulan/> ; gvp:prefLabelGVP [skosxl:literalForm ?name] ; gvp:parentString ?par . FILTER ((regex(?name, "search", "i") || regex(?alt, "search", "i")) && (regex(?name, "term", "i") || regex(?alt, "term", "i"))) . } ORDER BY ?name ASC(?par))
|
80
|
+
}
|
93
81
|
end
|
94
82
|
end
|
83
|
+
# rubocop:enable Metrics/LineLength
|
95
84
|
end
|