qa 2.0.0 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
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