qa 2.0.0 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.md +54 -6
- data/app/controllers/qa/application_controller.rb +24 -0
- data/app/controllers/qa/linked_data_terms_controller.rb +116 -51
- 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/authorities/linked_data/agrovoc.json +8 -1
- data/config/initializers/linked_data_authorities.rb +1 -17
- data/config/routes.rb +11 -0
- data/lib/generators/qa/apidoc/USAGE +11 -0
- data/lib/generators/qa/apidoc/apidoc_generator.rb +22 -0
- data/lib/generators/qa/apidoc/templates/public/qa/apidoc/apidoc.json +1322 -0
- data/lib/generators/qa/apidoc/templates/public/qa/apidoc/favicon-16x16.png +0 -0
- data/lib/generators/qa/apidoc/templates/public/qa/apidoc/favicon-32x32.png +0 -0
- data/lib/generators/qa/apidoc/templates/public/qa/apidoc/index.html +61 -0
- data/lib/generators/qa/apidoc/templates/public/qa/apidoc/oauth2-redirect.html +67 -0
- data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui-bundle.js +93 -0
- data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui-bundle.js.map +1 -0
- data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui-standalone-preset.js +14 -0
- data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui-standalone-preset.js.map +1 -0
- data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui.css +3 -0
- data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui.css.map +1 -0
- data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui.js +9 -0
- data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui.js.map +1 -0
- data/lib/generators/qa/install/install_generator.rb +11 -0
- data/lib/generators/qa/install/templates/config/initializers/qa.rb +13 -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/aat.rb +13 -6
- data/lib/qa/authorities/getty/tgn.rb +11 -22
- data/lib/qa/authorities/getty/ulan.rb +13 -16
- data/lib/qa/authorities/linked_data.rb +1 -0
- data/lib/qa/authorities/linked_data/authority_service.rb +47 -0
- data/lib/qa/authorities/linked_data/config.rb +9 -3
- data/lib/qa/authorities/linked_data/config/search_config.rb +16 -2
- data/lib/qa/authorities/linked_data/config/term_config.rb +17 -3
- data/lib/qa/authorities/linked_data/find_term.rb +4 -3
- data/lib/qa/authorities/linked_data/generic_authority.rb +8 -1
- 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/generic_authority.rb +2 -2
- 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 +34 -0
- data/lib/qa/version.rb +1 -1
- data/lib/tasks/mesh.rake +3 -3
- data/spec/controllers/linked_data_terms_controller_spec.rb +247 -18
- data/spec/controllers/terms_controller_spec.rb +87 -12
- data/spec/fixtures/authorities/linked_data/lod_encoding_config.json +91 -0
- data/spec/fixtures/authorities/linked_data/lod_term_id_param_config.json +27 -0
- data/spec/fixtures/authorities/linked_data/lod_term_uri_param_config.json +27 -0
- 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 +14 -8
- data/spec/lib/authorities/getty/tgn_spec.rb +8 -15
- data/spec/lib/authorities/getty/ulan_spec.rb +8 -6
- data/spec/lib/authorities/getty_spec.rb +2 -1
- data/spec/lib/authorities/linked_data/authority_service_spec.rb +47 -0
- data/spec/lib/authorities/linked_data/generic_authority_spec.rb +56 -14
- data/spec/lib/authorities/linked_data/search_config_spec.rb +33 -19
- data/spec/lib/authorities/linked_data/search_query_spec.rb +67 -15
- data/spec/lib/authorities/linked_data/term_config_spec.rb +34 -20
- data/spec/lib/authorities/loc_spec.rb +9 -9
- 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/configuration_spec.rb +58 -0
- 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 +167 -137
@@ -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")
|
@@ -8,11 +8,11 @@ describe Qa::Authorities::Local do
|
|
8
8
|
end
|
9
9
|
|
10
10
|
describe "#subauthorities_path" do
|
11
|
+
let!(:original_path) { described_class.config[:local_path] }
|
11
12
|
before do
|
12
|
-
@original_path = described_class.config[:local_path]
|
13
13
|
described_class.config[:local_path] = path
|
14
14
|
end
|
15
|
-
after { described_class.config[:local_path] =
|
15
|
+
after { described_class.config[:local_path] = original_path }
|
16
16
|
|
17
17
|
context "configured with a full path" do
|
18
18
|
let(:path) { "/full/path" }
|
@@ -25,8 +25,8 @@ describe Qa::Authorities::Local do
|
|
25
25
|
context "configured with a relative path" do
|
26
26
|
let(:path) { "relative/path" }
|
27
27
|
|
28
|
-
it "returns a path relative to the Rails
|
29
|
-
expect(described_class.subauthorities_path).to eq(
|
28
|
+
it "returns a path relative to the Rails application" do
|
29
|
+
expect(described_class.subauthorities_path).to eq(Rails.root.join(path).to_s)
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
@@ -37,11 +37,11 @@ describe Qa::Authorities::Local do
|
|
37
37
|
end
|
38
38
|
|
39
39
|
context "when the path doesn't exist" do
|
40
|
+
let!(:original_path) { described_class.config[:local_path] }
|
40
41
|
before do
|
41
|
-
@original_path = described_class.config[:local_path]
|
42
42
|
described_class.config[:local_path] = '/foo/bar'
|
43
43
|
end
|
44
|
-
after { described_class.config[:local_path] =
|
44
|
+
after { described_class.config[:local_path] = original_path }
|
45
45
|
|
46
46
|
it "raises an error" do
|
47
47
|
expect { described_class.names }.to raise_error Qa::ConfigDirectoryNotFound
|
@@ -70,8 +70,7 @@ describe Qa::Authorities::Local do
|
|
70
70
|
describe ".register" do
|
71
71
|
before do
|
72
72
|
class SolrAuthority
|
73
|
-
def initialize(one)
|
74
|
-
end
|
73
|
+
def initialize(one); end
|
75
74
|
end
|
76
75
|
described_class.register_subauthority('new_sub', 'SolrAuthority')
|
77
76
|
end
|
@@ -1,46 +1,53 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Qa::Authorities::Oclcts do
|
4
|
+
let(:first_query) { described_class.subauthority_for("mesh") }
|
5
|
+
let(:terms) { first_query.search("ball") }
|
6
|
+
let(:term_record) { first_query.find(terms.first["id"]) }
|
7
|
+
let(:second_query) { described_class.subauthority_for("mesh") }
|
8
|
+
|
4
9
|
before do
|
5
|
-
stub_request(:get, "http://tspilot.oclc.org/mesh/?maximumRecords=10&operation=searchRetrieve&query=oclcts
|
10
|
+
stub_request(:get, "http://tspilot.oclc.org/mesh/?maximumRecords=10&operation=searchRetrieve&query=oclcts" \
|
11
|
+
".rootHeading%20exact%20%22ball*%22&recordPacking=xml&recordSchema=" \
|
12
|
+
"http://zthes.z3950.org/xml/1.0/&recordXPath=&resultSetTTL=300&sortKeys=&startRecord=1&version=1.1")
|
6
13
|
.to_return(body: webmock_fixture("oclcts-response-mesh-1.txt"), status: 200)
|
7
|
-
stub_request(:get, "http://tspilot.oclc.org/mesh/?maximumRecords=10&operation=searchRetrieve&query=oclcts
|
14
|
+
stub_request(:get, "http://tspilot.oclc.org/mesh/?maximumRecords=10&operation=searchRetrieve&query=oclcts" \
|
15
|
+
".rootHeading%20exact%20%22alph*%22&recordPacking=xml&recordSchema=" \
|
16
|
+
"http://zthes.z3950.org/xml/1.0/&recordXPath=&resultSetTTL=300&sortKeys=&startRecord=1&version=1.1")
|
8
17
|
.to_return(body: webmock_fixture("oclcts-response-mesh-2.txt"), status: 200)
|
9
|
-
stub_request(:get, "http://tspilot.oclc.org/mesh/?maximumRecords=10&operation=searchRetrieve&query=dc
|
18
|
+
stub_request(:get, "http://tspilot.oclc.org/mesh/?maximumRecords=10&operation=searchRetrieve&query=dc" \
|
19
|
+
".identifier%20exact%20%22D031329Q000821%22&recordPacking=xml&recordSchema=" \
|
20
|
+
"http://zthes.z3950.org/xml/1.0/&recordXPath=&resultSetTTL=300&sortKeys=&startRecord=1&version=1.1")
|
10
21
|
.to_return(body: webmock_fixture("oclcts-response-mesh-3.txt"), status: 200)
|
11
22
|
|
12
|
-
|
13
|
-
@terms = @first_query.search("ball")
|
14
|
-
@term_record = @first_query.find(@terms.first["id"])
|
15
|
-
@second_query = described_class.subauthority_for("mesh")
|
16
|
-
@second_query.search("alph")
|
23
|
+
second_query.search("alph")
|
17
24
|
end
|
18
25
|
|
19
26
|
describe "a query for terms" do
|
20
27
|
it "has an array of hashes that match the query" do
|
21
|
-
expect(
|
22
|
-
expect(
|
23
|
-
expect(
|
24
|
-
expect(
|
28
|
+
expect(terms).to be_kind_of Array
|
29
|
+
expect(terms.first).to be_kind_of Hash
|
30
|
+
expect(terms.first["label"]).to be_kind_of String
|
31
|
+
expect(terms.first["label"]).to include "Ballota"
|
25
32
|
end
|
26
33
|
|
27
34
|
it "has an array of hashes containing unique id and label" do
|
28
|
-
expect(
|
29
|
-
expect(
|
35
|
+
expect(terms.first).to have_key("id")
|
36
|
+
expect(terms.first).to have_key("label")
|
30
37
|
end
|
31
38
|
end
|
32
39
|
|
33
40
|
describe "a query for a single item" do
|
34
41
|
it "has a hash of values that represent the item requested" do
|
35
|
-
expect(
|
36
|
-
expect(
|
37
|
-
expect(
|
42
|
+
expect(term_record).to be_kind_of Hash
|
43
|
+
expect(term_record.values).to include terms.first["id"]
|
44
|
+
expect(term_record.values).to include terms.first["label"]
|
38
45
|
end
|
39
46
|
|
40
47
|
it "succeeds for valid ids, even if the id is not in the initial list of responses" do
|
41
|
-
record =
|
42
|
-
expect(record.values).to include
|
43
|
-
expect(record.values).to include
|
48
|
+
record = second_query.find(terms.first["id"])
|
49
|
+
expect(record.values).to include terms.first["id"]
|
50
|
+
expect(record.values).to include terms.first["label"]
|
44
51
|
end
|
45
52
|
end
|
46
53
|
end
|
@@ -25,9 +25,11 @@ describe Qa::Authorities::Local::TableBasedAuthority do
|
|
25
25
|
end
|
26
26
|
|
27
27
|
describe "#all" do
|
28
|
-
let(:expected)
|
29
|
-
|
30
|
-
|
28
|
+
let(:expected) do
|
29
|
+
[{ 'id' => "A1", 'label' => "Abc Term A1" },
|
30
|
+
{ 'id' => "A2", 'label' => "Term A2" },
|
31
|
+
{ 'id' => "A3", 'label' => "Abc Term A3" }]
|
32
|
+
end
|
31
33
|
it "returns all the entries" do
|
32
34
|
expect(language.all).to eq [
|
33
35
|
{ "id" => "http://id.loc.gov/vocabulary/languages/fre", "label" => "French" },
|
@@ -10,7 +10,7 @@ describe Qa::Authorities::LocSubauthority do
|
|
10
10
|
|
11
11
|
context "with a valid subauthority" do
|
12
12
|
it "returns a url" do
|
13
|
-
subauthority_table.
|
13
|
+
subauthority_table.each_key do |authority|
|
14
14
|
expect(subject.get_url_for_authority(authority)).to eq(subauthority_table[authority])
|
15
15
|
end
|
16
16
|
end
|
@@ -24,7 +24,7 @@ describe Qa::Authorities::LocSubauthority do
|
|
24
24
|
|
25
25
|
# This is the original data structure that was used to define subauthority urls
|
26
26
|
# It is retained here to ensure our refactor succeeded
|
27
|
-
def subauthority_table
|
27
|
+
def subauthority_table # rubocop:disable Metrics/MethodLength
|
28
28
|
vocab_base_url = 'cs%3Ahttp%3A%2F%2Fid.loc.gov%2Fvocabulary%2F'
|
29
29
|
authority_base_url = 'cs%3Ahttp%3A%2F%2Fid.loc.gov%2Fauthorities%2F'
|
30
30
|
datatype_base_url = 'cs%3Ahttp%3A%2F%2Fid.loc.gov%2Fdatatypes%2F'
|
@@ -0,0 +1,58 @@
|
|
1
|
+
RSpec.describe Qa::Configuration do
|
2
|
+
subject { described_class.new }
|
3
|
+
|
4
|
+
it { is_expected.to respond_to(:cors_headers?) }
|
5
|
+
it { is_expected.to respond_to(:enable_cors_headers) }
|
6
|
+
it { is_expected.to respond_to(:disable_cors_headers) }
|
7
|
+
it { is_expected.to respond_to(:authorized_reload_token=) }
|
8
|
+
it { is_expected.to respond_to(:authorized_reload_token) }
|
9
|
+
it { is_expected.to respond_to(:valid_authority_reload_token?) }
|
10
|
+
|
11
|
+
describe '#enable_cors_headers' do
|
12
|
+
it 'turns on cors headers support' do
|
13
|
+
subject.enable_cors_headers
|
14
|
+
expect(subject.cors_headers?).to be true
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#disable_cors_headers' do
|
19
|
+
it 'turns off cors headers support' do
|
20
|
+
subject.disable_cors_headers
|
21
|
+
expect(subject.cors_headers?).to be false
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#valid_authority_reload_token?' do
|
26
|
+
it 'defaults to invalid' do
|
27
|
+
expect(subject.valid_authority_reload_token?('any value')).to be false
|
28
|
+
end
|
29
|
+
|
30
|
+
context 'when token is set to blank' do
|
31
|
+
before do
|
32
|
+
subject.authorized_reload_token = ''
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'returns false if token matches' do
|
36
|
+
expect(subject.valid_authority_reload_token?('')).to be false
|
37
|
+
end
|
38
|
+
|
39
|
+
it "returns false if token doesn't match" do
|
40
|
+
expect(subject.valid_authority_reload_token?('any value')).to be false
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'when token has a value' do
|
45
|
+
before do
|
46
|
+
subject.authorized_reload_token = 'A_TOKEN'
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'returns true if the passed in token matches' do
|
50
|
+
expect(subject.valid_authority_reload_token?('A_TOKEN')).to be true
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'returns false if the passed in token does not match' do
|
54
|
+
expect(subject.valid_authority_reload_token?('BAD TOKEN')).to be false
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -47,6 +47,7 @@ EOS
|
|
47
47
|
expect(records[1]).to eq({})
|
48
48
|
end
|
49
49
|
|
50
|
+
# rubocop:disable Metrics/LineLength
|
50
51
|
it 'parses a sample mesh file' do
|
51
52
|
mesh = described_class.new(webmock_fixture('mesh.txt'))
|
52
53
|
records = mesh.all_records
|
@@ -116,4 +117,5 @@ EOS
|
|
116
117
|
"DX" => ["19840101"],
|
117
118
|
"UI" => ["D000001"])
|
118
119
|
end
|
120
|
+
# rubocop:enable Metrics/LineLength
|
119
121
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
4
|
describe Qa::Services::RDFAuthorityParser do
|
5
|
-
let(:source) { [File.join(fixture_path, 'lexvo_snippet.rdf')] }
|
5
|
+
let(:source) { [File.join(fixture_path, 'lexvo_snippet.rdf.xml')] }
|
6
6
|
let(:format) { 'rdfxml' }
|
7
7
|
let(:predicate) { RDF::URI("http://www.w3.org/2008/05/skos#prefLabel") }
|
8
8
|
let(:name) { 'language' }
|
@@ -2,33 +2,34 @@ require 'spec_helper'
|
|
2
2
|
require 'rake'
|
3
3
|
require 'stringio'
|
4
4
|
|
5
|
-
describe "mesh rake tasks" do
|
5
|
+
describe "mesh rake tasks" do # rubocop:disable RSpec/DescribeClass
|
6
|
+
let(:rake) { Rake::Application.new }
|
6
7
|
before do
|
7
|
-
|
8
|
-
Rake.application
|
9
|
-
Rake.application.rake_require "mesh", ["#{Rails.root}/lib/tasks", "#{Rails.root}/../lib/tasks"], []
|
8
|
+
Rake.application = rake
|
9
|
+
Rake.application.rake_require "mesh", [Rails.root.join('lib', 'tasks'), Rails.root.join('..', 'lib', 'tasks')], []
|
10
10
|
Rake::Task.define_task(:environment) # rspec has loaded rails
|
11
11
|
end
|
12
12
|
|
13
13
|
describe "mesh:import" do
|
14
|
+
let(:task_name) { "mesh:import" }
|
15
|
+
let(:output) { StringIO.new }
|
14
16
|
before do
|
15
|
-
|
16
|
-
@output = StringIO.new
|
17
|
-
$stdout = @output
|
17
|
+
$stdout = output # rubocop:disable RSpec/ExpectOutput # TODO: Explore how to remove this disable
|
18
18
|
end
|
19
19
|
after :all do
|
20
20
|
$stdout = STDOUT
|
21
21
|
end
|
22
22
|
it "has 'environment' as a prereq" do
|
23
|
-
expect(
|
23
|
+
expect(rake[task_name].prerequisites).to include("environment")
|
24
24
|
end
|
25
25
|
it "requires $MESH_FILE to be set" do
|
26
26
|
old_mesh_file = ENV.delete('MESH_FILE')
|
27
|
-
|
28
|
-
|
29
|
-
expect(
|
27
|
+
rake[task_name].invoke
|
28
|
+
output.seek(0)
|
29
|
+
expect(output.read).to match(/Need to set \$MESH_FILE with path to file to ingest/)
|
30
30
|
ENV['MESH_FILE'] = old_mesh_file
|
31
31
|
end
|
32
|
+
|
32
33
|
describe "create or update" do
|
33
34
|
let(:input) { StringIO.new("*NEWRECORD\nUI = 5\nMH = test\n") }
|
34
35
|
let(:term) { Qa::SubjectMeshTerm.find_by_term_id(5) }
|
@@ -36,7 +37,7 @@ describe "mesh rake tasks" do
|
|
36
37
|
before do
|
37
38
|
ENV['MESH_FILE'] = "dummy"
|
38
39
|
allow(File).to receive(:open).with("dummy").and_yield(input)
|
39
|
-
|
40
|
+
rake[task_name].invoke
|
40
41
|
end
|
41
42
|
it "creates or update all records in the config file" do
|
42
43
|
expect(term).not_to be_nil
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
+
# rubocop:disable RSpec/InstanceVariable # TODO: Explore if there is a way to remove this disable
|
3
4
|
describe Qa::SubjectMeshTerm, type: :model do
|
4
5
|
before(:all) do
|
5
6
|
@term = Qa::SubjectMeshTerm.new
|
@@ -47,3 +48,4 @@ describe Qa::SubjectMeshTerm, type: :model do
|
|
47
48
|
# @term.parents.map { |p| p.term_id }.should == ["1", "2", "3"]
|
48
49
|
# end
|
49
50
|
end
|
51
|
+
# rubocop:enable RSpec/InstanceVariable
|
@@ -0,0 +1,118 @@
|
|
1
|
+
# spec/requests/cors_headers_spec.rb
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe "CORS OPTIONS requests" do # rubocop:disable RSpec/DescribeClass
|
5
|
+
context 'when cors headers are enabled' do
|
6
|
+
before do
|
7
|
+
Qa.config.enable_cors_headers
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'return CORS header info for index' do
|
11
|
+
reset!
|
12
|
+
integration_session.__send__ :process, 'OPTIONS', "/qa/terms/loc"
|
13
|
+
correct_cors_response?
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'return CORS header info for index with subauthority' do
|
17
|
+
reset!
|
18
|
+
integration_session.__send__ :process, 'OPTIONS', "/qa/terms/local/states"
|
19
|
+
correct_cors_response?
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'return CORS header info for search' do
|
23
|
+
reset!
|
24
|
+
integration_session.__send__ :process, 'OPTIONS', "/qa/search/loc"
|
25
|
+
correct_cors_response?
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'return CORS header info for search with subauthority' do
|
29
|
+
reset!
|
30
|
+
integration_session.__send__ :process, 'OPTIONS', "/qa/search/local/two_args?q=a query"
|
31
|
+
correct_cors_response?
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'return CORS header info for show' do
|
35
|
+
reset!
|
36
|
+
integration_session.__send__ :process, 'OPTIONS', "/qa/show/mesh/D000001"
|
37
|
+
correct_cors_response?
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'return CORS header info for show with subauthority' do
|
41
|
+
reset!
|
42
|
+
integration_session.__send__ :process, 'OPTIONS', "/qa/show/local/states/OH"
|
43
|
+
correct_cors_response?
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'return CORS header info for linked_data/search' do
|
47
|
+
reset!
|
48
|
+
integration_session.__send__ :process, 'OPTIONS', "/qa/search/linked_data/OCLC_FAST?q=my_query&maximumRecords=3"
|
49
|
+
correct_cors_response?
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'return CORS header info for linked_data/show' do
|
53
|
+
reset!
|
54
|
+
integration_session.__send__ :process, 'OPTIONS', "/qa/show/linked_data/OCLC_FAST/n24"
|
55
|
+
correct_cors_response?
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def correct_cors_response?
|
60
|
+
expect(response.code).to eq('204')
|
61
|
+
expect(response.headers['Access-Control-Allow-Origin']).to eq '*'
|
62
|
+
expect(response.headers['Access-Control-Allow-Methods']).to eq 'GET, OPTIONS'
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'when cors headers are disabled' do
|
66
|
+
before do
|
67
|
+
Qa.config.disable_cors_headers
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'report method not supported for index' do
|
71
|
+
reset!
|
72
|
+
integration_session.__send__ :process, 'OPTIONS', "/qa/terms/loc"
|
73
|
+
expect(response.code).to eq('501')
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'report method not supported for index with subauthority' do
|
77
|
+
reset!
|
78
|
+
integration_session.__send__ :process, 'OPTIONS', "/qa/terms/local/states"
|
79
|
+
expect(response.code).to eq('501')
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'report method not supported for search' do
|
83
|
+
reset!
|
84
|
+
integration_session.__send__ :process, 'OPTIONS', "/qa/search/loc"
|
85
|
+
expect(response.code).to eq('501')
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'report method not supported for search with subauthority' do
|
89
|
+
reset!
|
90
|
+
integration_session.__send__ :process, 'OPTIONS', "/qa/search/local/two_args?q=a query"
|
91
|
+
expect(response.code).to eq('501')
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'report method not supported for show' do
|
95
|
+
reset!
|
96
|
+
integration_session.__send__ :process, 'OPTIONS', "/qa/show/mesh/D000001"
|
97
|
+
expect(response.code).to eq('501')
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'report method not supported for show with subauthority' do
|
101
|
+
reset!
|
102
|
+
integration_session.__send__ :process, 'OPTIONS', "/qa/show/local/states/OH"
|
103
|
+
expect(response.code).to eq('501')
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'report method not supported for linked_data/search' do
|
107
|
+
reset!
|
108
|
+
integration_session.__send__ :process, 'OPTIONS', "/qa/search/linked_data/OCLC_FAST?q=my_query&maximumRecords=3"
|
109
|
+
expect(response.code).to eq('501')
|
110
|
+
end
|
111
|
+
|
112
|
+
it 'report method not supported for linked_data/show' do
|
113
|
+
reset!
|
114
|
+
integration_session.__send__ :process, 'OPTIONS', "/qa/show/linked_data/OCLC_FAST/n24"
|
115
|
+
expect(response.code).to eq('501')
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|