qa 4.0.0 → 4.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 +4 -4
- data/README.md +1 -1
- data/app/controllers/qa/linked_data_terms_controller.rb +30 -9
- data/app/controllers/qa/terms_controller.rb +3 -2
- data/app/models/qa/linked_data/config/context_property_map.rb +6 -25
- data/app/services/qa/iri_template_service.rb +32 -24
- data/app/services/qa/linked_data/authority_service.rb +8 -0
- data/app/services/qa/linked_data/authority_url_service.rb +27 -8
- data/app/services/qa/linked_data/deep_sort_service.rb +3 -2
- data/app/services/qa/linked_data/graph_service.rb +13 -0
- data/app/services/qa/linked_data/language_service.rb +12 -0
- data/app/services/qa/linked_data/language_sort_service.rb +7 -2
- data/app/services/qa/linked_data/ldpath_service.rb +40 -0
- data/app/services/qa/linked_data/mapper/graph_ldpath_mapper_service.rb +49 -0
- data/app/services/qa/linked_data/mapper/graph_mapper_service.rb +3 -11
- data/app/services/qa/linked_data/mapper/graph_predicate_mapper_service.rb +40 -0
- data/app/services/qa/linked_data/mapper/search_results_mapper_service.rb +58 -11
- data/app/services/qa/linked_data/mapper/term_results_mapper_service.rb +80 -0
- data/config/authorities/linked_data/loc.json +13 -7
- data/config/authorities/linked_data/oclc_fast.json +13 -8
- data/lib/generators/qa/discogs/USAGE +10 -0
- data/lib/generators/qa/discogs/discogs_generator.rb +12 -0
- data/lib/generators/qa/discogs/templates/config/discogs-formats.yml +346 -0
- data/lib/generators/qa/discogs/templates/config/discogs-genres.yml +627 -0
- data/lib/generators/qa/install/templates/config/initializers/qa.rb +4 -0
- data/lib/qa.rb +6 -0
- data/lib/qa/authorities.rb +2 -0
- data/lib/qa/authorities/discogs.rb +28 -0
- data/lib/qa/authorities/discogs/discogs_instance_builder.rb +145 -0
- data/lib/qa/authorities/discogs/discogs_translation.rb +126 -0
- data/lib/qa/authorities/discogs/discogs_utils.rb +89 -0
- data/lib/qa/authorities/discogs/discogs_works_builder.rb +153 -0
- data/lib/qa/authorities/discogs/generic_authority.rb +151 -0
- data/lib/qa/authorities/discogs_subauthority.rb +9 -0
- data/lib/qa/authorities/linked_data/config.rb +7 -3
- data/lib/qa/authorities/linked_data/config/search_config.rb +99 -11
- data/lib/qa/authorities/linked_data/config/term_config.rb +112 -8
- data/lib/qa/authorities/linked_data/find_term.rb +154 -84
- data/lib/qa/authorities/linked_data/search_query.rb +76 -13
- data/lib/qa/configuration.rb +8 -0
- data/lib/qa/version.rb +1 -1
- data/spec/controllers/linked_data_terms_controller_spec.rb +151 -30
- data/spec/controllers/terms_controller_spec.rb +4 -0
- data/spec/features/linked_data/language_spec.rb +298 -0
- data/spec/fixtures/authorities/linked_data/lod_full_config.json +21 -5
- data/spec/fixtures/authorities/linked_data/lod_lang_defaults.json +4 -4
- data/spec/fixtures/authorities/linked_data/lod_lang_multi_defaults.json +4 -4
- data/spec/fixtures/authorities/linked_data/lod_lang_no_defaults.json +4 -5
- data/spec/fixtures/authorities/linked_data/lod_lang_param.json +4 -4
- data/spec/fixtures/authorities/linked_data/lod_term_uri_param_config.json +1 -1
- data/spec/fixtures/discogs-find-response-json.json +1 -0
- data/spec/fixtures/discogs-find-response-jsonld-master.json +1 -0
- data/spec/fixtures/discogs-find-response-jsonld-release.json +1 -0
- data/spec/fixtures/discogs-id-matches-master.json +1 -0
- data/spec/fixtures/discogs-id-matches-release.json +1 -0
- data/spec/fixtures/discogs-id-not-found-master.json +1 -0
- data/spec/fixtures/discogs-id-not-found-release.json +1 -0
- data/spec/fixtures/discogs-search-response-no-auth.json +1 -0
- data/spec/fixtures/discogs-search-response-no-subauth.json +1 -0
- data/spec/fixtures/discogs-search-response-subauth.json +1 -0
- data/spec/fixtures/lod_lang_search_enesfrde.rdf.xml +60 -0
- data/spec/fixtures/lod_lang_search_sv.rdf.xml +42 -0
- data/spec/fixtures/lod_loc_term_found.rdf.xml +5 -0
- data/spec/lib/authorities/discogs/generic_authority_spec.rb +235 -0
- data/spec/lib/authorities/discogs_spec.rb +17 -0
- data/spec/lib/authorities/linked_data/config_spec.rb +68 -5
- data/spec/lib/authorities/linked_data/find_term_spec.rb +298 -3
- data/spec/lib/authorities/linked_data/generic_authority_spec.rb +46 -485
- data/spec/lib/authorities/linked_data/search_config_spec.rb +154 -3
- data/spec/lib/authorities/linked_data/search_query_spec.rb +240 -3
- data/spec/lib/authorities/linked_data/term_config_spec.rb +193 -5
- data/spec/lib/configuration_spec.rb +18 -0
- data/spec/models/linked_data/config/context_property_map_spec.rb +3 -31
- data/spec/services/iri_template_service_spec.rb +54 -12
- data/spec/{lib/authorities → services}/linked_data/authority_service_spec.rb +47 -0
- data/spec/services/linked_data/language_service_spec.rb +52 -11
- data/spec/services/linked_data/ldpath_service_spec.rb +61 -0
- data/spec/services/linked_data/mapper/graph_ldpath_mapper_service_spec.rb +118 -0
- data/spec/services/linked_data/mapper/graph_predicate_mapper_service_spec.rb +110 -0
- data/spec/services/linked_data/mapper/term_results_mapper_service_spec.rb +94 -0
- data/spec/spec_helper.rb +1 -1
- data/spec/support/matchers/include_hash.rb +5 -0
- data/spec/test_app_templates/lib/generators/test_app_generator.rb +4 -0
- metadata +73 -5
- data/lib/qa/authorities/linked_data/rdf_helper.rb +0 -49
|
@@ -1,18 +1,32 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
|
+
require 'qa/authorities/linked_data/config/search_config'
|
|
2
3
|
|
|
3
4
|
RSpec.describe Qa::Authorities::LinkedData::SearchConfig do
|
|
5
|
+
before do
|
|
6
|
+
Qa::LinkedData::AuthorityService.load_authorities
|
|
7
|
+
end
|
|
8
|
+
|
|
4
9
|
let(:full_config) { Qa::Authorities::LinkedData::Config.new(:LOD_FULL_CONFIG).search }
|
|
5
10
|
let(:min_config) { Qa::Authorities::LinkedData::Config.new(:LOD_MIN_CONFIG).search }
|
|
6
11
|
let(:term_only_config) { Qa::Authorities::LinkedData::Config.new(:LOD_TERM_ONLY_CONFIG).search }
|
|
7
12
|
let(:encoding_config) { Qa::Authorities::LinkedData::Config.new(:LOD_ENCODING_CONFIG).search }
|
|
8
13
|
|
|
14
|
+
let(:ldpath_results_config) do
|
|
15
|
+
{
|
|
16
|
+
id_ldpath: 'schema:identifier ::xsd:string',
|
|
17
|
+
label_ldpath: 'skos:prefLabel ::xsd:string',
|
|
18
|
+
altlabel_ldpath: 'skos:altLabel ::xsd:string',
|
|
19
|
+
sort_ldpath: 'skos:prefLabel ::xsd:string'
|
|
20
|
+
}
|
|
21
|
+
end
|
|
22
|
+
|
|
9
23
|
describe '#search_config' do
|
|
10
24
|
let(:full_search_config) do
|
|
11
25
|
{
|
|
12
26
|
url: {
|
|
13
27
|
:@context => 'http://www.w3.org/ns/hydra/context.jsonld',
|
|
14
28
|
:@type => 'IriTemplate',
|
|
15
|
-
template: 'http://localhost/test_default/search?{?subauth}&{?query}&{?param1}&{?param2}',
|
|
29
|
+
template: 'http://localhost/test_default/search?{?subauth}&{?query}&{?param1}&{?param2}&{?lang}',
|
|
16
30
|
variableRepresentation: 'BasicRepresentation',
|
|
17
31
|
mapping: [
|
|
18
32
|
{
|
|
@@ -41,12 +55,20 @@ RSpec.describe Qa::Authorities::LinkedData::SearchConfig do
|
|
|
41
55
|
property: 'hydra:freetextQuery',
|
|
42
56
|
required: false,
|
|
43
57
|
default: 'echo'
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
:@type => 'IriTemplateMapping',
|
|
61
|
+
variable: 'lang',
|
|
62
|
+
property: 'hydra:freetextQuery',
|
|
63
|
+
required: false,
|
|
64
|
+
default: 'fr'
|
|
44
65
|
}
|
|
45
66
|
]
|
|
46
67
|
},
|
|
47
68
|
qa_replacement_patterns: {
|
|
48
69
|
query: 'query',
|
|
49
|
-
subauth: 'subauth'
|
|
70
|
+
subauth: 'subauth',
|
|
71
|
+
lang: 'lang'
|
|
50
72
|
},
|
|
51
73
|
language: ['en', 'fr', 'de'],
|
|
52
74
|
results: {
|
|
@@ -177,6 +199,19 @@ RSpec.describe Qa::Authorities::LinkedData::SearchConfig do
|
|
|
177
199
|
end
|
|
178
200
|
end
|
|
179
201
|
|
|
202
|
+
describe '#results_id_ldpath' do
|
|
203
|
+
it 'returns nil if only term configuration is defined' do
|
|
204
|
+
expect(term_only_config.results_id_ldpath).to eq nil
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
context 'when id specified as ldpath' do
|
|
208
|
+
before { allow(full_config).to receive(:results).and_return(ldpath_results_config) }
|
|
209
|
+
it 'returns the ldpath' do
|
|
210
|
+
expect(full_config.results_id_ldpath).to eq 'schema:identifier ::xsd:string'
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
|
|
180
215
|
describe '#results_label_predicate' do
|
|
181
216
|
it 'returns nil if only term configuration is defined' do
|
|
182
217
|
expect(term_only_config.results_label_predicate).to eq nil
|
|
@@ -186,11 +221,24 @@ RSpec.describe Qa::Authorities::LinkedData::SearchConfig do
|
|
|
186
221
|
end
|
|
187
222
|
end
|
|
188
223
|
|
|
224
|
+
describe '#results_label_ldpath' do
|
|
225
|
+
it 'returns nil if only term configuration is defined' do
|
|
226
|
+
expect(term_only_config.results_label_ldpath).to eq nil
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
context 'when label specified as ldpath' do
|
|
230
|
+
before { allow(full_config).to receive(:results).and_return(ldpath_results_config) }
|
|
231
|
+
it 'returns the ldpath' do
|
|
232
|
+
expect(full_config.results_label_ldpath).to eq 'skos:prefLabel ::xsd:string'
|
|
233
|
+
end
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
|
|
189
237
|
describe '#results_altlabel_predicate' do
|
|
190
238
|
it 'returns nil if only term configuration is defined' do
|
|
191
239
|
expect(term_only_config.results_altlabel_predicate).to eq nil
|
|
192
240
|
end
|
|
193
|
-
it '
|
|
241
|
+
it 'returns nil if altlabel predicate is not defined' do
|
|
194
242
|
expect(min_config.results_altlabel_predicate).to eq nil
|
|
195
243
|
end
|
|
196
244
|
it 'returns the predicate that holds the altlabel in search results' do
|
|
@@ -198,6 +246,22 @@ RSpec.describe Qa::Authorities::LinkedData::SearchConfig do
|
|
|
198
246
|
end
|
|
199
247
|
end
|
|
200
248
|
|
|
249
|
+
describe '#results_altlabel_ldpath' do
|
|
250
|
+
it 'returns nil if only term configuration is defined' do
|
|
251
|
+
expect(term_only_config.results_altlabel_ldpath).to eq nil
|
|
252
|
+
end
|
|
253
|
+
it 'returns nil if altlabel ldpath is not defined' do
|
|
254
|
+
expect(min_config.results_altlabel_ldpath).to eq nil
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
context 'when altlabel specified as ldpath' do
|
|
258
|
+
before { allow(full_config).to receive(:results).and_return(ldpath_results_config) }
|
|
259
|
+
it 'returns the ldpath' do
|
|
260
|
+
expect(full_config.results_altlabel_ldpath).to eq 'skos:altLabel ::xsd:string'
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
end
|
|
264
|
+
|
|
201
265
|
describe '#supports_sort?' do
|
|
202
266
|
it 'returns false if only term configuration is defined' do
|
|
203
267
|
expect(term_only_config.supports_sort?).to eq false
|
|
@@ -222,6 +286,22 @@ RSpec.describe Qa::Authorities::LinkedData::SearchConfig do
|
|
|
222
286
|
end
|
|
223
287
|
end
|
|
224
288
|
|
|
289
|
+
describe '#results_sort_ldpath' do
|
|
290
|
+
it 'returns nil if only term configuration is defined' do
|
|
291
|
+
expect(term_only_config.results_sort_ldpath).to eq nil
|
|
292
|
+
end
|
|
293
|
+
it 'returns nil if sort ldpath is not defined' do
|
|
294
|
+
expect(min_config.results_sort_ldpath).to eq nil
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
context 'when sort specified as ldpath' do
|
|
298
|
+
before { allow(full_config).to receive(:results).and_return(ldpath_results_config) }
|
|
299
|
+
it 'returns the ldpath' do
|
|
300
|
+
expect(full_config.results_sort_ldpath).to eq 'skos:prefLabel ::xsd:string'
|
|
301
|
+
end
|
|
302
|
+
end
|
|
303
|
+
end
|
|
304
|
+
|
|
225
305
|
describe '#supports_context?' do
|
|
226
306
|
it 'returns false if only term configuration is defined' do
|
|
227
307
|
expect(term_only_config.supports_context?).to eq false
|
|
@@ -246,6 +326,30 @@ RSpec.describe Qa::Authorities::LinkedData::SearchConfig do
|
|
|
246
326
|
end
|
|
247
327
|
end
|
|
248
328
|
|
|
329
|
+
describe '#supports_language_parameter?' do
|
|
330
|
+
it 'returns false if only term configuration is defined' do
|
|
331
|
+
expect(term_only_config.supports_language_parameter?).to eq false
|
|
332
|
+
end
|
|
333
|
+
it 'returns false if the configuration does NOT define the lang replacement' do
|
|
334
|
+
expect(min_config.supports_language_parameter?).to eq false
|
|
335
|
+
end
|
|
336
|
+
it 'returns true if the configuration defines the lang replacement' do
|
|
337
|
+
expect(full_config.supports_language_parameter?).to eq true
|
|
338
|
+
end
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
describe '#supports_subauthorities?' do
|
|
342
|
+
it 'returns false if only term configuration is defined' do
|
|
343
|
+
expect(term_only_config.supports_subauthorities?).to eq false
|
|
344
|
+
end
|
|
345
|
+
it 'returns false if the configuration does NOT define the subauth replacement' do
|
|
346
|
+
expect(min_config.supports_subauthorities?).to eq false
|
|
347
|
+
end
|
|
348
|
+
it 'returns true if the configuration defines the subauth replacement' do
|
|
349
|
+
expect(full_config.supports_subauthorities?).to eq true
|
|
350
|
+
end
|
|
351
|
+
end
|
|
352
|
+
|
|
249
353
|
describe '#subauthorities?' do
|
|
250
354
|
it 'returns false if only term configuration is defined' do
|
|
251
355
|
expect(term_only_config.subauthorities?).to eq false
|
|
@@ -303,4 +407,51 @@ RSpec.describe Qa::Authorities::LinkedData::SearchConfig do
|
|
|
303
407
|
expect(full_config.subauthorities).to eq expected_hash
|
|
304
408
|
end
|
|
305
409
|
end
|
|
410
|
+
|
|
411
|
+
describe '#info' do
|
|
412
|
+
let(:term_details) do
|
|
413
|
+
{
|
|
414
|
+
"label" => "oclc_fast term (QA)",
|
|
415
|
+
"uri" => "urn:qa:term:oclc_fast",
|
|
416
|
+
"authority" => "oclc_fast",
|
|
417
|
+
"action" => "term",
|
|
418
|
+
"language" => ["en"]
|
|
419
|
+
}
|
|
420
|
+
end
|
|
421
|
+
|
|
422
|
+
let(:search_details) do
|
|
423
|
+
{
|
|
424
|
+
"label" => "oclc_fast search (QA)",
|
|
425
|
+
"uri" => "urn:qa:search:oclc_fast",
|
|
426
|
+
"authority" => "oclc_fast",
|
|
427
|
+
"action" => "search",
|
|
428
|
+
"language" => ["en"]
|
|
429
|
+
}
|
|
430
|
+
end
|
|
431
|
+
|
|
432
|
+
let(:search_details_with_subauth) do
|
|
433
|
+
{
|
|
434
|
+
"label" => "oclc_fast search topic (QA)",
|
|
435
|
+
"uri" => "urn:qa:search:oclc_fast:topic",
|
|
436
|
+
"authority" => "oclc_fast",
|
|
437
|
+
"subauthority" => "topic",
|
|
438
|
+
"action" => "search",
|
|
439
|
+
"language" => ["en"]
|
|
440
|
+
}
|
|
441
|
+
end
|
|
442
|
+
|
|
443
|
+
let(:details) { Qa::Authorities::LinkedData::Config.new(:OCLC_FAST).search.info }
|
|
444
|
+
|
|
445
|
+
it "does not return a list with details for term" do
|
|
446
|
+
expect(details).not_to include_hash(term_details)
|
|
447
|
+
end
|
|
448
|
+
|
|
449
|
+
it "returns a list with details for search without subauthorities" do
|
|
450
|
+
expect(details).to include_hash(search_details)
|
|
451
|
+
end
|
|
452
|
+
|
|
453
|
+
it "returns a list with details for search with a subauthority" do
|
|
454
|
+
expect(details).to include_hash(search_details_with_subauth)
|
|
455
|
+
end
|
|
456
|
+
end
|
|
306
457
|
end
|
|
@@ -1,7 +1,244 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
2
|
|
|
3
3
|
RSpec.describe Qa::Authorities::LinkedData::SearchQuery do
|
|
4
|
-
#
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
describe '#search' do
|
|
5
|
+
let(:lod_oclc) { described_class.new(search_config(:OCLC_FAST)) }
|
|
6
|
+
|
|
7
|
+
context 'performance stats' do
|
|
8
|
+
before do
|
|
9
|
+
stub_request(:get, 'http://experimental.worldcat.org/fast/search?maximumRecords=3&query=oclc.personalName%20all%20%22cornell%22&sortKeys=usage')
|
|
10
|
+
.to_return(status: 200, body: webmock_fixture('lod_oclc_personalName_query_3_results.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
|
|
11
|
+
end
|
|
12
|
+
context 'when set to true' do
|
|
13
|
+
let :results do
|
|
14
|
+
lod_oclc.search('cornell', subauth: 'personal_name', replacements: { 'maximumRecords' => '3' }, performance_data: true)
|
|
15
|
+
end
|
|
16
|
+
it 'includes performance in return hash' do
|
|
17
|
+
expect(results).to be_kind_of Hash
|
|
18
|
+
expect(results.keys).to match_array [:performance, :results]
|
|
19
|
+
expect(results[:performance].keys).to match_array [:result_count, :fetch_time_s, :normalization_time_s, :total_time_s]
|
|
20
|
+
expect(results[:performance][:total_time_s]).to eq results[:performance][:fetch_time_s] + results[:performance][:normalization_time_s]
|
|
21
|
+
expect(results[:performance][:result_count]).to eq 3
|
|
22
|
+
expect(results[:results].count).to eq 3
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
context 'when set to false' do
|
|
27
|
+
let :results do
|
|
28
|
+
lod_oclc.search('cornell', subauth: 'personal_name', replacements: { 'maximumRecords' => '3' }, performance_data: false)
|
|
29
|
+
end
|
|
30
|
+
it 'does NOT include performance in return hash' do
|
|
31
|
+
expect(results).to be_kind_of Array
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
context 'when using default setting' do
|
|
36
|
+
let :results do
|
|
37
|
+
lod_oclc.search('cornell', subauth: 'personal_name', replacements: { 'maximumRecords' => '3' })
|
|
38
|
+
end
|
|
39
|
+
it 'does NOT include performance in return hash' do
|
|
40
|
+
expect(results).to be_kind_of Array
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
context 'in OCLC_FAST authority' do
|
|
46
|
+
context '0 search results' do
|
|
47
|
+
let :results do
|
|
48
|
+
stub_request(:get, 'http://experimental.worldcat.org/fast/search?maximumRecords=3&query=cql.any%20all%20%22supercalifragilisticexpialidocious%22&sortKeys=usage')
|
|
49
|
+
.to_return(status: 200, body: webmock_fixture('lod_oclc_query_no_results.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
|
|
50
|
+
lod_oclc.search('supercalifragilisticexpialidocious', replacements: { 'maximumRecords' => '3' })
|
|
51
|
+
end
|
|
52
|
+
it 'returns an empty array' do
|
|
53
|
+
expect(results).to eq([])
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
context '3 search results' do
|
|
58
|
+
let :results do
|
|
59
|
+
stub_request(:get, 'http://experimental.worldcat.org/fast/search?maximumRecords=3&query=cql.any%20all%20%22cornell%22&sortKeys=usage')
|
|
60
|
+
.to_return(status: 200, body: webmock_fixture('lod_oclc_all_query_3_results.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
|
|
61
|
+
lod_oclc.search('cornell', replacements: { 'maximumRecords' => '3' })
|
|
62
|
+
end
|
|
63
|
+
it 'is correctly parsed' do
|
|
64
|
+
expect(results.count).to eq(3)
|
|
65
|
+
expect(results.first).to eq(uri: 'http://id.worldcat.org/fast/530369', id: '530369', label: 'Cornell University')
|
|
66
|
+
expect(results.second).to eq(uri: 'http://id.worldcat.org/fast/5140', id: '5140', label: 'Cornell, Joseph')
|
|
67
|
+
expect(results.third).to eq(uri: 'http://id.worldcat.org/fast/557490', id: '557490', label: 'New York State School of Industrial and Labor Relations')
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
context 'in OCLC_FAST authority and personal_name subauthority' do
|
|
73
|
+
context '0 search results' do
|
|
74
|
+
let :results do
|
|
75
|
+
stub_request(:get, 'http://experimental.worldcat.org/fast/search?maximumRecords=3&query=oclc.personalName%20all%20%22supercalifragilisticexpialidocious%22&sortKeys=usage')
|
|
76
|
+
.to_return(status: 200, body: webmock_fixture('lod_oclc_query_no_results.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
|
|
77
|
+
lod_oclc.search('supercalifragilisticexpialidocious', subauth: 'personal_name', replacements: { 'maximumRecords' => '3' })
|
|
78
|
+
end
|
|
79
|
+
it 'returns an empty array' do
|
|
80
|
+
expect(results).to eq([])
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
context '3 search results' do
|
|
85
|
+
let :results do
|
|
86
|
+
stub_request(:get, 'http://experimental.worldcat.org/fast/search?maximumRecords=3&query=oclc.personalName%20all%20%22cornell%22&sortKeys=usage')
|
|
87
|
+
.to_return(status: 200, body: webmock_fixture('lod_oclc_personalName_query_3_results.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
|
|
88
|
+
lod_oclc.search('cornell', subauth: 'personal_name', replacements: { 'maximumRecords' => '3' })
|
|
89
|
+
end
|
|
90
|
+
it 'is correctly parsed' do
|
|
91
|
+
expect(results.count).to eq(3)
|
|
92
|
+
expect(results.first).to eq(uri: 'http://id.worldcat.org/fast/409667', id: '409667', label: 'Cornell, Ezra, 1807-1874')
|
|
93
|
+
expect(results.second).to eq(uri: 'http://id.worldcat.org/fast/5140', id: '5140', label: 'Cornell, Joseph')
|
|
94
|
+
expect(results.third).to eq(uri: 'http://id.worldcat.org/fast/72456', id: '72456', label: 'Cornell, Sarah Maria, 1802-1832')
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
context 'when id predicate is not specified' do
|
|
100
|
+
let(:min_authority) { described_class.new(search_config(:LOD_MIN_CONFIG)) }
|
|
101
|
+
let :results do
|
|
102
|
+
stub_request(:get, 'http://localhost/test_default/search?query=peanuts')
|
|
103
|
+
.to_return(status: 200, body: webmock_fixture('lod_oclc_personalName_query_3_results.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
|
|
104
|
+
min_authority.search('peanuts')
|
|
105
|
+
end
|
|
106
|
+
it 'uses subject uri for id' do
|
|
107
|
+
expect(results.count).to eq(3)
|
|
108
|
+
expect(results.first).to eq(uri: 'http://id.worldcat.org/fast/409667', id: 'http://id.worldcat.org/fast/409667', label: 'Cornell, Ezra, 1807-1874')
|
|
109
|
+
expect(results.second).to eq(uri: 'http://id.worldcat.org/fast/5140', id: 'http://id.worldcat.org/fast/5140', label: 'Cornell, Joseph')
|
|
110
|
+
expect(results.third).to eq(uri: 'http://id.worldcat.org/fast/72456', id: 'http://id.worldcat.org/fast/72456', label: 'Cornell, Sarah Maria, 1802-1832')
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# context 'in LOC authority' do
|
|
115
|
+
# ###################################
|
|
116
|
+
# ### SEARCH NOT SUPPORTED BY LOC ###
|
|
117
|
+
# ###################################
|
|
118
|
+
# # let(:lod_loc) { described_class.new(search_config(:LOC)) }
|
|
119
|
+
# end
|
|
120
|
+
|
|
121
|
+
# rubocop:disable RSpec/NestedGroups
|
|
122
|
+
describe "language processing" do
|
|
123
|
+
context "when filtering #search results" do
|
|
124
|
+
context "and lang NOT passed in" do
|
|
125
|
+
context "and NO language defined in authority config" do
|
|
126
|
+
context "and NO language defined in Qa config" do
|
|
127
|
+
let(:lod_lang_no_defaults) { described_class.new(search_config(:LOD_LANG_NO_DEFAULTS)) }
|
|
128
|
+
let :results do
|
|
129
|
+
stub_request(:get, "http://localhost/test_no_default/search?query=milk")
|
|
130
|
+
.to_return(status: 200, body: webmock_fixture("lod_lang_search_enfr.rdf.xml"), headers: { 'Content-Type' => 'application/rdf+xml' })
|
|
131
|
+
lod_lang_no_defaults.search('milk')
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
before do
|
|
135
|
+
Qa.config.default_language = []
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
after do
|
|
139
|
+
Qa.config.default_language = :en
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
it "is not filtered" do
|
|
143
|
+
expect(results.first[:label]).to eq('[buttermilk, Babeurre] (yummy, délicieux)')
|
|
144
|
+
expect(results.second[:label]).to eq('[condensed milk, lait condensé] (creamy, crémeux)')
|
|
145
|
+
expect(results.third[:label]).to eq('[dried milk, lait en poudre] (powdery, poudreux)')
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
context "and default_language is defined in Qa config" do
|
|
150
|
+
let(:lod_lang_no_defaults) { described_class.new(search_config(:LOD_LANG_NO_DEFAULTS)) }
|
|
151
|
+
let :results do
|
|
152
|
+
stub_request(:get, "http://localhost/test_no_default/search?query=milk")
|
|
153
|
+
.to_return(status: 200, body: webmock_fixture("lod_lang_search_enfr.rdf.xml"), headers: { 'Content-Type' => 'application/rdf+xml' })
|
|
154
|
+
lod_lang_no_defaults.search('milk')
|
|
155
|
+
end
|
|
156
|
+
it "filters using Qa configured default" do
|
|
157
|
+
expect(results.first[:label]).to eq('buttermilk (yummy)')
|
|
158
|
+
expect(results.second[:label]).to eq('condensed milk (creamy)')
|
|
159
|
+
expect(results.third[:label]).to eq('dried milk (powdery)')
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
context "and language IS defined in authority config" do
|
|
165
|
+
let(:lod_lang_defaults) { described_class.new(search_config(:LOD_LANG_DEFAULTS)) }
|
|
166
|
+
let :results do
|
|
167
|
+
stub_request(:get, "http://localhost/test_default/search?query=milk")
|
|
168
|
+
.to_return(status: 200, body: webmock_fixture("lod_lang_search_enfr.rdf.xml"), headers: { 'Content-Type' => 'application/rdf+xml' })
|
|
169
|
+
lod_lang_defaults.search('milk')
|
|
170
|
+
end
|
|
171
|
+
it "is filtered to authority defined language" do
|
|
172
|
+
expect(results.first[:label]).to eq('Babeurre (délicieux)')
|
|
173
|
+
expect(results.second[:label]).to eq('lait condensé (crémeux)')
|
|
174
|
+
expect(results.third[:label]).to eq('lait en poudre (poudreux)')
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
context "and multiple languages ARE defined in authority config" do
|
|
180
|
+
let(:lod_lang_multi_defaults) { described_class.new(search_config(:LOD_LANG_MULTI_DEFAULTS)) }
|
|
181
|
+
let :results do
|
|
182
|
+
stub_request(:get, "http://localhost/test_default/search?query=milk")
|
|
183
|
+
.to_return(status: 200, body: webmock_fixture("lod_lang_search_enfrde.rdf.xml"), headers: { 'Content-Type' => 'application/rdf+xml' })
|
|
184
|
+
lod_lang_multi_defaults.search('milk')
|
|
185
|
+
end
|
|
186
|
+
it "is filtered to authority defined languages" do
|
|
187
|
+
expect(results.first[:label]).to eq('[buttermilk, Babeurre] (yummy, délicieux)')
|
|
188
|
+
expect(results.second[:label]).to eq('[condensed milk, lait condensé] (creamy, crémeux)')
|
|
189
|
+
expect(results.third[:label]).to eq('[dried milk, lait en poudre] (powdery, poudreux)')
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
context "and language IS passed in to search" do
|
|
194
|
+
let(:lod_lang_defaults) { described_class.new(search_config(:LOD_LANG_DEFAULTS)) }
|
|
195
|
+
let :results do
|
|
196
|
+
stub_request(:get, "http://localhost/test_default/search?query=milk")
|
|
197
|
+
.to_return(status: 200, body: webmock_fixture("lod_lang_search_enfr.rdf.xml"), headers: { 'Content-Type' => 'application/rdf+xml' })
|
|
198
|
+
lod_lang_defaults.search('milk', language: :fr)
|
|
199
|
+
end
|
|
200
|
+
it "is filtered to specified language" do
|
|
201
|
+
expect(results.first[:label]).to eq('Babeurre (délicieux)')
|
|
202
|
+
expect(results.second[:label]).to eq('lait condensé (crémeux)')
|
|
203
|
+
expect(results.third[:label]).to eq('lait en poudre (poudreux)')
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
context "when replacement on authority search URL" do
|
|
208
|
+
context "and using default" do
|
|
209
|
+
let(:lod_lang_param) { described_class.new(search_config(:LOD_LANG_PARAM)) }
|
|
210
|
+
let :results do
|
|
211
|
+
stub_request(:get, "http://localhost/test_replacement/search?lang=en&query=milk")
|
|
212
|
+
.to_return(status: 200, body: webmock_fixture("lod_lang_search_en.rdf.xml"), headers: { 'Content-Type' => 'application/rdf+xml' })
|
|
213
|
+
lod_lang_param.search("milk")
|
|
214
|
+
end
|
|
215
|
+
it "is correctly parsed" do
|
|
216
|
+
expect(results.first[:label]).to eq('buttermilk (yummy)')
|
|
217
|
+
expect(results.second[:label]).to eq('condensed milk (creamy)')
|
|
218
|
+
expect(results.third[:label]).to eq('dried milk (powdery)')
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
context "and lang specified" do
|
|
223
|
+
let(:lod_lang_param) { described_class.new(search_config(:LOD_LANG_PARAM)) }
|
|
224
|
+
let :results do
|
|
225
|
+
stub_request(:get, "http://localhost/test_replacement/search?query=milk&lang=fr")
|
|
226
|
+
.to_return(status: 200, body: webmock_fixture("lod_lang_search_fr.rdf.xml"), headers: { 'Content-Type' => 'application/rdf+xml' })
|
|
227
|
+
lod_lang_param.search("milk", replacements: { 'lang' => 'fr' })
|
|
228
|
+
end
|
|
229
|
+
it "is correctly parsed" do
|
|
230
|
+
expect(results.first[:label]).to eq('Babeurre (délicieux)')
|
|
231
|
+
expect(results.second[:label]).to eq('lait condensé (crémeux)')
|
|
232
|
+
expect(results.third[:label]).to eq('lait en poudre (poudreux)')
|
|
233
|
+
end
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
# rubocop:enable RSpec/NestedGroups
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
def search_config(authority_name)
|
|
242
|
+
Qa::Authorities::LinkedData::Config.new(authority_name).search
|
|
243
|
+
end
|
|
7
244
|
end
|