qa 2.0.1 → 2.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +30 -3
- data/app/controllers/qa/application_controller.rb +22 -0
- data/app/controllers/qa/linked_data_terms_controller.rb +16 -10
- data/app/controllers/qa/terms_controller.rb +7 -2
- data/app/models/qa/mesh_tree.rb +5 -9
- data/app/models/qa/subject_mesh_term.rb +2 -7
- data/config/initializers/linked_data_authorities.rb +1 -1
- data/config/routes.rb +8 -0
- data/lib/generators/qa/install/install_generator.rb +4 -0
- data/lib/generators/qa/install/templates/config/initializers/qa.rb +7 -0
- data/lib/generators/qa/local/tables/mysql/mysql_generator.rb +1 -1
- data/lib/generators/qa/local/tables/tables_generator.rb +1 -1
- data/lib/qa.rb +16 -0
- data/lib/qa/authorities/assign_fast_subauthority.rb +3 -3
- data/lib/qa/authorities/getty/tgn.rb +1 -1
- data/lib/qa/authorities/getty/ulan.rb +1 -1
- data/lib/qa/authorities/linked_data/find_term.rb +2 -2
- data/lib/qa/authorities/linked_data/rdf_helper.rb +15 -0
- data/lib/qa/authorities/linked_data/search_query.rb +19 -3
- data/lib/qa/authorities/loc_subauthority.rb +2 -2
- data/lib/qa/authorities/local.rb +2 -4
- data/lib/qa/authorities/local/file_based_authority.rb +1 -1
- data/lib/qa/authorities/local/mysql_table_based_authority.rb +11 -2
- data/lib/qa/authorities/local/table_based_authority.rb +2 -1
- data/lib/qa/authorities/mesh_tools/mesh_data_parser.rb +1 -1
- data/lib/qa/authorities/mesh_tools/mesh_importer.rb +1 -1
- data/lib/qa/authorities/oclcts/generic_oclc_authority.rb +1 -3
- data/lib/qa/configuration.rb +16 -0
- data/lib/qa/version.rb +1 -1
- data/lib/tasks/mesh.rake +3 -3
- data/spec/controllers/linked_data_terms_controller_spec.rb +65 -14
- data/spec/controllers/terms_controller_spec.rb +85 -10
- data/spec/fixtures/{lexvo_snippet.rdf → lexvo_snippet.rdf.xml} +1 -0
- data/spec/lib/authorities/assign_fast_spec.rb +3 -1
- data/spec/lib/authorities/file_based_authority_spec.rb +19 -11
- data/spec/lib/authorities/geonames_spec.rb +3 -3
- data/spec/lib/authorities/getty/aat_spec.rb +2 -1
- data/spec/lib/authorities/getty/tgn_spec.rb +6 -2
- data/spec/lib/authorities/getty/ulan_spec.rb +4 -2
- data/spec/lib/authorities/getty_spec.rb +2 -1
- data/spec/lib/authorities/linked_data/generic_authority_spec.rb +54 -12
- data/spec/lib/authorities/linked_data/search_config_spec.rb +23 -19
- data/spec/lib/authorities/linked_data/search_query_spec.rb +67 -15
- data/spec/lib/authorities/linked_data/term_config_spec.rb +24 -20
- data/spec/lib/authorities/local_spec.rb +7 -8
- data/spec/lib/authorities/oclcts_spec.rb +27 -20
- data/spec/lib/authorities/table_based_authority_spec.rb +5 -3
- data/spec/lib/authorities_loc_subauthorities.rb +2 -2
- data/spec/lib/mesh_data_parser_spec.rb +2 -0
- data/spec/lib/services/rdf_authority_parser_spec.rb +1 -1
- data/spec/lib/tasks/mesh.rake_spec.rb +13 -12
- data/spec/models/subject_mesh_term_spec.rb +2 -0
- data/spec/requests/cors_headers_spec.rb +118 -0
- data/spec/spec_helper.rb +2 -2
- metadata +133 -142
@@ -37,6 +37,7 @@ module Qa::Authorities
|
|
37
37
|
|
38
38
|
def parse_search_authority_response(graph, language)
|
39
39
|
graph = filter_language(graph, language) unless language.nil?
|
40
|
+
graph = filter_out_blanknodes(graph)
|
40
41
|
results = extract_preds(graph, preds_for_search)
|
41
42
|
consolidated_results = consolidate_search_results(results)
|
42
43
|
json_results = convert_search_to_json(consolidated_results)
|
@@ -61,7 +62,7 @@ module Qa::Authorities
|
|
61
62
|
preds
|
62
63
|
end
|
63
64
|
|
64
|
-
def consolidate_search_results(results)
|
65
|
+
def consolidate_search_results(results) # rubocop:disable Metrics/MethodLength
|
65
66
|
consolidated_results = {}
|
66
67
|
return consolidated_results if results.nil? || !results.count.positive?
|
67
68
|
results.each do |statement|
|
@@ -105,11 +106,14 @@ module Qa::Authorities
|
|
105
106
|
lbl
|
106
107
|
end
|
107
108
|
|
108
|
-
def sort_search_results(json_results)
|
109
|
+
def sort_search_results(json_results) # rubocop:disable Metrics/MethodLength
|
109
110
|
return json_results unless supports_sort?
|
110
111
|
json_results.sort! do |a, b|
|
111
112
|
cmp = sort_when_missing_sort_predicate(a, b)
|
112
|
-
next unless cmp.nil?
|
113
|
+
next cmp unless cmp.nil?
|
114
|
+
|
115
|
+
cmp = numeric_sort(a, b)
|
116
|
+
next cmp unless cmp.nil?
|
113
117
|
|
114
118
|
as = a[:sort].collect(&:downcase)
|
115
119
|
bs = b[:sort].collect(&:downcase)
|
@@ -138,6 +142,18 @@ module Qa::Authorities
|
|
138
142
|
return 1 if bs.size <= current_list_size # consider shorter b list of values lower then longer a list
|
139
143
|
nil
|
140
144
|
end
|
145
|
+
|
146
|
+
def numeric_sort(a, b)
|
147
|
+
return nil if a[:sort].size > 1
|
148
|
+
return nil if b[:sort].size > 1
|
149
|
+
return nil unless s_is_i? a[:sort][0]
|
150
|
+
return nil unless s_is_i? b[:sort][0]
|
151
|
+
Integer(a[:sort][0]) <=> Integer(b[:sort][0])
|
152
|
+
end
|
153
|
+
|
154
|
+
def s_is_i?(s)
|
155
|
+
/\A[-+]?\d+\z/ === s # rubocop:disable Style/CaseEquality
|
156
|
+
end
|
141
157
|
end
|
142
158
|
end
|
143
159
|
end
|
@@ -18,7 +18,7 @@ module Qa::Authorities::LocSubauthority
|
|
18
18
|
]
|
19
19
|
end
|
20
20
|
|
21
|
-
def vocabularies
|
21
|
+
def vocabularies # rubocop:disable Metrics/MethodLength
|
22
22
|
[
|
23
23
|
"graphicMaterials",
|
24
24
|
"organizations",
|
@@ -40,7 +40,7 @@ module Qa::Authorities::LocSubauthority
|
|
40
40
|
["edtf"]
|
41
41
|
end
|
42
42
|
|
43
|
-
def preservation
|
43
|
+
def preservation # rubocop:disable Metrics/MethodLength
|
44
44
|
[
|
45
45
|
"contentLocationType",
|
46
46
|
"copyrightStatus",
|
data/lib/qa/authorities/local.rb
CHANGED
@@ -20,15 +20,13 @@ module Qa::Authorities
|
|
20
20
|
if config[:local_path].starts_with?(File::Separator)
|
21
21
|
config[:local_path]
|
22
22
|
else
|
23
|
-
|
23
|
+
Rails.root.join(config[:local_path]).to_s # TODO: Rails.root.join returns class Pathname, which may be ok. Added to_s because of failing regression test.
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
27
|
# Local sub-authorities are any YAML files in the subauthorities_path
|
28
28
|
def names
|
29
|
-
unless Dir.exist? subauthorities_path
|
30
|
-
raise Qa::ConfigDirectoryNotFound, "There's no directory at #{subauthorities_path}. You must create it in order to use local authorities"
|
31
|
-
end
|
29
|
+
raise Qa::ConfigDirectoryNotFound, "There's no directory at #{subauthorities_path}. You must create it in order to use local authorities" unless Dir.exist? subauthorities_path
|
32
30
|
Dir.entries(subauthorities_path).map { |f| File.basename(f, ".yml") if f =~ /yml$/ }.compact
|
33
31
|
end
|
34
32
|
|
@@ -25,7 +25,7 @@ module Qa::Authorities
|
|
25
25
|
private
|
26
26
|
|
27
27
|
def terms
|
28
|
-
subauthority_hash = YAML.load(File.read(subauthority_filename))
|
28
|
+
subauthority_hash = YAML.load(File.read(subauthority_filename)) # rubocop:disable Security/YAMLLoad # TODO: Explore how to change this to safe_load. Many tests fail when making this change.
|
29
29
|
terms = subauthority_hash.with_indifferent_access.fetch(:terms, [])
|
30
30
|
normalize_terms(terms)
|
31
31
|
end
|
@@ -5,8 +5,7 @@ module Qa
|
|
5
5
|
self.table_index = "index_qa_local_authority_entries_on_lower_label_and_authority"
|
6
6
|
|
7
7
|
def self.check_for_index
|
8
|
-
|
9
|
-
if table_or_view_exists? && conn.index_name_exists?(table_name.to_sym, table_index, :default).blank?
|
8
|
+
if table_or_view_exists? && index_name_exists? # rubocop:disable Style/GuardClause
|
10
9
|
Rails.logger.error "You've installed mysql local authority tables, but you haven't indexed the lower label. "
|
11
10
|
"Rails doesn't support functional indexes in migrations, so we tried to execute it for you but something went wrong...\n" \
|
12
11
|
"Make sure your table has a lower_label column, which is virtually created, and that the column is indexed." \
|
@@ -19,6 +18,16 @@ module Qa
|
|
19
18
|
return [] if q.blank?
|
20
19
|
output_set(base_relation.where('lower_label like ?', "#{q.downcase}%").limit(25))
|
21
20
|
end
|
21
|
+
|
22
|
+
def self.index_name_exists?
|
23
|
+
conn = ActiveRecord::Base.connection
|
24
|
+
if ActiveRecord::VERSION::MAJOR >= 5 && ActiveRecord::VERSION::MINOR >= 1
|
25
|
+
conn.index_name_exists?(table_name, table_index).blank?
|
26
|
+
else
|
27
|
+
conn.index_name_exists?(table_name, table_index, :default).blank?
|
28
|
+
end
|
29
|
+
end
|
30
|
+
private_class_method :index_name_exists?
|
22
31
|
end
|
23
32
|
end
|
24
33
|
end
|
@@ -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.
|
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" \
|
@@ -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,16 @@
|
|
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
|
+
end
|
16
|
+
end
|
data/lib/qa/version.rb
CHANGED
data/lib/tasks/mesh.rake
CHANGED
@@ -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
|
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')
|
@@ -92,7 +92,8 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
92
92
|
allow(RDF::Graph).to receive(:load).and_raise(RDF::FormatError)
|
93
93
|
end
|
94
94
|
it 'returns 500' do
|
95
|
-
|
95
|
+
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."
|
96
|
+
expect(Rails.logger).to receive(:warn).with(msg)
|
96
97
|
get :search, params: { q: 'my_query', vocab: 'OCLC_FAST', maximumRecords: '3' }
|
97
98
|
expect(response.code).to eq('500')
|
98
99
|
end
|
@@ -122,6 +123,7 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
122
123
|
expect(response.code).to eq('503')
|
123
124
|
end
|
124
125
|
end
|
126
|
+
|
125
127
|
context 'in OCLC_FAST authority' do
|
126
128
|
context '0 search results' do
|
127
129
|
before do
|
@@ -130,7 +132,7 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
130
132
|
end
|
131
133
|
it 'succeeds' do
|
132
134
|
get :search, params: { q: 'supercalifragilisticexpialidocious', vocab: 'OCLC_FAST', maximumRecords: '3' }
|
133
|
-
expect(response).to
|
135
|
+
expect(response).to be_successful
|
134
136
|
end
|
135
137
|
end
|
136
138
|
|
@@ -141,7 +143,7 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
141
143
|
end
|
142
144
|
it 'succeeds' do
|
143
145
|
get :search, params: { q: 'cornell', vocab: 'OCLC_FAST', maximumRecords: '3' }
|
144
|
-
expect(response).to
|
146
|
+
expect(response).to be_successful
|
145
147
|
end
|
146
148
|
end
|
147
149
|
end
|
@@ -154,7 +156,7 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
154
156
|
end
|
155
157
|
it 'succeeds' do
|
156
158
|
get :search, params: { q: 'supercalifragilisticexpialidocious', vocab: 'OCLC_FAST', subauthority: 'personal_name', maximumRecords: '3' }
|
157
|
-
expect(response).to
|
159
|
+
expect(response).to be_successful
|
158
160
|
end
|
159
161
|
end
|
160
162
|
|
@@ -165,7 +167,31 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
165
167
|
end
|
166
168
|
it 'succeeds' do
|
167
169
|
get :search, params: { q: 'cornell', vocab: 'OCLC_FAST', subauthority: 'personal_name', maximumRecords: '3' }
|
168
|
-
expect(response).to
|
170
|
+
expect(response).to be_successful
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
context 'when cors headers are enabled' do
|
175
|
+
before do
|
176
|
+
Qa.config.enable_cors_headers
|
177
|
+
stub_request(:get, 'http://experimental.worldcat.org/fast/search?maximumRecords=3&query=oclc.personalName%20all%20%22cornell%22&sortKeys=usage')
|
178
|
+
.to_return(status: 200, body: webmock_fixture('lod_oclc_personalName_query_3_results.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
|
179
|
+
end
|
180
|
+
it 'Access-Control-Allow-Origin is *' do
|
181
|
+
get :search, params: { q: 'cornell', vocab: 'OCLC_FAST', subauthority: 'personal_name', maximumRecords: '3' }
|
182
|
+
expect(response.headers['Access-Control-Allow-Origin']).to eq '*'
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
context 'when cors headers are disabled' do
|
187
|
+
before do
|
188
|
+
Qa.config.disable_cors_headers
|
189
|
+
stub_request(:get, 'http://experimental.worldcat.org/fast/search?maximumRecords=3&query=oclc.personalName%20all%20%22cornell%22&sortKeys=usage')
|
190
|
+
.to_return(status: 200, body: webmock_fixture('lod_oclc_personalName_query_3_results.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
|
191
|
+
end
|
192
|
+
it 'Access-Control-Allow-Origin is not present' do
|
193
|
+
get :search, params: { q: 'cornell', vocab: 'OCLC_FAST', subauthority: 'personal_name', maximumRecords: '3' }
|
194
|
+
expect(response.headers.key?('Access-Control-Allow-Origin')).to be false
|
169
195
|
end
|
170
196
|
end
|
171
197
|
end
|
@@ -178,7 +204,7 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
178
204
|
end
|
179
205
|
it 'succeeds' do
|
180
206
|
get :search, params: { q: 'supercalifragilisticexpialidocious', vocab: 'AGROVOC' }
|
181
|
-
expect(response).to
|
207
|
+
expect(response).to be_successful
|
182
208
|
end
|
183
209
|
end
|
184
210
|
|
@@ -189,7 +215,7 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
189
215
|
end
|
190
216
|
it 'succeeds' do
|
191
217
|
get :search, params: { q: 'milk', vocab: 'AGROVOC' }
|
192
|
-
expect(response).to
|
218
|
+
expect(response).to be_successful
|
193
219
|
end
|
194
220
|
end
|
195
221
|
end
|
@@ -214,7 +240,8 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
214
240
|
allow(RDF::Graph).to receive(:load).and_raise(RDF::FormatError)
|
215
241
|
end
|
216
242
|
it 'returns 500' do
|
217
|
-
|
243
|
+
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."
|
244
|
+
expect(Rails.logger).to receive(:warn).with(msg)
|
218
245
|
get :show, params: { id: '530369', vocab: 'OCLC_FAST' }
|
219
246
|
expect(response.code).to eq('500')
|
220
247
|
end
|
@@ -245,7 +272,7 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
245
272
|
|
246
273
|
context 'when requested term is not found at the server' do
|
247
274
|
before do
|
248
|
-
stub_request(:get, 'http://id.worldcat.org/fast/FAKE_ID').to_return(status: 404, body: '', headers:
|
275
|
+
stub_request(:get, 'http://id.worldcat.org/fast/FAKE_ID').to_return(status: 404, body: '', headers: {})
|
249
276
|
end
|
250
277
|
it 'returns 404' do
|
251
278
|
expect(Rails.logger).to receive(:warn).with('Term Not Found - Fetch term FAKE_ID unsuccessful for authority OCLC_FAST')
|
@@ -262,7 +289,31 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
262
289
|
end
|
263
290
|
it 'succeeds' do
|
264
291
|
get :show, params: { id: '530369', vocab: 'OCLC_FAST' }
|
265
|
-
expect(response).to
|
292
|
+
expect(response).to be_successful
|
293
|
+
end
|
294
|
+
end
|
295
|
+
|
296
|
+
context 'when cors headers are enabled' do
|
297
|
+
before do
|
298
|
+
Qa.config.enable_cors_headers
|
299
|
+
stub_request(:get, 'http://id.worldcat.org/fast/530369')
|
300
|
+
.to_return(status: 200, body: webmock_fixture('lod_oclc_term_found.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
|
301
|
+
end
|
302
|
+
it 'Access-Control-Allow-Origin is *' do
|
303
|
+
get :show, params: { id: '530369', vocab: 'OCLC_FAST' }
|
304
|
+
expect(response.headers['Access-Control-Allow-Origin']).to eq '*'
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
308
|
+
context 'when cors headers are disabled' do
|
309
|
+
before do
|
310
|
+
Qa.config.disable_cors_headers
|
311
|
+
stub_request(:get, 'http://id.worldcat.org/fast/530369')
|
312
|
+
.to_return(status: 200, body: webmock_fixture('lod_oclc_term_found.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
|
313
|
+
end
|
314
|
+
it 'Access-Control-Allow-Origin is not present' do
|
315
|
+
get :show, params: { id: '530369', vocab: 'OCLC_FAST' }
|
316
|
+
expect(response.headers.key?('Access-Control-Allow-Origin')).to be false
|
266
317
|
end
|
267
318
|
end
|
268
319
|
end
|
@@ -275,7 +326,7 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
275
326
|
end
|
276
327
|
it 'succeeds' do
|
277
328
|
get :show, params: { id: 'c_9513', vocab: 'AGROVOC' }
|
278
|
-
expect(response).to
|
329
|
+
expect(response).to be_successful
|
279
330
|
end
|
280
331
|
end
|
281
332
|
end
|
@@ -288,7 +339,7 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
288
339
|
end
|
289
340
|
it 'succeeds' do
|
290
341
|
get :show, params: { id: 'sh85118553', vocab: 'LOC', subauthority: 'subjects' }
|
291
|
-
expect(response).to
|
342
|
+
expect(response).to be_successful
|
292
343
|
end
|
293
344
|
end
|
294
345
|
end
|
@@ -29,7 +29,16 @@ describe Qa::TermsController, type: :controller do
|
|
29
29
|
end
|
30
30
|
context "when a sub-authority does not exist" do
|
31
31
|
it "returns 404 if a sub-authority does not exist" do
|
32
|
-
|
32
|
+
msg = "Unable to initialize sub-authority non-existent-subauthority for Qa::Authorities::Loc. Valid sub-authorities are " \
|
33
|
+
"[\"subjects\", \"names\", \"classification\", \"childrensSubjects\", \"genreForms\", \"performanceMediums\", " \
|
34
|
+
"\"graphicMaterials\", \"organizations\", \"relators\", \"countries\", \"ethnographicTerms\", \"geographicAreas\", " \
|
35
|
+
"\"languages\", \"iso639-1\", \"iso639-2\", \"iso639-5\", \"preservation\", \"actionsGranted\", \"agentType\", " \
|
36
|
+
"\"edtf\", \"contentLocationType\", \"copyrightStatus\", \"cryptographicHashFunctions\", " \
|
37
|
+
"\"environmentCharacteristic\", \"environmentPurpose\", \"eventRelatedAgentRole\", \"eventRelatedObjectRole\", " \
|
38
|
+
"\"eventType\", \"formatRegistryRole\", \"hardwareType\", \"inhibitorTarget\", \"inhibitorType\", \"objectCategory\", " \
|
39
|
+
"\"preservationLevelRole\", \"relationshipSubType\", \"relationshipType\", \"rightsBasis\", \"rightsRelatedAgentRole\", " \
|
40
|
+
"\"signatureEncoding\", \"signatureMethod\", \"softwareType\", \"storageMedium\"]"
|
41
|
+
expect(Rails.logger).to receive(:warn).with(msg)
|
33
42
|
get :search, params: { q: "a query", vocab: "loc", subauthority: "non-existent-subauthority" }
|
34
43
|
expect(response.code).to eq("404")
|
35
44
|
end
|
@@ -63,7 +72,7 @@ describe Qa::TermsController, type: :controller do
|
|
63
72
|
end
|
64
73
|
it "succeeds" do
|
65
74
|
get :search, params: { q: "a query", vocab: "local", subauthority: "two_args" }
|
66
|
-
expect(response).to
|
75
|
+
expect(response).to be_successful
|
67
76
|
end
|
68
77
|
end
|
69
78
|
|
@@ -76,12 +85,38 @@ describe Qa::TermsController, type: :controller do
|
|
76
85
|
|
77
86
|
it "returns a set of terms for a tgnlang query" do
|
78
87
|
get :search, params: { q: "Tibetan", vocab: "tgnlang" }
|
79
|
-
expect(response).to
|
88
|
+
expect(response).to be_successful
|
80
89
|
end
|
81
90
|
|
82
91
|
it "does not return 404 if subauthority is valid" do
|
83
92
|
get :search, params: { q: "Berry", vocab: "loc", subauthority: "names" }
|
84
|
-
expect(response).to
|
93
|
+
expect(response).to be_successful
|
94
|
+
end
|
95
|
+
|
96
|
+
context 'when cors headers are enabled' do
|
97
|
+
before do
|
98
|
+
Qa.config.enable_cors_headers
|
99
|
+
stub_request(:get, "http://id.loc.gov/search/?format=json&q=Berry&q=cs:http://id.loc.gov/authorities/names")
|
100
|
+
.with(headers: { 'Accept' => 'application/json' })
|
101
|
+
.to_return(body: webmock_fixture("loc-names-response.txt"), status: 200)
|
102
|
+
end
|
103
|
+
it 'Access-Control-Allow-Origin is *' do
|
104
|
+
get :search, params: { q: "Tibetan", vocab: "tgnlang" }
|
105
|
+
expect(response.headers['Access-Control-Allow-Origin']).to eq '*'
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
context 'when cors headers are disabled' do
|
110
|
+
before do
|
111
|
+
Qa.config.disable_cors_headers
|
112
|
+
stub_request(:get, "http://id.loc.gov/search/?format=json&q=Berry&q=cs:http://id.loc.gov/authorities/names")
|
113
|
+
.with(headers: { 'Accept' => 'application/json' })
|
114
|
+
.to_return(body: webmock_fixture("loc-names-response.txt"), status: 200)
|
115
|
+
end
|
116
|
+
it 'Access-Control-Allow-Origin is not present' do
|
117
|
+
get :search, params: { q: "Tibetan", vocab: "tgnlang" }
|
118
|
+
expect(response.headers.key?('Access-Control-Allow-Origin')).to be false
|
119
|
+
end
|
85
120
|
end
|
86
121
|
end
|
87
122
|
|
@@ -93,7 +128,7 @@ describe Qa::TermsController, type: :controller do
|
|
93
128
|
end
|
94
129
|
it "succeeds if authority class is camelcase" do
|
95
130
|
get :search, params: { q: "word", vocab: "assign_fast", subauthority: "topical" }
|
96
|
-
expect(response).to
|
131
|
+
expect(response).to be_successful
|
97
132
|
end
|
98
133
|
end
|
99
134
|
end
|
@@ -102,11 +137,31 @@ describe Qa::TermsController, type: :controller do
|
|
102
137
|
context "with supported authorities" do
|
103
138
|
it "returns all local authority state terms" do
|
104
139
|
get :index, params: { vocab: "local", subauthority: "states" }
|
105
|
-
expect(response).to
|
140
|
+
expect(response).to be_successful
|
106
141
|
end
|
107
142
|
it "returns all MeSH terms" do
|
108
143
|
get :index, params: { vocab: "mesh" }
|
109
|
-
expect(response).to
|
144
|
+
expect(response).to be_successful
|
145
|
+
end
|
146
|
+
|
147
|
+
context 'when cors headers are enabled' do
|
148
|
+
before do
|
149
|
+
Qa.config.enable_cors_headers
|
150
|
+
end
|
151
|
+
it 'Access-Control-Allow-Origin is *' do
|
152
|
+
get :index, params: { vocab: "local", subauthority: "states" }
|
153
|
+
expect(response.headers['Access-Control-Allow-Origin']).to eq '*'
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
context 'when cors headers are disabled' do
|
158
|
+
before do
|
159
|
+
Qa.config.disable_cors_headers
|
160
|
+
end
|
161
|
+
it 'Access-Control-Allow-Origin is not present' do
|
162
|
+
get :index, params: { vocab: "local", subauthority: "states" }
|
163
|
+
expect(response.headers.key?('Access-Control-Allow-Origin')).to be false
|
164
|
+
end
|
110
165
|
end
|
111
166
|
end
|
112
167
|
|
@@ -136,17 +191,37 @@ describe Qa::TermsController, type: :controller do
|
|
136
191
|
|
137
192
|
it "returns an individual state term" do
|
138
193
|
get :show, params: { vocab: "local", subauthority: "states", id: "OH" }
|
139
|
-
expect(response).to
|
194
|
+
expect(response).to be_successful
|
140
195
|
end
|
141
196
|
|
142
197
|
it "returns an individual MeSH term" do
|
143
198
|
get :show, params: { vocab: "mesh", id: "D000001" }
|
144
|
-
expect(response).to
|
199
|
+
expect(response).to be_successful
|
145
200
|
end
|
146
201
|
|
147
202
|
it "returns an individual subject term" do
|
148
203
|
get :show, params: { vocab: "loc", subauthority: "subjects", id: "sh85077565" }
|
149
|
-
expect(response).to
|
204
|
+
expect(response).to be_successful
|
205
|
+
end
|
206
|
+
|
207
|
+
context 'when cors headers are enabled' do
|
208
|
+
before do
|
209
|
+
Qa.config.enable_cors_headers
|
210
|
+
end
|
211
|
+
it 'Access-Control-Allow-Origin is *' do
|
212
|
+
get :show, params: { vocab: "mesh", id: "D000001" }
|
213
|
+
expect(response.headers['Access-Control-Allow-Origin']).to eq '*'
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
context 'when cors headers are disabled' do
|
218
|
+
before do
|
219
|
+
Qa.config.disable_cors_headers
|
220
|
+
end
|
221
|
+
it 'Access-Control-Allow-Origin is not present' do
|
222
|
+
get :show, params: { vocab: "mesh", id: "D000001" }
|
223
|
+
expect(response.headers.key?('Access-Control-Allow-Origin')).to be false
|
224
|
+
end
|
150
225
|
end
|
151
226
|
end
|
152
227
|
end
|