qa 4.2.0 → 4.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/app/controllers/qa/linked_data_terms_controller.rb +17 -39
- data/app/controllers/qa/terms_controller.rb +26 -2
- data/app/services/qa/linked_data/authority_url_service.rb +35 -21
- data/app/services/qa/linked_data/graph_service.rb +2 -4
- data/app/services/qa/linked_data/request_header_service.rb +97 -0
- data/lib/qa/authorities/discogs/discogs_instance_builder.rb +17 -19
- data/lib/qa/authorities/discogs/discogs_translation.rb +26 -22
- data/lib/qa/authorities/discogs/discogs_utils.rb +32 -20
- data/lib/qa/authorities/discogs/discogs_works_builder.rb +26 -47
- data/lib/qa/authorities/discogs/generic_authority.rb +64 -33
- data/lib/qa/authorities/getty/tgn.rb +1 -1
- data/lib/qa/authorities/linked_data/find_term.rb +60 -18
- data/lib/qa/authorities/linked_data/search_query.rb +43 -15
- data/lib/qa/authorities/loc/generic_authority.rb +2 -2
- data/lib/qa/version.rb +1 -1
- data/spec/controllers/linked_data_terms_controller_spec.rb +36 -0
- data/spec/controllers/terms_controller_spec.rb +26 -2
- data/spec/fixtures/discogs-find-response-json.json +1 -1
- data/spec/lib/authorities/discogs/generic_authority_spec.rb +103 -9
- data/spec/lib/authorities/getty/tgn_spec.rb +2 -2
- data/spec/lib/authorities/linked_data/find_term_spec.rb +11 -11
- data/spec/lib/authorities/linked_data/search_query_spec.rb +9 -9
- data/spec/lib/authorities/loc_spec.rb +9 -9
- data/spec/services/linked_data/authority_url_service_spec.rb +14 -8
- data/spec/services/linked_data/graph_service_spec.rb +2 -1
- data/spec/services/linked_data/request_header_service_spec.rb +124 -0
- metadata +9 -7
@@ -82,13 +82,13 @@ describe Qa::Authorities::Getty::TGN do
|
|
82
82
|
context "using a single subject term" do
|
83
83
|
subject { authority.sparql('search_term') }
|
84
84
|
it {
|
85
|
-
is_expected.to eq %(SELECT DISTINCT ?s ?name ?par { ?s a skos:Concept; luc:term "search_term"; skos:inScheme <http://vocab.getty.edu/
|
85
|
+
is_expected.to eq %(SELECT DISTINCT ?s ?name ?par { ?s a skos:Concept; luc:term "search_term"; skos:inScheme <http://vocab.getty.edu/tgn/> ; gvp:prefLabelGVP [skosxl:literalForm ?name] ; gvp:parentString ?par . FILTER regex(?name, "search_term", "i") . } ORDER BY ?name ASC(?par))
|
86
86
|
}
|
87
87
|
end
|
88
88
|
context "using a two subject terms" do
|
89
89
|
subject { authority.sparql('search term') }
|
90
90
|
it {
|
91
|
-
is_expected.to eq %(SELECT DISTINCT ?s ?name ?par { ?s a skos:Concept; luc:term "search term"; skos:inScheme <http://vocab.getty.edu/
|
91
|
+
is_expected.to eq %(SELECT DISTINCT ?s ?name ?par { ?s a skos:Concept; luc:term "search term"; skos:inScheme <http://vocab.getty.edu/tgn/> ; 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))
|
92
92
|
}
|
93
93
|
end
|
94
94
|
end
|
@@ -24,7 +24,7 @@ RSpec.describe Qa::Authorities::LinkedData::FindTerm do
|
|
24
24
|
end
|
25
25
|
context 'when set to true' do
|
26
26
|
let :results do
|
27
|
-
lod_oclc.find('530369', performance_data: true)
|
27
|
+
lod_oclc.find('530369', request_header: { performance_data: true })
|
28
28
|
end
|
29
29
|
it 'includes performance in return hash' do
|
30
30
|
expect(results.keys).to match_array [:performance, :results]
|
@@ -38,7 +38,7 @@ RSpec.describe Qa::Authorities::LinkedData::FindTerm do
|
|
38
38
|
|
39
39
|
context 'when set to false' do
|
40
40
|
let :results do
|
41
|
-
lod_oclc.find('530369', performance_data: false)
|
41
|
+
lod_oclc.find('530369', request_header: { performance_data: false })
|
42
42
|
end
|
43
43
|
it 'does NOT include performance in return hash' do
|
44
44
|
expect(results.keys).not_to include(:performance)
|
@@ -114,7 +114,7 @@ RSpec.describe Qa::Authorities::LinkedData::FindTerm do
|
|
114
114
|
.to_return(status: 200, body: webmock_fixture('lod_loc_term_found.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
|
115
115
|
end
|
116
116
|
|
117
|
-
let(:results) { lod_loc.find('sh 85118553',
|
117
|
+
let(:results) { lod_loc.find('sh 85118553', request_header: { subauthority: 'subjects' }) }
|
118
118
|
|
119
119
|
it 'has correct primary predicate values' do
|
120
120
|
expect(results[:uri]).to eq 'http://id.loc.gov/authorities/subjects/sh85118553'
|
@@ -182,8 +182,8 @@ RSpec.describe Qa::Authorities::LinkedData::FindTerm do
|
|
182
182
|
.to_return(status: 200, body: webmock_fixture('lod_loc_second_term_found.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
|
183
183
|
end
|
184
184
|
|
185
|
-
let(:results) { lod_loc.find('sh 85118553',
|
186
|
-
let(:second_results) { lod_loc.find('sh 1234',
|
185
|
+
let(:results) { lod_loc.find('sh 85118553', request_header: { subauthority: 'subjects' }) }
|
186
|
+
let(:second_results) { lod_loc.find('sh 1234', request_header: { subauthority: 'subjects' }) }
|
187
187
|
|
188
188
|
it 'has correct primary predicate values for second request' do
|
189
189
|
expect(results[:uri]).to eq 'http://id.loc.gov/authorities/subjects/sh85118553'
|
@@ -201,7 +201,7 @@ RSpec.describe Qa::Authorities::LinkedData::FindTerm do
|
|
201
201
|
.to_return(status: 200, body: webmock_fixture('lod_loc_term_found.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
|
202
202
|
end
|
203
203
|
|
204
|
-
let(:results_without_blank) { lod_loc.find('sh85118553',
|
204
|
+
let(:results_without_blank) { lod_loc.find('sh85118553', request_header: { subauthority: 'subjects' }) }
|
205
205
|
|
206
206
|
it 'extracts correct uri' do
|
207
207
|
expect(results_without_blank[:uri]).to eq 'http://id.loc.gov/authorities/subjects/sh85118553'
|
@@ -215,7 +215,7 @@ RSpec.describe Qa::Authorities::LinkedData::FindTerm do
|
|
215
215
|
end
|
216
216
|
|
217
217
|
it 'raises DataNormalizationError' do
|
218
|
-
expect { lod_loc.find('sh85118553',
|
218
|
+
expect { lod_loc.find('sh85118553', request_header: { subauthority: 'subjects' }) }.to raise_error Qa::DataNormalizationError, "Unable to extract URI based on ID: sh85118553"
|
219
219
|
end
|
220
220
|
end
|
221
221
|
|
@@ -226,7 +226,7 @@ RSpec.describe Qa::Authorities::LinkedData::FindTerm do
|
|
226
226
|
allow(lod_loc.term_config).to receive(:authority_name).and_return('ALT_LOC_AUTHORITY')
|
227
227
|
end
|
228
228
|
|
229
|
-
let(:results) { lod_loc.find('sh 85118553',
|
229
|
+
let(:results) { lod_loc.find('sh 85118553', request_header: { subauthority: 'subjects' }) }
|
230
230
|
|
231
231
|
it 'does special processing to remove blank from id' do
|
232
232
|
expect(results[:uri]).to eq 'http://id.loc.gov/authorities/subjects/sh85118553'
|
@@ -313,7 +313,7 @@ RSpec.describe Qa::Authorities::LinkedData::FindTerm do
|
|
313
313
|
let :results do
|
314
314
|
stub_request(:get, "http://aims.fao.org/aos/agrovoc/c_9513")
|
315
315
|
.to_return(status: 200, body: webmock_fixture("lod_lang_term_enfr.rdf.xml"), headers: { 'Content-Type' => 'application/rdf+xml' })
|
316
|
-
lod_lang_defaults.find('http://aims.fao.org/aos/agrovoc/c_9513', language: 'fr')
|
316
|
+
lod_lang_defaults.find('http://aims.fao.org/aos/agrovoc/c_9513', request_header: { language: 'fr' })
|
317
317
|
end
|
318
318
|
it "is filtered to specified language" do
|
319
319
|
expect(results[:label]).to eq ['Babeurre']
|
@@ -328,7 +328,7 @@ RSpec.describe Qa::Authorities::LinkedData::FindTerm do
|
|
328
328
|
let :results do
|
329
329
|
stub_request(:get, "http://aims.fao.org/aos/agrovoc/c_9513")
|
330
330
|
.to_return(status: 200, body: webmock_fixture("lod_lang_term_enfr_noalt.rdf.xml"), headers: { 'Content-Type' => 'application/rdf+xml' })
|
331
|
-
lod_lang_defaults.find('http://aims.fao.org/aos/agrovoc/c_9513', language: 'fr')
|
331
|
+
lod_lang_defaults.find('http://aims.fao.org/aos/agrovoc/c_9513', request_header: { language: 'fr' })
|
332
332
|
end
|
333
333
|
it "is filtered to specified language" do
|
334
334
|
expect(results[:label]).to eq ['Babeurre']
|
@@ -357,7 +357,7 @@ RSpec.describe Qa::Authorities::LinkedData::FindTerm do
|
|
357
357
|
let :results do
|
358
358
|
stub_request(:get, "http://aims.fao.org/aos/agrovoc/c_9513?lang=fr")
|
359
359
|
.to_return(status: 200, body: webmock_fixture("lod_lang_term_fr.rdf.xml"), headers: { 'Content-Type' => 'application/rdf+xml' })
|
360
|
-
lod_lang_param.find('http://aims.fao.org/aos/agrovoc/c_9513', replacements: { 'lang' => 'fr' })
|
360
|
+
lod_lang_param.find('http://aims.fao.org/aos/agrovoc/c_9513', request_header: { replacements: { 'lang' => 'fr' } })
|
361
361
|
end
|
362
362
|
it "is correctly parsed" do
|
363
363
|
expect(results[:label]).to eq ['Babeurre']
|
@@ -11,7 +11,7 @@ RSpec.describe Qa::Authorities::LinkedData::SearchQuery do
|
|
11
11
|
end
|
12
12
|
context 'when set to true' do
|
13
13
|
let :results do
|
14
|
-
lod_oclc.search('cornell',
|
14
|
+
lod_oclc.search('cornell', request_header: { subauthority: 'personal_name', replacements: { 'maximumRecords' => '3' }, performance_data: true })
|
15
15
|
end
|
16
16
|
it 'includes performance in return hash' do
|
17
17
|
expect(results).to be_kind_of Hash
|
@@ -27,7 +27,7 @@ RSpec.describe Qa::Authorities::LinkedData::SearchQuery do
|
|
27
27
|
|
28
28
|
context 'when set to false' do
|
29
29
|
let :results do
|
30
|
-
lod_oclc.search('cornell',
|
30
|
+
lod_oclc.search('cornell', request_header: { subauthority: 'personal_name', replacements: { 'maximumRecords' => '3' }, performance_data: false })
|
31
31
|
end
|
32
32
|
it 'does NOT include performance in return hash' do
|
33
33
|
expect(results).to be_kind_of Array
|
@@ -36,7 +36,7 @@ RSpec.describe Qa::Authorities::LinkedData::SearchQuery do
|
|
36
36
|
|
37
37
|
context 'when using default setting' do
|
38
38
|
let :results do
|
39
|
-
lod_oclc.search('cornell',
|
39
|
+
lod_oclc.search('cornell', request_header: { subauthority: 'personal_name', replacements: { 'maximumRecords' => '3' } })
|
40
40
|
end
|
41
41
|
it 'does NOT include performance in return hash' do
|
42
42
|
expect(results).to be_kind_of Array
|
@@ -49,7 +49,7 @@ RSpec.describe Qa::Authorities::LinkedData::SearchQuery do
|
|
49
49
|
let :results do
|
50
50
|
stub_request(:get, 'http://experimental.worldcat.org/fast/search?maximumRecords=3&query=cql.any%20all%20%22supercalifragilisticexpialidocious%22&sortKeys=usage')
|
51
51
|
.to_return(status: 200, body: webmock_fixture('lod_oclc_query_no_results.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
|
52
|
-
lod_oclc.search('supercalifragilisticexpialidocious', replacements: { 'maximumRecords' => '3' })
|
52
|
+
lod_oclc.search('supercalifragilisticexpialidocious', request_header: { replacements: { 'maximumRecords' => '3' } })
|
53
53
|
end
|
54
54
|
it 'returns an empty array' do
|
55
55
|
expect(results).to eq([])
|
@@ -60,7 +60,7 @@ RSpec.describe Qa::Authorities::LinkedData::SearchQuery do
|
|
60
60
|
let :results do
|
61
61
|
stub_request(:get, 'http://experimental.worldcat.org/fast/search?maximumRecords=3&query=cql.any%20all%20%22cornell%22&sortKeys=usage')
|
62
62
|
.to_return(status: 200, body: webmock_fixture('lod_oclc_all_query_3_results.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
|
63
|
-
lod_oclc.search('cornell', replacements: { 'maximumRecords' => '3' })
|
63
|
+
lod_oclc.search('cornell', request_header: { replacements: { 'maximumRecords' => '3' } })
|
64
64
|
end
|
65
65
|
it 'is correctly parsed' do
|
66
66
|
expect(results.count).to eq(3)
|
@@ -76,7 +76,7 @@ RSpec.describe Qa::Authorities::LinkedData::SearchQuery do
|
|
76
76
|
let :results do
|
77
77
|
stub_request(:get, 'http://experimental.worldcat.org/fast/search?maximumRecords=3&query=oclc.personalName%20all%20%22supercalifragilisticexpialidocious%22&sortKeys=usage')
|
78
78
|
.to_return(status: 200, body: webmock_fixture('lod_oclc_query_no_results.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
|
79
|
-
lod_oclc.search('supercalifragilisticexpialidocious',
|
79
|
+
lod_oclc.search('supercalifragilisticexpialidocious', request_header: { subauthority: 'personal_name', replacements: { 'maximumRecords' => '3' } })
|
80
80
|
end
|
81
81
|
it 'returns an empty array' do
|
82
82
|
expect(results).to eq([])
|
@@ -87,7 +87,7 @@ RSpec.describe Qa::Authorities::LinkedData::SearchQuery do
|
|
87
87
|
let :results do
|
88
88
|
stub_request(:get, 'http://experimental.worldcat.org/fast/search?maximumRecords=3&query=oclc.personalName%20all%20%22cornell%22&sortKeys=usage')
|
89
89
|
.to_return(status: 200, body: webmock_fixture('lod_oclc_personalName_query_3_results.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
|
90
|
-
lod_oclc.search('cornell',
|
90
|
+
lod_oclc.search('cornell', request_header: { subauthority: 'personal_name', replacements: { 'maximumRecords' => '3' } })
|
91
91
|
end
|
92
92
|
it 'is correctly parsed' do
|
93
93
|
expect(results.count).to eq(3)
|
@@ -197,7 +197,7 @@ RSpec.describe Qa::Authorities::LinkedData::SearchQuery do
|
|
197
197
|
let :results do
|
198
198
|
stub_request(:get, "http://localhost/test_default/search?query=milk")
|
199
199
|
.to_return(status: 200, body: webmock_fixture("lod_lang_search_enfr.rdf.xml"), headers: { 'Content-Type' => 'application/rdf+xml' })
|
200
|
-
lod_lang_defaults.search('milk', language: :fr)
|
200
|
+
lod_lang_defaults.search('milk', request_header: { language: :fr })
|
201
201
|
end
|
202
202
|
it "is filtered to specified language" do
|
203
203
|
expect(results.first[:label]).to eq('Babeurre (délicieux)')
|
@@ -226,7 +226,7 @@ RSpec.describe Qa::Authorities::LinkedData::SearchQuery do
|
|
226
226
|
let :results do
|
227
227
|
stub_request(:get, "http://localhost/test_replacement/search?query=milk&lang=fr")
|
228
228
|
.to_return(status: 200, body: webmock_fixture("lod_lang_search_fr.rdf.xml"), headers: { 'Content-Type' => 'application/rdf+xml' })
|
229
|
-
lod_lang_param.search("milk", replacements: { 'lang' => 'fr' })
|
229
|
+
lod_lang_param.search("milk", request_header: { replacements: { 'lang' => 'fr' } })
|
230
230
|
end
|
231
231
|
it "is correctly parsed" do
|
232
232
|
expect(results.first[:label]).to eq('Babeurre (délicieux)')
|
@@ -28,14 +28,14 @@ describe Qa::Authorities::Loc do
|
|
28
28
|
end
|
29
29
|
|
30
30
|
context "for searching" do
|
31
|
-
let(:url) { '
|
31
|
+
let(:url) { 'https://id.loc.gov/search/?q=foo&q=cs%3Ahttp%3A%2F%2Fid.loc.gov%2Fauthorities%2Fsubjects&format=json' }
|
32
32
|
it "returns a url" do
|
33
33
|
expect(authority.build_query_url("foo")).to eq(url)
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
37
|
context "for returning single terms" do
|
38
|
-
let(:url) { "
|
38
|
+
let(:url) { "https://id.loc.gov/authorities/subjects/sh2002003586.json" }
|
39
39
|
it "returns a url with an authority and id" do
|
40
40
|
expect(authority.find_url("sh2002003586")).to eq(url)
|
41
41
|
end
|
@@ -49,15 +49,15 @@ describe Qa::Authorities::Loc do
|
|
49
49
|
end
|
50
50
|
|
51
51
|
before do
|
52
|
-
stub_request(:get, "
|
52
|
+
stub_request(:get, "https://id.loc.gov/search/?format=json&q=cs:http://id.loc.gov/authorities/subjects")
|
53
53
|
.with(headers: { 'Accept' => 'application/json' })
|
54
54
|
.to_return(status: 200, body: "")
|
55
55
|
end
|
56
56
|
|
57
57
|
context "with flat params encoded" do
|
58
|
-
let(:url) { '
|
58
|
+
let(:url) { 'https://id.loc.gov/search/?q=foo&q=cs%3Ahttp%3A%2F%2Fid.loc.gov%2Fauthorities%2Fsubjects&format=json' }
|
59
59
|
it "returns a response" do
|
60
|
-
flat_params_url = "
|
60
|
+
flat_params_url = "https://id.loc.gov/search/?format=json&q=foo&q=cs%3Ahttp%3A%2F%2Fid.loc.gov%2Fauthorities%2Fsubjects"
|
61
61
|
expect(subject.env.url.to_s).to eq(flat_params_url)
|
62
62
|
end
|
63
63
|
end
|
@@ -66,7 +66,7 @@ describe Qa::Authorities::Loc do
|
|
66
66
|
describe "#search" do
|
67
67
|
context "any LOC authorities" do
|
68
68
|
let :authority do
|
69
|
-
stub_request(:get, "
|
69
|
+
stub_request(:get, "https://id.loc.gov/search/?format=json&q=s&q=cs:http://id.loc.gov/vocabulary/geographicAreas")
|
70
70
|
.with(headers: { 'Accept' => 'application/json' })
|
71
71
|
.to_return(body: webmock_fixture("loc-response.txt"), status: 200)
|
72
72
|
described_class.subauthority_for("geographicAreas")
|
@@ -95,7 +95,7 @@ describe Qa::Authorities::Loc do
|
|
95
95
|
|
96
96
|
context "subject terms" do
|
97
97
|
let :results do
|
98
|
-
stub_request(:get, "
|
98
|
+
stub_request(:get, "https://id.loc.gov/search/?format=json&q=History--&q=cs:http://id.loc.gov/authorities/subjects")
|
99
99
|
.with(headers: { 'Accept' => 'application/json' })
|
100
100
|
.to_return(body: webmock_fixture("loc-subjects-response.txt"), status: 200)
|
101
101
|
described_class.subauthority_for("subjects").search("History--")
|
@@ -111,7 +111,7 @@ describe Qa::Authorities::Loc do
|
|
111
111
|
|
112
112
|
context "name terms" do
|
113
113
|
let :results do
|
114
|
-
stub_request(:get, "
|
114
|
+
stub_request(:get, "https://id.loc.gov/search/?format=json&q=Berry&q=cs:http://id.loc.gov/authorities/names")
|
115
115
|
.with(headers: { 'Accept' => 'application/json' })
|
116
116
|
.to_return(body: webmock_fixture("loc-names-response.txt"), status: 200)
|
117
117
|
described_class.subauthority_for("names").search("Berry")
|
@@ -125,7 +125,7 @@ describe Qa::Authorities::Loc do
|
|
125
125
|
describe "#find" do
|
126
126
|
context "using a subject id" do
|
127
127
|
let :results do
|
128
|
-
stub_request(:get, "
|
128
|
+
stub_request(:get, "https://id.loc.gov/authorities/subjects/sh2002003586.json")
|
129
129
|
.with(headers: { 'Accept' => 'application/json' })
|
130
130
|
.to_return(status: 200, body: webmock_fixture("loc-subject-find-response.txt"), headers: {})
|
131
131
|
described_class.subauthority_for("subjects").find("sh2002003586")
|
@@ -14,13 +14,19 @@ RSpec.describe Qa::LinkedData::AuthorityUrlService do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
describe '.build_url' do
|
17
|
+
let(:request_header) do
|
18
|
+
{
|
19
|
+
subauthority: subauthority,
|
20
|
+
replacements: substitutions
|
21
|
+
}
|
22
|
+
end
|
17
23
|
context 'when authority is not registered' do
|
18
24
|
let(:authority) { :BAD_AUTHORITY }
|
19
25
|
|
20
26
|
it 'raises error' do
|
21
27
|
expected_error = Qa::InvalidLinkedDataAuthority
|
22
28
|
expected_error_message = "Unable to initialize linked data authority 'BAD_AUTHORITY'"
|
23
|
-
expect { described_class.build_url(action_config: action_config,
|
29
|
+
expect { described_class.build_url(action_config: action_config, action: action, action_request: action_request, request_header: request_header) }
|
24
30
|
.to raise_error(expected_error, expected_error_message)
|
25
31
|
end
|
26
32
|
end
|
@@ -33,7 +39,7 @@ RSpec.describe Qa::LinkedData::AuthorityUrlService do
|
|
33
39
|
skip "Pending better handling of unsupported subauthorities"
|
34
40
|
expected_error = Qa::InvalidLinkedDataAuthority
|
35
41
|
expected_error_message = "Unable to initialize linked data sub-authority BAD_SUBAUTHORITY"
|
36
|
-
expect { described_class.build_url(action_config: action_config,
|
42
|
+
expect { described_class.build_url(action_config: action_config, action: action, action_request: action_request, request_header: request_header) }
|
37
43
|
.to raise_error(expected_error, expected_error_message)
|
38
44
|
end
|
39
45
|
end
|
@@ -44,7 +50,7 @@ RSpec.describe Qa::LinkedData::AuthorityUrlService do
|
|
44
50
|
it 'raises error' do
|
45
51
|
expected_error = Qa::UnsupportedAction
|
46
52
|
expected_error_message = "BAD_ACTION Not Supported - Action must be one of the supported actions (e.g. :term, :search)"
|
47
|
-
expect { described_class.build_url(action_config: action_config,
|
53
|
+
expect { described_class.build_url(action_config: action_config, action: action, action_request: action_request, request_header: request_header) }
|
48
54
|
.to raise_error(expected_error, expected_error_message)
|
49
55
|
end
|
50
56
|
end
|
@@ -55,16 +61,16 @@ RSpec.describe Qa::LinkedData::AuthorityUrlService do
|
|
55
61
|
it 'raises error' do
|
56
62
|
expected_error = Qa::IriTemplate::MissingParameter
|
57
63
|
expected_error_message = "query is required, but missing"
|
58
|
-
expect { described_class.build_url(action_config: action_config,
|
64
|
+
expect { described_class.build_url(action_config: action_config, action: action, action_request: action_request, request_header: request_header) }
|
59
65
|
.to raise_error(expected_error, expected_error_message)
|
60
66
|
end
|
61
67
|
end
|
62
68
|
|
63
|
-
subject do
|
64
|
-
described_class.build_url(action_config: action_config, subauthority: subauthority, action: action, action_request: action_request, substitutions: substitutions)
|
65
|
-
end
|
66
|
-
|
67
69
|
context 'when no errors' do
|
70
|
+
subject do
|
71
|
+
described_class.build_url(action_config: action_config, action: action, action_request: action_request, request_header: request_header)
|
72
|
+
end
|
73
|
+
|
68
74
|
context 'and performing search action' do
|
69
75
|
context 'and all substitutions specified' do
|
70
76
|
let(:substitutions) do
|
@@ -66,6 +66,7 @@ RSpec.describe Qa::LinkedData::GraphService do
|
|
66
66
|
subject { described_class.load_graph(url: url) }
|
67
67
|
|
68
68
|
let(:url) { 'http://experimental.worldcat.org/fast/search?maximumRecords=3&query=cql.any%20all%20%22cornell%22&sortKeys=usage' }
|
69
|
+
let(:regurl) { 'http:\/\/experimental.worldcat.org\/fast\/search\?maximumRecords=3&query=cql.any%20all%20%22cornell%22&sortKeys=usage' }
|
69
70
|
let(:uri) { URI(url) }
|
70
71
|
|
71
72
|
before do
|
@@ -74,7 +75,7 @@ RSpec.describe Qa::LinkedData::GraphService do
|
|
74
75
|
end
|
75
76
|
|
76
77
|
it 'raises error' do
|
77
|
-
expect { subject }.to raise_error(Qa::ServiceError,
|
78
|
+
expect { subject }.to raise_error(Qa::ServiceError, /Unknown error for #{uri.hostname} on port #{uri.port}. Try again later. \(Cause - <#{regurl}>: \(?504\)?\)/)
|
78
79
|
end
|
79
80
|
end
|
80
81
|
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Qa::LinkedData::RequestHeaderService do
|
4
|
+
let(:request) { double }
|
5
|
+
|
6
|
+
describe '#search_header' do
|
7
|
+
context 'when optional params are defined' do
|
8
|
+
let(:search_params) do
|
9
|
+
{
|
10
|
+
'subauthority' => 'person',
|
11
|
+
'lang' => 'sp',
|
12
|
+
'maxRecords' => '4',
|
13
|
+
'context' => 'true',
|
14
|
+
'performance_data' => 'true'
|
15
|
+
}.with_indifferent_access
|
16
|
+
end
|
17
|
+
before { allow(request).to receive(:env).and_return('HTTP_ACCEPT_LANGUAGE' => 'de') }
|
18
|
+
|
19
|
+
it 'uses passed in params' do
|
20
|
+
expected_results =
|
21
|
+
{
|
22
|
+
context: true,
|
23
|
+
performance_data: true,
|
24
|
+
replacements: { 'maxRecords' => '4' },
|
25
|
+
subauthority: 'person',
|
26
|
+
user_language: ['sp']
|
27
|
+
}
|
28
|
+
expect(described_class.new(request, search_params).search_header).to eq expected_results
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'when none of the optional params are defined' do
|
33
|
+
context 'and request does not define language' do
|
34
|
+
before { allow(request).to receive(:env).and_return('HTTP_ACCEPT_LANGUAGE' => nil) }
|
35
|
+
it 'returns defaults' do
|
36
|
+
expected_results =
|
37
|
+
{
|
38
|
+
context: false,
|
39
|
+
performance_data: false,
|
40
|
+
replacements: {},
|
41
|
+
subauthority: nil,
|
42
|
+
user_language: nil
|
43
|
+
}
|
44
|
+
expect(described_class.new(request, {}).search_header).to eq expected_results
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context 'and request does define language' do
|
49
|
+
before { allow(request).to receive(:env).and_return('HTTP_ACCEPT_LANGUAGE' => 'de') }
|
50
|
+
it 'returns defaults with language set to request language' do
|
51
|
+
expected_results =
|
52
|
+
{
|
53
|
+
context: false,
|
54
|
+
performance_data: false,
|
55
|
+
replacements: {},
|
56
|
+
subauthority: nil,
|
57
|
+
user_language: ['de']
|
58
|
+
}
|
59
|
+
expect(described_class.new(request, {}).search_header).to eq expected_results
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe '#fetch_header' do
|
66
|
+
context 'when optional params are defined' do
|
67
|
+
let(:fetch_params) do
|
68
|
+
{
|
69
|
+
'subauthority' => 'person',
|
70
|
+
'lang' => 'sp',
|
71
|
+
'extra' => 'data',
|
72
|
+
'even' => 'more data',
|
73
|
+
'format' => 'n3',
|
74
|
+
'performance_data' => 'true'
|
75
|
+
}.with_indifferent_access
|
76
|
+
end
|
77
|
+
before { allow(request).to receive(:env).and_return('HTTP_ACCEPT_LANGUAGE' => 'de') }
|
78
|
+
|
79
|
+
it 'uses passed in params' do
|
80
|
+
expected_results =
|
81
|
+
{
|
82
|
+
format: 'n3',
|
83
|
+
performance_data: true,
|
84
|
+
replacements: { 'extra' => 'data', 'even' => 'more data' },
|
85
|
+
subauthority: 'person',
|
86
|
+
user_language: ['sp']
|
87
|
+
}
|
88
|
+
expect(described_class.new(request, fetch_params).fetch_header).to eq expected_results
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
context 'when none of the optional params are defined' do
|
93
|
+
context 'and request does not define language' do
|
94
|
+
before { allow(request).to receive(:env).and_return('HTTP_ACCEPT_LANGUAGE' => nil) }
|
95
|
+
it 'returns defaults' do
|
96
|
+
expected_results =
|
97
|
+
{
|
98
|
+
format: 'json',
|
99
|
+
performance_data: false,
|
100
|
+
replacements: {},
|
101
|
+
subauthority: nil,
|
102
|
+
user_language: nil
|
103
|
+
}
|
104
|
+
expect(described_class.new(request, {}).fetch_header).to eq expected_results
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
context 'and request does define language' do
|
109
|
+
before { allow(request).to receive(:env).and_return('HTTP_ACCEPT_LANGUAGE' => 'de') }
|
110
|
+
it 'returns defaults with language set to request language' do
|
111
|
+
expected_results =
|
112
|
+
{
|
113
|
+
format: 'json',
|
114
|
+
performance_data: false,
|
115
|
+
replacements: {},
|
116
|
+
subauthority: nil,
|
117
|
+
user_language: ['de']
|
118
|
+
}
|
119
|
+
expect(described_class.new(request, {}).fetch_header).to eq expected_results
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|