qa 2.0.0 → 2.3.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.
Files changed (86) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +54 -6
  3. data/app/controllers/qa/application_controller.rb +24 -0
  4. data/app/controllers/qa/linked_data_terms_controller.rb +116 -51
  5. data/app/controllers/qa/terms_controller.rb +7 -2
  6. data/app/models/qa/mesh_tree.rb +5 -9
  7. data/app/models/qa/subject_mesh_term.rb +2 -7
  8. data/config/authorities/linked_data/agrovoc.json +8 -1
  9. data/config/initializers/linked_data_authorities.rb +1 -17
  10. data/config/routes.rb +11 -0
  11. data/lib/generators/qa/apidoc/USAGE +11 -0
  12. data/lib/generators/qa/apidoc/apidoc_generator.rb +22 -0
  13. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/apidoc.json +1322 -0
  14. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/favicon-16x16.png +0 -0
  15. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/favicon-32x32.png +0 -0
  16. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/index.html +61 -0
  17. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/oauth2-redirect.html +67 -0
  18. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui-bundle.js +93 -0
  19. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui-bundle.js.map +1 -0
  20. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui-standalone-preset.js +14 -0
  21. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui-standalone-preset.js.map +1 -0
  22. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui.css +3 -0
  23. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui.css.map +1 -0
  24. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui.js +9 -0
  25. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui.js.map +1 -0
  26. data/lib/generators/qa/install/install_generator.rb +11 -0
  27. data/lib/generators/qa/install/templates/config/initializers/qa.rb +13 -0
  28. data/lib/generators/qa/local/tables/mysql/mysql_generator.rb +1 -1
  29. data/lib/generators/qa/local/tables/tables_generator.rb +1 -1
  30. data/lib/qa.rb +16 -0
  31. data/lib/qa/authorities/assign_fast_subauthority.rb +3 -3
  32. data/lib/qa/authorities/getty/aat.rb +13 -6
  33. data/lib/qa/authorities/getty/tgn.rb +11 -22
  34. data/lib/qa/authorities/getty/ulan.rb +13 -16
  35. data/lib/qa/authorities/linked_data.rb +1 -0
  36. data/lib/qa/authorities/linked_data/authority_service.rb +47 -0
  37. data/lib/qa/authorities/linked_data/config.rb +9 -3
  38. data/lib/qa/authorities/linked_data/config/search_config.rb +16 -2
  39. data/lib/qa/authorities/linked_data/config/term_config.rb +17 -3
  40. data/lib/qa/authorities/linked_data/find_term.rb +4 -3
  41. data/lib/qa/authorities/linked_data/generic_authority.rb +8 -1
  42. data/lib/qa/authorities/linked_data/rdf_helper.rb +15 -0
  43. data/lib/qa/authorities/linked_data/search_query.rb +19 -3
  44. data/lib/qa/authorities/loc/generic_authority.rb +2 -2
  45. data/lib/qa/authorities/loc_subauthority.rb +2 -2
  46. data/lib/qa/authorities/local.rb +2 -4
  47. data/lib/qa/authorities/local/file_based_authority.rb +1 -1
  48. data/lib/qa/authorities/local/mysql_table_based_authority.rb +11 -2
  49. data/lib/qa/authorities/local/table_based_authority.rb +2 -1
  50. data/lib/qa/authorities/mesh_tools/mesh_data_parser.rb +1 -1
  51. data/lib/qa/authorities/mesh_tools/mesh_importer.rb +1 -1
  52. data/lib/qa/authorities/oclcts/generic_oclc_authority.rb +1 -3
  53. data/lib/qa/configuration.rb +34 -0
  54. data/lib/qa/version.rb +1 -1
  55. data/lib/tasks/mesh.rake +3 -3
  56. data/spec/controllers/linked_data_terms_controller_spec.rb +247 -18
  57. data/spec/controllers/terms_controller_spec.rb +87 -12
  58. data/spec/fixtures/authorities/linked_data/lod_encoding_config.json +91 -0
  59. data/spec/fixtures/authorities/linked_data/lod_term_id_param_config.json +27 -0
  60. data/spec/fixtures/authorities/linked_data/lod_term_uri_param_config.json +27 -0
  61. data/spec/fixtures/{lexvo_snippet.rdf → lexvo_snippet.rdf.xml} +1 -0
  62. data/spec/lib/authorities/assign_fast_spec.rb +3 -1
  63. data/spec/lib/authorities/file_based_authority_spec.rb +19 -11
  64. data/spec/lib/authorities/geonames_spec.rb +3 -3
  65. data/spec/lib/authorities/getty/aat_spec.rb +14 -8
  66. data/spec/lib/authorities/getty/tgn_spec.rb +8 -15
  67. data/spec/lib/authorities/getty/ulan_spec.rb +8 -6
  68. data/spec/lib/authorities/getty_spec.rb +2 -1
  69. data/spec/lib/authorities/linked_data/authority_service_spec.rb +47 -0
  70. data/spec/lib/authorities/linked_data/generic_authority_spec.rb +56 -14
  71. data/spec/lib/authorities/linked_data/search_config_spec.rb +33 -19
  72. data/spec/lib/authorities/linked_data/search_query_spec.rb +67 -15
  73. data/spec/lib/authorities/linked_data/term_config_spec.rb +34 -20
  74. data/spec/lib/authorities/loc_spec.rb +9 -9
  75. data/spec/lib/authorities/local_spec.rb +7 -8
  76. data/spec/lib/authorities/oclcts_spec.rb +27 -20
  77. data/spec/lib/authorities/table_based_authority_spec.rb +5 -3
  78. data/spec/lib/authorities_loc_subauthorities.rb +2 -2
  79. data/spec/lib/configuration_spec.rb +58 -0
  80. data/spec/lib/mesh_data_parser_spec.rb +2 -0
  81. data/spec/lib/services/rdf_authority_parser_spec.rb +1 -1
  82. data/spec/lib/tasks/mesh.rake_spec.rb +13 -12
  83. data/spec/models/subject_mesh_term_spec.rb +2 -0
  84. data/spec/requests/cors_headers_spec.rb +118 -0
  85. data/spec/spec_helper.rb +2 -2
  86. metadata +167 -137
@@ -9,7 +9,8 @@ module Qa::Authorities
9
9
  @checked_for_index ||= begin
10
10
  conn = ActiveRecord::Base.connection
11
11
  if table_or_view_exists? && !conn.indexes(table_name).find { |i| i.name == table_index }
12
- Rails.logger.error "You've installed local authority tables, but you haven't indexed the label. Rails doesn't support functional indexes in migrations, so you'll have to add this manually:\n" \
12
+ Rails.logger.error "You've installed local authority tables, but you haven't indexed the label. " \
13
+ "Rails doesn't support functional indexes in migrations, so you'll have to add this manually:\n" \
13
14
  "CREATE INDEX \"#{table_index}\" ON \"#{table_name}\" (local_authority_id, lower(label))\n" \
14
15
  " OR on Sqlite: \n" \
15
16
  "CREATE INDEX \"#{table_index}\" ON \"#{table_name}\" (local_authority_id, label collate nocase)\n" \
@@ -7,7 +7,7 @@ module Qa::Authorities
7
7
  @file = file
8
8
  end
9
9
 
10
- def each_mesh_record
10
+ def each_mesh_record # rubocop:disable Metrics/MethodLength
11
11
  current_data = {}
12
12
  in_record = false
13
13
  file.each_line do |line|
@@ -1,7 +1,7 @@
1
1
  module Qa::Authorities
2
2
  module MeshTools
3
3
  class MeshImporter
4
- def import_from_file(f)
4
+ def import_from_file(f) # rubocop:disable Metrics/MethodLength
5
5
  entries = []
6
6
  trees = []
7
7
  mesh = Qa::Authorities::MeshTools::MeshDataParser.new(f)
@@ -27,9 +27,7 @@ module Qa::Authorities
27
27
  a = {}
28
28
  zthes_record = raw_response.xpath("sru:searchRetrieveResponse/sru:records/sru:record/sru:recordData/Zthes/term[termId='#{id}']", 'sru' => 'http://www.loc.gov/zing/srw/')
29
29
  zthes_record.children.each do |child|
30
- if (child.is_a? Nokogiri::XML::Element) && !child.children.nil? && (child.children.size == 1) && (child.children.first.is_a? Nokogiri::XML::Text)
31
- a[child.name] = child.children.first.to_s
32
- end
30
+ a[child.name] = child.children.first.to_s if (child.is_a? Nokogiri::XML::Element) && !child.children.nil? && (child.children.size == 1) && (child.children.first.is_a? Nokogiri::XML::Text)
33
31
  end
34
32
  a
35
33
  end
@@ -0,0 +1,34 @@
1
+ module Qa
2
+ class Configuration
3
+ def cors_headers?
4
+ return @cors_headers_enabled unless @cors_headers_enabled.nil?
5
+ @cors_headers_enabled = false
6
+ end
7
+
8
+ def enable_cors_headers
9
+ @cors_headers_enabled = true
10
+ end
11
+
12
+ def disable_cors_headers
13
+ @cors_headers_enabled = false
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
33
+ end
34
+ end
@@ -1,3 +1,3 @@
1
1
  module Qa
2
- VERSION = "2.0.0".freeze
2
+ VERSION = "2.3.0".freeze
3
3
  end
@@ -2,11 +2,12 @@ require 'benchmark'
2
2
 
3
3
  namespace :mesh do
4
4
  desc "Import MeSH terms from the file $MESH_FILE, it will update any terms which are already in the database"
5
- task :import => :environment do
5
+ # task :import => :environment do
6
+ task import: :environment do
6
7
  fname = ENV['MESH_FILE']
7
8
  if fname.nil?
8
9
  puts "Need to set $MESH_FILE with path to file to ingest"
9
- next # transfers control out of this block
10
+ next # transfers control out of this block
10
11
  end
11
12
  Benchmark.bm(30) do |bm|
12
13
  bm.report("Importing #{fname}") do
@@ -22,5 +23,4 @@ namespace :mesh do
22
23
  task :clear do
23
24
  puts "Not implemented"
24
25
  end
25
-
26
26
  end
@@ -6,13 +6,13 @@ describe Qa::LinkedDataTermsController, type: :controller do
6
6
  end
7
7
 
8
8
  describe '#check_authority' do
9
- it 'returns 400 if the vocabulary is not specified' do
9
+ it 'for search returns 400 if the vocabulary is not specified' do
10
10
  expect(Rails.logger).to receive(:warn).with("Required param 'vocab' is missing or empty")
11
11
  get :search, params: { q: 'a query', vocab: '' }
12
12
  expect(response.code).to eq('400')
13
13
  end
14
14
 
15
- it 'returns 400 if the vocabulary is not specified' do
15
+ it 'for show returns 400 if the vocabulary is not specified' do
16
16
  expect(Rails.logger).to receive(:warn).with("Required param 'vocab' is missing or empty")
17
17
  get :show, params: { id: 'C_1234', vocab: '' }
18
18
  expect(response.code).to eq('400')
@@ -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
@@ -92,7 +112,8 @@ describe Qa::LinkedDataTermsController, type: :controller do
92
112
  allow(RDF::Graph).to receive(:load).and_raise(RDF::FormatError)
93
113
  end
94
114
  it 'returns 500' do
95
- expect(Rails.logger).to receive(:warn).with("RDF Format Error - Results from search query my_query for authority OCLC_FAST was not identified as a valid RDF format. You may need to include the linkeddata gem.")
115
+ msg = "RDF Format Error - Results from search query my_query for authority OCLC_FAST was not identified as a valid RDF format. You may need to include the linkeddata gem."
116
+ expect(Rails.logger).to receive(:warn).with(msg)
96
117
  get :search, params: { q: 'my_query', vocab: 'OCLC_FAST', maximumRecords: '3' }
97
118
  expect(response.code).to eq('500')
98
119
  end
@@ -122,6 +143,7 @@ describe Qa::LinkedDataTermsController, type: :controller do
122
143
  expect(response.code).to eq('503')
123
144
  end
124
145
  end
146
+
125
147
  context 'in OCLC_FAST authority' do
126
148
  context '0 search results' do
127
149
  before do
@@ -130,7 +152,7 @@ describe Qa::LinkedDataTermsController, type: :controller do
130
152
  end
131
153
  it 'succeeds' do
132
154
  get :search, params: { q: 'supercalifragilisticexpialidocious', vocab: 'OCLC_FAST', maximumRecords: '3' }
133
- expect(response).to be_success
155
+ expect(response).to be_successful
134
156
  end
135
157
  end
136
158
 
@@ -141,7 +163,7 @@ describe Qa::LinkedDataTermsController, type: :controller do
141
163
  end
142
164
  it 'succeeds' do
143
165
  get :search, params: { q: 'cornell', vocab: 'OCLC_FAST', maximumRecords: '3' }
144
- expect(response).to be_success
166
+ expect(response).to be_successful
145
167
  end
146
168
  end
147
169
  end
@@ -154,7 +176,7 @@ describe Qa::LinkedDataTermsController, type: :controller do
154
176
  end
155
177
  it 'succeeds' do
156
178
  get :search, params: { q: 'supercalifragilisticexpialidocious', vocab: 'OCLC_FAST', subauthority: 'personal_name', maximumRecords: '3' }
157
- expect(response).to be_success
179
+ expect(response).to be_successful
158
180
  end
159
181
  end
160
182
 
@@ -165,7 +187,31 @@ describe Qa::LinkedDataTermsController, type: :controller do
165
187
  end
166
188
  it 'succeeds' do
167
189
  get :search, params: { q: 'cornell', vocab: 'OCLC_FAST', subauthority: 'personal_name', maximumRecords: '3' }
168
- expect(response).to be_success
190
+ expect(response).to be_successful
191
+ end
192
+ end
193
+
194
+ context 'when cors headers are enabled' do
195
+ before do
196
+ Qa.config.enable_cors_headers
197
+ stub_request(:get, 'http://experimental.worldcat.org/fast/search?maximumRecords=3&query=oclc.personalName%20all%20%22cornell%22&sortKeys=usage')
198
+ .to_return(status: 200, body: webmock_fixture('lod_oclc_personalName_query_3_results.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
199
+ end
200
+ it 'Access-Control-Allow-Origin is *' do
201
+ get :search, params: { q: 'cornell', vocab: 'OCLC_FAST', subauthority: 'personal_name', maximumRecords: '3' }
202
+ expect(response.headers['Access-Control-Allow-Origin']).to eq '*'
203
+ end
204
+ end
205
+
206
+ context 'when cors headers are disabled' do
207
+ before do
208
+ Qa.config.disable_cors_headers
209
+ stub_request(:get, 'http://experimental.worldcat.org/fast/search?maximumRecords=3&query=oclc.personalName%20all%20%22cornell%22&sortKeys=usage')
210
+ .to_return(status: 200, body: webmock_fixture('lod_oclc_personalName_query_3_results.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
211
+ end
212
+ it 'Access-Control-Allow-Origin is not present' do
213
+ get :search, params: { q: 'cornell', vocab: 'OCLC_FAST', subauthority: 'personal_name', maximumRecords: '3' }
214
+ expect(response.headers.key?('Access-Control-Allow-Origin')).to be false
169
215
  end
170
216
  end
171
217
  end
@@ -173,23 +219,23 @@ describe Qa::LinkedDataTermsController, type: :controller do
173
219
  context 'in AGROVOC authority' do
174
220
  context '0 search results' do
175
221
  before do
176
- stub_request(:get, 'http://artemide.art.uniroma2.it:8081/agrovoc/rest/v1/search/?lang=en&query=*supercalifragilisticexpialidocious*')
222
+ stub_request(:get, 'http://artemide.art.uniroma2.it:8081/agrovoc/rest/v1/search/?lang=en&query=*supercalifragilisticexpialidocious*&maxhits=20')
177
223
  .to_return(status: 200, body: webmock_fixture('lod_agrovoc_query_no_results.json'), headers: { 'Content-Type' => 'application/json' })
178
224
  end
179
225
  it 'succeeds' do
180
226
  get :search, params: { q: 'supercalifragilisticexpialidocious', vocab: 'AGROVOC' }
181
- expect(response).to be_success
227
+ expect(response).to be_successful
182
228
  end
183
229
  end
184
230
 
185
231
  context '3 search results' do
186
232
  before do
187
- stub_request(:get, 'http://artemide.art.uniroma2.it:8081/agrovoc/rest/v1/search/?lang=en&query=*milk*')
233
+ stub_request(:get, 'http://artemide.art.uniroma2.it:8081/agrovoc/rest/v1/search/?lang=en&query=*milk*&maxhits=20')
188
234
  .to_return(status: 200, body: webmock_fixture('lod_agrovoc_query_many_results.json'), headers: { 'Content-Type' => 'application/json' })
189
235
  end
190
236
  it 'succeeds' do
191
237
  get :search, params: { q: 'milk', vocab: 'AGROVOC' }
192
- expect(response).to be_success
238
+ expect(response).to be_successful
193
239
  end
194
240
  end
195
241
  end
@@ -214,7 +260,8 @@ describe Qa::LinkedDataTermsController, type: :controller do
214
260
  allow(RDF::Graph).to receive(:load).and_raise(RDF::FormatError)
215
261
  end
216
262
  it 'returns 500' do
217
- expect(Rails.logger).to receive(:warn).with("RDF Format Error - Results from fetch term 530369 for authority OCLC_FAST was not identified as a valid RDF format. You may need to include the linkeddata gem.")
263
+ msg = "RDF Format Error - Results from fetch term 530369 for authority OCLC_FAST was not identified as a valid RDF format. You may need to include the linkeddata gem."
264
+ expect(Rails.logger).to receive(:warn).with(msg)
218
265
  get :show, params: { id: '530369', vocab: 'OCLC_FAST' }
219
266
  expect(response.code).to eq('500')
220
267
  end
@@ -245,7 +292,7 @@ describe Qa::LinkedDataTermsController, type: :controller do
245
292
 
246
293
  context 'when requested term is not found at the server' do
247
294
  before do
248
- stub_request(:get, 'http://id.worldcat.org/fast/FAKE_ID').to_return(status: 404, body: '', headers: {})
295
+ stub_request(:get, 'http://id.worldcat.org/fast/FAKE_ID').to_return(status: 404, body: '', headers: {})
249
296
  end
250
297
  it 'returns 404' do
251
298
  expect(Rails.logger).to receive(:warn).with('Term Not Found - Fetch term FAKE_ID unsuccessful for authority OCLC_FAST')
@@ -262,7 +309,31 @@ describe Qa::LinkedDataTermsController, type: :controller do
262
309
  end
263
310
  it 'succeeds' do
264
311
  get :show, params: { id: '530369', vocab: 'OCLC_FAST' }
265
- expect(response).to be_success
312
+ expect(response).to be_successful
313
+ end
314
+ end
315
+
316
+ context 'when cors headers are enabled' do
317
+ before do
318
+ Qa.config.enable_cors_headers
319
+ stub_request(:get, 'http://id.worldcat.org/fast/530369')
320
+ .to_return(status: 200, body: webmock_fixture('lod_oclc_term_found.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
321
+ end
322
+ it 'Access-Control-Allow-Origin is *' do
323
+ get :show, params: { id: '530369', vocab: 'OCLC_FAST' }
324
+ expect(response.headers['Access-Control-Allow-Origin']).to eq '*'
325
+ end
326
+ end
327
+
328
+ context 'when cors headers are disabled' do
329
+ before do
330
+ Qa.config.disable_cors_headers
331
+ stub_request(:get, 'http://id.worldcat.org/fast/530369')
332
+ .to_return(status: 200, body: webmock_fixture('lod_oclc_term_found.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
333
+ end
334
+ it 'Access-Control-Allow-Origin is not present' do
335
+ get :show, params: { id: '530369', vocab: 'OCLC_FAST' }
336
+ expect(response.headers.key?('Access-Control-Allow-Origin')).to be false
266
337
  end
267
338
  end
268
339
  end
@@ -273,9 +344,28 @@ describe Qa::LinkedDataTermsController, type: :controller do
273
344
  stub_request(:get, 'http://artemide.art.uniroma2.it:8081/agrovoc/rest/v1/data?uri=http://aims.fao.org/aos/agrovoc/c_9513')
274
345
  .to_return(status: 200, body: webmock_fixture('lod_agrovoc_term_found.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
275
346
  end
276
- it 'succeeds' do
347
+
348
+ it 'succeeds and defaults to json content type' do
277
349
  get :show, params: { id: 'c_9513', vocab: 'AGROVOC' }
278
- expect(response).to be_success
350
+ expect(response).to be_successful
351
+ expect(response.content_type).to eq 'application/json'
352
+ end
353
+
354
+ context 'and it was requested as json' do
355
+ it 'succeeds and returns term data as json content type' do
356
+ get :show, params: { id: 'c_9513', vocab: 'AGROVOC', format: 'json' }
357
+ expect(response).to be_successful
358
+ expect(response.content_type).to eq 'application/json'
359
+ end
360
+ end
361
+
362
+ context 'and it was requested as jsonld' do
363
+ it 'succeeds and returns term data as jsonld content type' do
364
+ get :show, params: { id: 'c_9513', vocab: 'AGROVOC', format: 'jsonld' }
365
+ expect(response).to be_successful
366
+ expect(response.content_type).to eq 'application/ld+json'
367
+ expect(JSON.parse(response.body).keys).to match_array ["@context", "@graph"]
368
+ end
279
369
  end
280
370
  end
281
371
  end
@@ -286,11 +376,150 @@ describe Qa::LinkedDataTermsController, type: :controller do
286
376
  stub_request(:get, 'http://id.loc.gov/authorities/subjects/sh85118553')
287
377
  .to_return(status: 200, body: webmock_fixture('lod_loc_term_found.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
288
378
  end
289
- it 'succeeds' do
379
+ it 'succeeds and defaults to json content type' do
290
380
  get :show, params: { id: 'sh85118553', vocab: 'LOC', subauthority: 'subjects' }
291
- expect(response).to be_success
381
+ expect(response).to be_successful
382
+ expect(response.content_type).to eq 'application/json'
383
+ end
384
+ end
385
+ end
386
+ end
387
+
388
+ describe '#fetch' do
389
+ context 'producing internal server error' do
390
+ context 'when server returns 500' do
391
+ before do
392
+ stub_request(:get, 'http://localhost/test_default/term?uri=http://test.org/530369').to_return(status: 500)
393
+ end
394
+ it 'returns 500' do
395
+ expect(Rails.logger).to receive(:warn).with("Internal Server Error - Fetch term http://test.org/530369 unsuccessful for authority LOD_TERM_URI_PARAM_CONFIG")
396
+ get :fetch, params: { vocab: 'LOD_TERM_URI_PARAM_CONFIG', uri: 'http://test.org/530369' }
397
+ expect(response.code).to eq('500')
398
+ end
399
+ end
400
+
401
+ context 'when rdf format error' do
402
+ before do
403
+ stub_request(:get, 'http://localhost/test_default/term?uri=http://test.org/530369').to_return(status: 200)
404
+ allow(RDF::Graph).to receive(:load).and_raise(RDF::FormatError)
405
+ end
406
+ it 'returns 500' do
407
+ 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. " \
408
+ "You may need to include the linkeddata gem."
409
+ expect(Rails.logger).to receive(:warn).with(msg)
410
+ get :fetch, params: { uri: 'http://test.org/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG' }
411
+ expect(response.code).to eq('500')
412
+ end
413
+ end
414
+
415
+ context "when error isn't specifically handled" do
416
+ before do
417
+ stub_request(:get, 'http://localhost/test_default/term?uri=http://test.org/530369').to_return(status: 501)
418
+ end
419
+ it 'returns 500' do
420
+ expect(Rails.logger).to receive(:warn).with("Internal Server Error - Fetch term http://test.org/530369 unsuccessful for authority LOD_TERM_URI_PARAM_CONFIG")
421
+ get :fetch, params: { uri: 'http://test.org/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG' }
422
+ expect(response.code).to eq('500')
292
423
  end
293
424
  end
294
425
  end
426
+
427
+ context 'when service unavailable' do
428
+ before do
429
+ stub_request(:get, 'http://localhost/test_default/term?uri=http://test.org/530369').to_return(status: 503)
430
+ end
431
+ it 'returns 503' do
432
+ expect(Rails.logger).to receive(:warn).with("Service Unavailable - Fetch term http://test.org/530369 unsuccessful for authority LOD_TERM_URI_PARAM_CONFIG")
433
+ get :fetch, params: { uri: 'http://test.org/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG' }
434
+ expect(response.code).to eq('503')
435
+ end
436
+ end
437
+
438
+ context 'when requested term is not found at the server' do
439
+ before do
440
+ stub_request(:get, 'http://localhost/test_default/term?uri=http://test.org/FAKE_ID').to_return(status: 404, body: '', headers: {})
441
+ end
442
+ it 'returns 404' do
443
+ 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')
444
+ get :fetch, params: { uri: 'http://test.org/FAKE_ID', vocab: 'LOD_TERM_URI_PARAM_CONFIG' }
445
+ expect(response.code).to eq('404')
446
+ end
447
+ end
448
+
449
+ context 'in LOD_TERM_URI_PARAM_CONFIG authority' do
450
+ context 'term found' do
451
+ before do
452
+ stub_request(:get, 'http://localhost/test_default/term?uri=http://test.org/530369')
453
+ .to_return(status: 200, body: webmock_fixture('lod_oclc_term_found.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
454
+ end
455
+
456
+ it 'succeeds and defaults to json content type' do
457
+ get :fetch, params: { uri: 'http://test.org/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG' }
458
+ expect(response).to be_successful
459
+ expect(response.content_type).to eq 'application/json'
460
+ end
461
+
462
+ context 'and it was requested as json' do
463
+ it 'succeeds and returns term data as json content type' do
464
+ get :fetch, params: { uri: 'http://test.org/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG', format: 'json' }
465
+ expect(response).to be_successful
466
+ expect(response.content_type).to eq 'application/json'
467
+ end
468
+ end
469
+
470
+ context 'and it was requested as jsonld' do
471
+ it 'succeeds and returns term data as jsonld content type' do
472
+ get :fetch, params: { uri: 'http://test.org/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG', format: 'jsonld' }
473
+ expect(response).to be_successful
474
+ expect(response.content_type).to eq 'application/ld+json'
475
+ expect(JSON.parse(response.body).keys).to match_array ["@context", "@graph"]
476
+ end
477
+ end
478
+ end
479
+
480
+ context 'when cors headers are enabled' do
481
+ before do
482
+ Qa.config.enable_cors_headers
483
+ stub_request(:get, 'http://localhost/test_default/term?uri=http://test.org/530369')
484
+ .to_return(status: 200, body: webmock_fixture('lod_oclc_term_found.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
485
+ end
486
+ it 'Access-Control-Allow-Origin is *' do
487
+ get :fetch, params: { uri: 'http://test.org/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG' }
488
+ expect(response.headers['Access-Control-Allow-Origin']).to eq '*'
489
+ end
490
+ end
491
+
492
+ context 'when cors headers are disabled' do
493
+ before do
494
+ Qa.config.disable_cors_headers
495
+ stub_request(:get, 'http://localhost/test_default/term?uri=http://test.org/530369')
496
+ .to_return(status: 200, body: webmock_fixture('lod_oclc_term_found.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
497
+ end
498
+ it 'Access-Control-Allow-Origin is not present' do
499
+ get :fetch, params: { uri: 'http://test.org/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG' }
500
+ expect(response.headers.key?('Access-Control-Allow-Origin')).to be false
501
+ end
502
+ end
503
+ end
504
+ end
505
+
506
+ describe '#reload' do
507
+ before do
508
+ Qa.config.authorized_reload_token = 'A_TOKEN'
509
+ end
510
+
511
+ context 'when token does not match' do
512
+ it 'returns 401' do
513
+ get :reload, params: { auth_token: 'BAD_TOKEN' }
514
+ expect(response.code).to eq('401')
515
+ end
516
+ end
517
+
518
+ context 'when token does match' do
519
+ it 'returns 200' do
520
+ get :reload, params: { auth_token: 'A_TOKEN' }
521
+ expect(response.code).to eq('200')
522
+ end
523
+ end
295
524
  end
296
525
  end