qa 1.0.0 → 1.1.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 (70) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +284 -2
  3. data/app/controllers/qa/linked_data_terms_controller.rb +127 -0
  4. data/config/authorities/linked_data/agrovoc.json +61 -0
  5. data/config/authorities/linked_data/loc.json +46 -0
  6. data/config/authorities/linked_data/oclc_fast.json +78 -0
  7. data/config/initializers/linked_data_authorities.rb +17 -0
  8. data/config/routes.rb +3 -0
  9. data/lib/qa.rb +15 -0
  10. data/lib/qa/authorities.rb +2 -0
  11. data/lib/qa/authorities/base.rb +1 -1
  12. data/lib/qa/authorities/crossref.rb +16 -0
  13. data/lib/qa/authorities/crossref/generic_authority.rb +63 -0
  14. data/lib/qa/authorities/geonames.rb +2 -1
  15. data/lib/qa/authorities/linked_data.rb +10 -0
  16. data/lib/qa/authorities/linked_data/config.rb +80 -0
  17. data/lib/qa/authorities/linked_data/config/search_config.rb +170 -0
  18. data/lib/qa/authorities/linked_data/config/term_config.rb +186 -0
  19. data/lib/qa/authorities/linked_data/find_term.rb +148 -0
  20. data/lib/qa/authorities/linked_data/generic_authority.rb +49 -0
  21. data/lib/qa/authorities/linked_data/rdf_helper.rb +102 -0
  22. data/lib/qa/authorities/linked_data/search_query.rb +143 -0
  23. data/lib/qa/version.rb +1 -1
  24. data/spec/controllers/linked_data_terms_controller_spec.rb +202 -0
  25. data/spec/fixtures/authorities/linked_data/lod_full_config.json +111 -0
  26. data/spec/fixtures/authorities/linked_data/lod_lang_defaults.json +54 -0
  27. data/spec/fixtures/authorities/linked_data/lod_lang_multi_defaults.json +54 -0
  28. data/spec/fixtures/authorities/linked_data/lod_lang_no_defaults.json +52 -0
  29. data/spec/fixtures/authorities/linked_data/lod_lang_param.json +66 -0
  30. data/spec/fixtures/authorities/linked_data/lod_min_config.json +49 -0
  31. data/spec/fixtures/authorities/linked_data/lod_search_only_config.json +55 -0
  32. data/spec/fixtures/authorities/linked_data/lod_sort.json +27 -0
  33. data/spec/fixtures/authorities/linked_data/lod_term_only_config.json +59 -0
  34. data/spec/fixtures/funders-find-response.json +1 -0
  35. data/spec/fixtures/funders-noquery.json +1 -0
  36. data/spec/fixtures/funders-noresults.json +1 -0
  37. data/spec/fixtures/funders-result.json +1 -0
  38. data/spec/fixtures/journals-find-response-two-issn.json +1 -0
  39. data/spec/fixtures/journals-find-response.json +1 -0
  40. data/spec/fixtures/journals-noquery.json +1 -0
  41. data/spec/fixtures/journals-noresults.json +1 -0
  42. data/spec/fixtures/journals-result.json +705 -0
  43. data/spec/fixtures/lod_agrovoc_query_many_results.json +1 -0
  44. data/spec/fixtures/lod_agrovoc_query_no_results.json +1 -0
  45. data/spec/fixtures/lod_agrovoc_term_found.rdf.xml +217 -0
  46. data/spec/fixtures/lod_lang_search_en.rdf.xml +42 -0
  47. data/spec/fixtures/lod_lang_search_enfr.rdf.xml +48 -0
  48. data/spec/fixtures/lod_lang_search_enfrde.rdf.xml +54 -0
  49. data/spec/fixtures/lod_lang_search_fr.rdf.xml +42 -0
  50. data/spec/fixtures/lod_lang_term_en.rdf.xml +65 -0
  51. data/spec/fixtures/lod_lang_term_enfr.rdf.xml +71 -0
  52. data/spec/fixtures/lod_lang_term_enfr_noalt.rdf.xml +69 -0
  53. data/spec/fixtures/lod_lang_term_enfrde.rdf.xml +79 -0
  54. data/spec/fixtures/lod_lang_term_fr.rdf.xml +65 -0
  55. data/spec/fixtures/lod_loc_term_found.rdf.xml +262 -0
  56. data/spec/fixtures/lod_oclc_all_query_3_results.rdf.xml +142 -0
  57. data/spec/fixtures/lod_oclc_personalName_query_3_results.rdf.xml +128 -0
  58. data/spec/fixtures/lod_oclc_query_no_results.rdf.xml +13 -0
  59. data/spec/fixtures/lod_oclc_term_found.rdf.xml +51 -0
  60. data/spec/lib/authorities/crossref_spec.rb +180 -0
  61. data/spec/lib/authorities/geonames_spec.rb +2 -2
  62. data/spec/lib/authorities/linked_data/config_spec.rb +143 -0
  63. data/spec/lib/authorities/linked_data/find_term_spec.rb +5 -0
  64. data/spec/lib/authorities/linked_data/generic_authority_spec.rb +580 -0
  65. data/spec/lib/authorities/linked_data/search_config_spec.rb +385 -0
  66. data/spec/lib/authorities/linked_data/search_query_spec.rb +79 -0
  67. data/spec/lib/authorities/linked_data/term_config_spec.rb +419 -0
  68. data/spec/routing/linked_data_route_spec.rb +35 -0
  69. data/spec/spec_helper.rb +2 -0
  70. metadata +184 -39
@@ -28,9 +28,9 @@ describe Qa::Authorities::Geonames do
28
28
 
29
29
  context "with default label" do
30
30
  it "has id and label keys" do
31
- expect(subject.first).to eq("id" => 'http://sws.geonames.org/2088122',
31
+ expect(subject.first).to eq("id" => 'http://sws.geonames.org/2088122/',
32
32
  "label" => "Port Moresby, National Capital, Papua New Guinea")
33
- expect(subject.last).to eq("id" => 'http://sws.geonames.org/377039',
33
+ expect(subject.last).to eq("id" => 'http://sws.geonames.org/377039/',
34
34
  "label" => "Port Sudan, Red Sea, Sudan")
35
35
  expect(subject.size).to eq(10)
36
36
  end
@@ -0,0 +1,143 @@
1
+ require 'spec_helper'
2
+
3
+ describe Qa::Authorities::LinkedData::Config do
4
+ let(:full_config) { described_class.new(:LOD_FULL_CONFIG) }
5
+
6
+ describe '#new' do
7
+ context 'without an authority' do
8
+ it 'raises an exception' do
9
+ expect { described_class.new }.to raise_error ArgumentError, /wrong number of arguments/
10
+ end
11
+ end
12
+ context 'with an invalid authority' do
13
+ it 'raises an exception' do
14
+ expect { described_class.new(:FOO) }.to raise_error Qa::InvalidLinkedDataAuthority, /Unable to initialize linked data authority 'FOO'/
15
+ end
16
+ end
17
+ context 'with a valid authority' do
18
+ it 'creates the authority' do
19
+ expect(described_class.new(:OCLC_FAST)).to be_kind_of described_class
20
+ end
21
+ end
22
+ end
23
+
24
+ describe '#auth_config' do
25
+ let(:full_auth_config) do
26
+ {
27
+ term: {
28
+ url: {
29
+ :@context => 'http://www.w3.org/ns/hydra/context.jsonld',
30
+ :@type => 'IriTemplate',
31
+ template: 'http://localhost/test_default/term/{?subauth}/{?term_id}?param1={?param1}&param2={?param2}',
32
+ variableRepresentation: 'BasicRepresentation',
33
+ mapping: [
34
+ {
35
+ :@type => 'IriTemplateMapping',
36
+ variable: 'term_id',
37
+ property: 'hydra:freetextQuery',
38
+ required: true
39
+ },
40
+ {
41
+ :@type => 'IriTemplateMapping',
42
+ variable: 'subauth',
43
+ property: 'hydra:freetextQuery',
44
+ required: false,
45
+ default: 'term_sub2_name'
46
+ },
47
+ {
48
+ :@type => 'IriTemplateMapping',
49
+ variable: 'param1',
50
+ property: 'hydra:freetextQuery',
51
+ required: false,
52
+ default: 'alpha'
53
+ },
54
+ {
55
+ :@type => 'IriTemplateMapping',
56
+ variable: 'param2',
57
+ property: 'hydra:freetextQuery',
58
+ required: false,
59
+ default: 'beta'
60
+ }
61
+ ]
62
+ },
63
+ qa_replacement_patterns: {
64
+ term_id: 'term_id',
65
+ subauth: 'subauth'
66
+ },
67
+ term_id: 'ID',
68
+ language: ['en'],
69
+ results: {
70
+ id_predicate: 'http://purl.org/dc/terms/identifier',
71
+ label_predicate: 'http://www.w3.org/2004/02/skos/core#prefLabel',
72
+ altlabel_predicate: 'http://www.w3.org/2004/02/skos/core#altLabel',
73
+ broader_predicate: 'http://www.w3.org/2004/02/skos/core#broader',
74
+ narrower_predicate: 'http://www.w3.org/2004/02/skos/core#narrower',
75
+ sameas_predicate: 'http://www.w3.org/2004/02/skos/core#exactMatch'
76
+ },
77
+ subauthorities: {
78
+ term_sub1_key: 'term_sub1_name',
79
+ term_sub2_key: 'term_sub2_name',
80
+ term_sub3_key: 'term_sub3_name'
81
+ }
82
+ },
83
+ search: {
84
+ url: {
85
+ :@context => 'http://www.w3.org/ns/hydra/context.jsonld',
86
+ :@type => 'IriTemplate',
87
+ template: 'http://localhost/test_default/search?subauth={?subauth}&query={?query}&param1={?param1}&param2={?param2}',
88
+ variableRepresentation: 'BasicRepresentation',
89
+ mapping: [
90
+ {
91
+ :@type => 'IriTemplateMapping',
92
+ variable: 'query',
93
+ property: 'hydra:freetextQuery',
94
+ required: true
95
+ },
96
+ {
97
+ :@type => 'IriTemplateMapping',
98
+ variable: 'subauth',
99
+ property: 'hydra:freetextQuery',
100
+ required: false,
101
+ default: 'search_sub1_name'
102
+ },
103
+ {
104
+ :@type => 'IriTemplateMapping',
105
+ variable: 'param1',
106
+ property: 'hydra:freetextQuery',
107
+ required: false,
108
+ default: 'delta'
109
+ },
110
+ {
111
+ :@type => 'IriTemplateMapping',
112
+ variable: 'param2',
113
+ property: 'hydra:freetextQuery',
114
+ required: false,
115
+ default: 'echo'
116
+ }
117
+ ]
118
+ },
119
+ qa_replacement_patterns: {
120
+ query: 'query',
121
+ subauth: 'subauth'
122
+ },
123
+ language: ['en', 'fr', 'de'],
124
+ results: {
125
+ id_predicate: 'http://purl.org/dc/terms/identifier',
126
+ label_predicate: 'http://www.w3.org/2004/02/skos/core#prefLabel',
127
+ altlabel_predicate: 'http://www.w3.org/2004/02/skos/core#altLabel',
128
+ sort_predicate: 'http://www.w3.org/2004/02/skos/core#prefLabel'
129
+ },
130
+ subauthorities: {
131
+ search_sub1_key: 'search_sub1_name',
132
+ search_sub2_key: 'search_sub2_name',
133
+ search_sub3_key: 'search_sub3_name'
134
+ }
135
+ }
136
+ }
137
+ end
138
+
139
+ it 'returns hash of the full authority configuration' do
140
+ expect(full_config.auth_config).to eq full_auth_config
141
+ end
142
+ end
143
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Qa::Authorities::LinkedData::FindTerm do
4
+ it "should have tests"
5
+ end
@@ -0,0 +1,580 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Qa::Authorities::LinkedData::GenericAuthority do
4
+ describe '#search' do
5
+ let(:lod_oclc) { described_class.new(:OCLC_FAST) }
6
+ let(:lod_agrovoc) { described_class.new(:AGROVOC) }
7
+
8
+ context 'in OCLC_FAST authority' do
9
+ context '0 search results' do
10
+ let :results do
11
+ stub_request(:get, 'http://experimental.worldcat.org/fast/search?maximumRecords=3&query=cql.any%20all%20%22supercalifragilisticexpialidocious%22&sortKeys=usage')
12
+ .to_return(status: 200, body: webmock_fixture('lod_oclc_query_no_results.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
13
+ lod_oclc.search('supercalifragilisticexpialidocious', replacements: { 'maximumRecords' => '3' })
14
+ end
15
+ it 'returns an empty array' do
16
+ expect(results).to eq([])
17
+ end
18
+ end
19
+
20
+ context '3 search results' do
21
+ let :results do
22
+ stub_request(:get, 'http://experimental.worldcat.org/fast/search?maximumRecords=3&query=cql.any%20all%20%22cornell%22&sortKeys=usage')
23
+ .to_return(status: 200, body: webmock_fixture('lod_oclc_all_query_3_results.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
24
+ lod_oclc.search('cornell', replacements: { 'maximumRecords' => '3' })
25
+ end
26
+ it 'is correctly parsed' do
27
+ expect(results.count).to eq(3)
28
+ expect(results.first).to eq(uri: 'http://id.worldcat.org/fast/530369', id: '530369', label: 'Cornell University')
29
+ expect(results.second).to eq(uri: 'http://id.worldcat.org/fast/5140', id: '5140', label: 'Cornell, Joseph')
30
+ expect(results.third).to eq(uri: 'http://id.worldcat.org/fast/557490', id: '557490', label: 'New York State School of Industrial and Labor Relations')
31
+ end
32
+ end
33
+ end
34
+
35
+ context 'in OCLC_FAST authority and personal_name subauthority' do
36
+ context '0 search results' do
37
+ let :results do
38
+ stub_request(:get, 'http://experimental.worldcat.org/fast/search?maximumRecords=3&query=oclc.personalName%20all%20%22supercalifragilisticexpialidocious%22&sortKeys=usage')
39
+ .to_return(status: 200, body: webmock_fixture('lod_oclc_query_no_results.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
40
+ lod_oclc.search('supercalifragilisticexpialidocious', subauth: 'personal_name', replacements: { 'maximumRecords' => '3' })
41
+ end
42
+ it 'returns an empty array' do
43
+ expect(results).to eq([])
44
+ end
45
+ end
46
+
47
+ context '3 search results' do
48
+ let :results do
49
+ stub_request(:get, 'http://experimental.worldcat.org/fast/search?maximumRecords=3&query=oclc.personalName%20all%20%22cornell%22&sortKeys=usage')
50
+ .to_return(status: 200, body: webmock_fixture('lod_oclc_personalName_query_3_results.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
51
+ lod_oclc.search('cornell', subauth: 'personal_name', replacements: { 'maximumRecords' => '3' })
52
+ end
53
+ it 'is correctly parsed' do
54
+ expect(results.count).to eq(3)
55
+ expect(results.first).to eq(uri: 'http://id.worldcat.org/fast/409667', id: '409667', label: 'Cornell, Ezra, 1807-1874')
56
+ expect(results.second).to eq(uri: 'http://id.worldcat.org/fast/5140', id: '5140', label: 'Cornell, Joseph')
57
+ expect(results.third).to eq(uri: 'http://id.worldcat.org/fast/72456', id: '72456', label: 'Cornell, Sarah Maria, 1802-1832')
58
+ end
59
+ end
60
+ end
61
+
62
+ context 'in AGROVOC authority' do
63
+ context '0 search results' do
64
+ let :results do
65
+ stub_request(:get, 'http://aims.fao.org/skosmos/rest/v1/search/?lang=en&query=*supercalifragilisticexpialidocious*')
66
+ .to_return(status: 200, body: webmock_fixture('lod_agrovoc_query_no_results.json'), headers: { 'Content-Type' => 'application/json' })
67
+ lod_agrovoc.search('supercalifragilisticexpialidocious')
68
+ end
69
+ it 'returns an empty array' do
70
+ expect(results).to eq([])
71
+ end
72
+ end
73
+
74
+ context '3 search results' do
75
+ let :results do
76
+ stub_request(:get, 'http://aims.fao.org/skosmos/rest/v1/search/?lang=en&query=*milk*')
77
+ .to_return(status: 200, body: webmock_fixture('lod_agrovoc_query_many_results.json'), headers: { 'Content-Type' => 'application/json' })
78
+ lod_agrovoc.search('milk')
79
+ end
80
+ it 'is correctly parsed' do
81
+ expect(results.count).to eq(64)
82
+ expect(results.first).to eq(uri: 'http://aims.fao.org/aos/agrovoc/c_8602', id: 'http://aims.fao.org/aos/agrovoc/c_8602', label: 'acidophilus milk')
83
+ expect(results.second).to eq(uri: 'http://aims.fao.org/aos/agrovoc/c_16076', id: 'http://aims.fao.org/aos/agrovoc/c_16076', label: 'buffalo milk')
84
+ expect(results.third).to eq(uri: 'http://aims.fao.org/aos/agrovoc/c_9513', id: 'http://aims.fao.org/aos/agrovoc/c_9513', label: 'buttermilk')
85
+ end
86
+ end
87
+ end
88
+
89
+ # context 'in LOC authority' do
90
+ # ###################################
91
+ # ### SEARCH NOT SUPPORTED BY LOC ###
92
+ # ###################################
93
+ # # let(:lod_loc) { Qa::Authorities::LinkedData::GenericAuthority.new(:LOC) }
94
+ # end
95
+
96
+ describe "language processing" do
97
+ context "when filtering #search results" do
98
+ context "and lang NOT passed in" do
99
+ context "and NO default defined in config" do
100
+ let(:lod_lang_no_defaults) { described_class.new(:LOD_LANG_NO_DEFAULTS) }
101
+ let :results do
102
+ stub_request(:get, "http://localhost/test_no_default/search?query=milk")
103
+ .to_return(status: 200, body: webmock_fixture("lod_lang_search_enfr.rdf.xml"), headers: { 'Content-Type' => 'application/rdf+xml' })
104
+ lod_lang_no_defaults.search('milk')
105
+ end
106
+ it "is not filtered" do
107
+ expect(results.first[:label]).to eq('[buttermilk, Babeurre] (yummy, délicieux)')
108
+ expect(results.second[:label]).to eq('[condensed milk, lait condensé] (creamy, crémeux)')
109
+ expect(results.third[:label]).to eq('[dried milk, lait en poudre] (powdery, poudreux)')
110
+ end
111
+ end
112
+
113
+ context "and default IS defined in config" do
114
+ let(:lod_lang_defaults) { described_class.new(:LOD_LANG_DEFAULTS) }
115
+ let :results do
116
+ stub_request(:get, "http://localhost/test_default/search?query=milk")
117
+ .to_return(status: 200, body: webmock_fixture("lod_lang_search_enfr.rdf.xml"), headers: { 'Content-Type' => 'application/rdf+xml' })
118
+ lod_lang_defaults.search('milk')
119
+ end
120
+ it "is filtered to default" do
121
+ expect(results.first[:label]).to eq('buttermilk (yummy)')
122
+ expect(results.second[:label]).to eq('condensed milk (creamy)')
123
+ expect(results.third[:label]).to eq('dried milk (powdery)')
124
+ end
125
+ end
126
+ end
127
+
128
+ context "and multiple defaults ARE defined in config" do
129
+ let(:lod_lang_multi_defaults) { described_class.new(:LOD_LANG_MULTI_DEFAULTS) }
130
+ let :results do
131
+ stub_request(:get, "http://localhost/test_default/search?query=milk")
132
+ .to_return(status: 200, body: webmock_fixture("lod_lang_search_enfrde.rdf.xml"), headers: { 'Content-Type' => 'application/rdf+xml' })
133
+ lod_lang_multi_defaults.search('milk')
134
+ end
135
+ it "is filtered to default" do
136
+ expect(results.first[:label]).to eq('[buttermilk, Babeurre] (yummy, délicieux)')
137
+ expect(results.second[:label]).to eq('[condensed milk, lait condensé] (creamy, crémeux)')
138
+ expect(results.third[:label]).to eq('[dried milk, lait en poudre] (powdery, poudreux)')
139
+ end
140
+ end
141
+
142
+ context "and lang IS passed in" do
143
+ let(:lod_lang_defaults) { described_class.new(:LOD_LANG_DEFAULTS) }
144
+ let :results do
145
+ stub_request(:get, "http://localhost/test_default/search?query=milk")
146
+ .to_return(status: 200, body: webmock_fixture("lod_lang_search_enfr.rdf.xml"), headers: { 'Content-Type' => 'application/rdf+xml' })
147
+ lod_lang_defaults.search('milk', language: :fr)
148
+ end
149
+ it "is filtered to specified language" do
150
+ expect(results.first[:label]).to eq('Babeurre (délicieux)')
151
+ expect(results.second[:label]).to eq('lait condensé (crémeux)')
152
+ expect(results.third[:label]).to eq('lait en poudre (poudreux)')
153
+ end
154
+ end
155
+
156
+ context "when replacement on authority search URL" do
157
+ context "and using default" do
158
+ let(:lod_lang_param) { described_class.new(:LOD_LANG_PARAM) }
159
+ let :results do
160
+ stub_request(:get, "http://localhost/test_replacement/search?lang=en&query=milk")
161
+ .to_return(status: 200, body: webmock_fixture("lod_lang_search_en.rdf.xml"), headers: { 'Content-Type' => 'application/rdf+xml' })
162
+ lod_lang_param.search("milk")
163
+ end
164
+ it "is correctly parsed" do
165
+ expect(results.first[:label]).to eq('buttermilk (yummy)')
166
+ expect(results.second[:label]).to eq('condensed milk (creamy)')
167
+ expect(results.third[:label]).to eq('dried milk (powdery)')
168
+ end
169
+ end
170
+
171
+ context "and lang specified" do
172
+ let(:lod_lang_param) { described_class.new(:LOD_LANG_PARAM) }
173
+ let :results do
174
+ stub_request(:get, "http://localhost/test_replacement/search?query=milk&lang=fr")
175
+ .to_return(status: 200, body: webmock_fixture("lod_lang_search_fr.rdf.xml"), headers: { 'Content-Type' => 'application/rdf+xml' })
176
+ lod_lang_param.search("milk", replacements: { 'lang' => 'fr' })
177
+ end
178
+ it "is correctly parsed" do
179
+ expect(results.first[:label]).to eq('Babeurre (délicieux)')
180
+ expect(results.second[:label]).to eq('lait condensé (crémeux)')
181
+ expect(results.third[:label]).to eq('lait en poudre (poudreux)')
182
+ end
183
+ end
184
+ end
185
+ end
186
+ end
187
+ end
188
+
189
+ describe '#find' do
190
+ let(:lod_oclc) { described_class.new(:OCLC_FAST) }
191
+ let(:lod_agrovoc) { described_class.new(:AGROVOC) }
192
+ let(:lod_loc) { described_class.new(:LOC) }
193
+
194
+ context 'basic parameter testing' do
195
+ context 'with bad id' do
196
+ before do
197
+ stub_request(:get, 'http://id.worldcat.org/fast/FAKE_ID')
198
+ .to_return(status: 404, body: '', headers: {})
199
+ end
200
+ it 'raises a TermNotFound exception' do
201
+ expect { lod_oclc.find('FAKE_ID') }.to raise_error Qa::TermNotFound, /.*\/FAKE_ID\ Not Found - Term may not exist at LOD Authority./
202
+ end
203
+ end
204
+
205
+ # context 'with language specified' do
206
+ # before do
207
+ # stub_request(:get, 'http://id.worldcat.org/fast/FAKE_ID')
208
+ # .to_return(status: 404, body: '', headers: {})
209
+ # end
210
+ # it 'raises a TermNotFound exception' do
211
+ # expect { lod_oclc.find('FAKE_ID', language: :en) }.to raise_error Qa::TermNotFound, /.*\/FAKE_ID\ Not Found - Term may not exist at LOD Authority./
212
+ # end
213
+ # end
214
+ #
215
+ # context 'with replacements specified' do
216
+ # before do
217
+ # stub_request(:get, 'http://id.worldcat.org/fast/FAKE_ID')
218
+ # .to_return(status: 404, body: '', headers: {})
219
+ # end
220
+ # it 'raises a TermNotFound exception' do
221
+ # expect { lod_oclc.find('FAKE_ID') }.to raise_error Qa::TermNotFound, /.*\/FAKE_ID\ Not Found - Term may not exist at LOD Authority./
222
+ # end
223
+ # end
224
+ #
225
+ # context 'with subauth specified' do
226
+ # before do
227
+ # stub_request(:get, 'http://id.worldcat.org/fast/FAKE_ID')
228
+ # .to_return(status: 404, body: '', headers: {})
229
+ # end
230
+ # it 'raises a TermNotFound exception' do
231
+ # expect { lod_oclc.find('FAKE_ID') }.to raise_error Qa::TermNotFound, /.*\/FAKE_ID\ Not Found - Term may not exist at LOD Authority./
232
+ # end
233
+ # end
234
+ end
235
+
236
+ context 'in OCLC_FAST authority' do
237
+ context 'term found' do
238
+ let :results do
239
+ stub_request(:get, 'http://id.worldcat.org/fast/530369')
240
+ .to_return(status: 200, body: webmock_fixture('lod_oclc_term_found.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
241
+ lod_oclc.find('530369')
242
+ end
243
+ it 'has correct primary predicate values' do
244
+ expect(results[:uri]).to eq('http://id.worldcat.org/fast/530369')
245
+ expect(results[:id]).to eq('530369')
246
+ expect(results[:label]).to eq ['Cornell University']
247
+ expect(results[:altlabel]).to include('Ithaca (N.Y.). Cornell University', "Kornel\\xCA\\xB9skii universitet", "K\\xCA\\xBBang-nai-erh ta hs\\xC3\\xBCeh")
248
+ expect(results[:altlabel].size).to eq 3
249
+ expect(results[:sameas]).to include('http://id.loc.gov/authorities/names/n79021621', 'https://viaf.org/viaf/126293486')
250
+ end
251
+
252
+ it 'has correct number of predicates in pred-obj list' do
253
+ expect(results['predicates'].count).to eq 7
254
+ end
255
+
256
+ it 'has primary predicates in pred-obj list' do
257
+ expect(results['predicates']['http://purl.org/dc/terms/identifier']).to eq ['530369']
258
+ expect(results['predicates']['http://www.w3.org/2004/02/skos/core#prefLabel']).to eq ['Cornell University']
259
+ expect(results['predicates']['http://www.w3.org/2004/02/skos/core#altLabel']).to include('Ithaca (N.Y.). Cornell University', "Kornel\\xCA\\xB9skii universitet", "K\\xCA\\xBBang-nai-erh ta hs\\xC3\\xBCeh")
260
+ expect(results['predicates']['http://schema.org/sameAs']).to include('http://id.loc.gov/authorities/names/n79021621', 'https://viaf.org/viaf/126293486')
261
+ end
262
+
263
+ it 'has unspecified predicate values' do
264
+ expect(results['predicates']['http://www.w3.org/1999/02/22-rdf-syntax-ns#type']).to eq ['http://schema.org/Organization']
265
+ expect(results['predicates']['http://www.w3.org/2004/02/skos/core#inScheme']).to include('http://id.worldcat.org/fast/ontology/1.0/#fast', 'http://id.worldcat.org/fast/ontology/1.0/#facet-Corporate')
266
+ expect(results['predicates']['http://schema.org/name']).to include('Cornell University', 'Ithaca (N.Y.). Cornell University', "Kornel\\xCA\\xB9skii universitet", "K\\xCA\\xBBang-nai-erh ta hs\\xC3\\xBCeh")
267
+ end
268
+ end
269
+ end
270
+
271
+ context 'in AGROVOC authority' do
272
+ context 'term found' do
273
+ let :results do
274
+ stub_request(:get, 'http://aims.fao.org/skosmos/rest/v1/data?uri=http://aims.fao.org/aos/agrovoc/c_9513')
275
+ .to_return(status: 200, body: webmock_fixture('lod_agrovoc_term_found.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
276
+ lod_agrovoc.find('c_9513')
277
+ end
278
+ it 'has correct primary predicate values' do
279
+ expect(results[:uri]).to eq('http://aims.fao.org/aos/agrovoc/c_9513')
280
+ expect(results[:id]).to eq('http://aims.fao.org/aos/agrovoc/c_9513')
281
+ expect(results[:label]).to eq ['buttermilk']
282
+ expect(results[:broader]).to eq ['http://aims.fao.org/aos/agrovoc/c_4830']
283
+ expect(results[:sameas]).to include('http://cat.aii.caas.cn/concept/c_26308', 'http://lod.nal.usda.gov/nalt/20627', 'http://d-nb.info/gnd/4147072-2')
284
+ end
285
+
286
+ it 'has correct number of predicates in pred-obj list' do
287
+ expect(results['predicates'].count).to eq 12
288
+ end
289
+
290
+ it 'has primary predicates in pred-obj list' do
291
+ expect(results['predicates']['http://www.w3.org/2004/02/skos/core#prefLabel']).to eq ['buttermilk']
292
+ expect(results['predicates']['http://www.w3.org/2004/02/skos/core#broader']).to eq ['http://aims.fao.org/aos/agrovoc/c_4830']
293
+ expect(results['predicates']['http://www.w3.org/2004/02/skos/core#exactMatch']).to include('http://cat.aii.caas.cn/concept/c_26308', 'http://lod.nal.usda.gov/nalt/20627', 'http://d-nb.info/gnd/4147072-2')
294
+ end
295
+
296
+ it 'has skos predicate values' do
297
+ expect(results['predicates']['http://www.w3.org/2008/05/skos-xl#prefLabel']).to include('http://aims.fao.org/aos/agrovoc/xl_es_1299487482038', 'http://aims.fao.org/aos/agrovoc/xl_it_1299487482154', 'http://aims.fao.org/aos/agrovoc/xl_ko_1299487482210', 'http://aims.fao.org/aos/agrovoc/xl_pl_1299487482273', 'http://aims.fao.org/aos/agrovoc/xl_sk_1299487482378', 'http://aims.fao.org/aos/agrovoc/xl_en_1299487482019', 'http://aims.fao.org/aos/agrovoc/xl_tr_9513_1321792194941', 'http://aims.fao.org/aos/agrovoc/xl_de_1299487482000', 'http://aims.fao.org/aos/agrovoc/xl_fa_1299487482058', 'http://aims.fao.org/aos/agrovoc/xl_th_1299487482417', 'http://aims.fao.org/aos/agrovoc/xl_fr_1299487482080', 'http://aims.fao.org/aos/agrovoc/xl_hi_1299487482102', 'http://aims.fao.org/aos/agrovoc/xl_ar_1299487481966', 'http://aims.fao.org/aos/agrovoc/xl_ja_1299487482181', 'http://aims.fao.org/aos/agrovoc/xl_lo_1299487482240', 'http://aims.fao.org/aos/agrovoc/xl_ru_1299487482341', 'http://aims.fao.org/aos/agrovoc/xl_cs_1299487481982', 'http://aims.fao.org/aos/agrovoc/xl_zh_1299487482458', 'http://aims.fao.org/aos/agrovoc/xl_pt_1299487482307', 'http://aims.fao.org/aos/agrovoc/xl_hu_1299487482127')
298
+ expect(results['predicates']['http://www.w3.org/2004/02/skos/core#inScheme']).to eq ['http://aims.fao.org/aos/agrovoc']
299
+ expect(results['predicates']['http://www.w3.org/2004/02/skos/core#closeMatch']).to eq ['http://dbpedia.org/resource/Buttermilk']
300
+ expect(results['predicates']['http://www.w3.org/2008/05/skos-xl#altLabel']).to eq ['http://aims.fao.org/aos/agrovoc/xl_fa_1299487482544']
301
+ end
302
+
303
+ it 'has more unspecified predicate values' do
304
+ expect(results['predicates']['http://www.w3.org/1999/02/22-rdf-syntax-ns#type']).to eq ['http://www.w3.org/2004/02/skos/core#Concept']
305
+ expect(results['predicates']['http://purl.org/dc/terms/created']).to eq ['2011-11-20T20:29:54Z']
306
+ expect(results['predicates']['http://purl.org/dc/terms/modified']).to eq ['2014-07-03T18:51:03Z']
307
+ expect(results['predicates']['http://rdfs.org/ns/void#inDataset']).to eq ['http://aims.fao.org/aos/agrovoc/void.ttl#Agrovoc']
308
+ expect(results['predicates']['http://art.uniroma2.it/ontologies/vocbench#hasStatus']).to eq ['Published']
309
+ end
310
+ end
311
+ end
312
+
313
+ context 'in LOC authority' do
314
+ context 'term found' do
315
+ let :results do
316
+ stub_request(:get, 'http://id.loc.gov/authorities/subjects/sh85118553')
317
+ .to_return(status: 200, body: webmock_fixture('lod_loc_term_found.rdf.xml'), headers: { 'Content-Type' => 'application/rdf+xml' })
318
+ lod_loc.find('sh85118553', subauth: 'subjects')
319
+ end
320
+ it 'has correct primary predicate values' do
321
+ expect(results[:uri]).to eq 'http://id.loc.gov/authorities/subjects/sh85118553'
322
+ expect(results[:id]).to eq 'sh 85118553'
323
+ expect(results[:label]).to eq ['Science']
324
+ expect(results[:altlabel]).to include('Natural science', 'Science of science', 'Sciences')
325
+ end
326
+
327
+ it 'has correct number of predicates in pred-obj list' do
328
+ expect(results['predicates'].count).to eq 14
329
+ end
330
+
331
+ it 'has primary predicates in pred-obj list' do
332
+ expect(results['predicates']['http://id.loc.gov/vocabulary/identifiers/lccn']).to eq ['sh 85118553']
333
+ expect(results['predicates']['http://www.loc.gov/mads/rdf/v1#authoritativeLabel']).to eq ['Science']
334
+ expect(results['predicates']['http://www.w3.org/2004/02/skos/core#prefLabel']).to eq ['Science']
335
+ expect(results['predicates']['http://www.w3.org/2004/02/skos/core#altLabel']).to include('Natural science', 'Science of science', 'Sciences')
336
+ end
337
+
338
+ it 'has loc mads predicate values' do
339
+ expect(results['predicates']['http://www.loc.gov/mads/rdf/v1#classification']).to eq ['Q']
340
+ expect(results['predicates']['http://www.loc.gov/mads/rdf/v1#isMemberOfMADSCollection']).to include('http://id.loc.gov/authorities/subjects/collection_LCSHAuthorizedHeadings', 'http://id.loc.gov/authorities/subjects/collection_LCSH_General', 'http://id.loc.gov/authorities/subjects/collection_SubdivideGeographically')
341
+ expect(results['predicates']['http://www.loc.gov/mads/rdf/v1#hasCloseExternalAuthority']).to include('http://data.bnf.fr/ark:/12148/cb12321484k', 'http://data.bnf.fr/ark:/12148/cb119673416', 'http://data.bnf.fr/ark:/12148/cb119934236', 'http://data.bnf.fr/ark:/12148/cb12062047t', 'http://data.bnf.fr/ark:/12148/cb119469567', 'http://data.bnf.fr/ark:/12148/cb11933232c', 'http://data.bnf.fr/ark:/12148/cb122890536', 'http://data.bnf.fr/ark:/12148/cb121155321', 'http://data.bnf.fr/ark:/12148/cb15556043g', 'http://data.bnf.fr/ark:/12148/cb123662513', 'http://d-nb.info/gnd/4066562-8', 'http://data.bnf.fr/ark:/12148/cb120745812', 'http://data.bnf.fr/ark:/12148/cb11973101n', 'http://data.bnf.fr/ark:/12148/cb13328497r')
342
+ expect(results['predicates']['http://www.loc.gov/mads/rdf/v1#isMemberOfMADSScheme']).to eq ['http://id.loc.gov/authorities/subjects']
343
+ expect(results['predicates']['http://www.loc.gov/mads/rdf/v1#editorialNote']).to eq ['headings beginning with the word [Scientific;] and subdivision [Science] under ethnic groups and individual wars, e.g. [World War, 1939-1945--Science]']
344
+ end
345
+
346
+ it 'has more unspecified predicate values' do
347
+ expect(results['predicates']['http://www.w3.org/1999/02/22-rdf-syntax-ns#type']).to include('http://www.loc.gov/mads/rdf/v1#Topic', 'http://www.loc.gov/mads/rdf/v1#Authority', 'http://www.w3.org/2004/02/skos/core#Concept')
348
+ expect(results['predicates']['http://www.w3.org/2002/07/owl#sameAs']).to include('info:lc/authorities/sh85118553', 'http://id.loc.gov/authorities/sh85118553#concept')
349
+ expect(results['predicates']['http://www.w3.org/2004/02/skos/core#closeMatch']).to include('http://data.bnf.fr/ark:/12148/cb12321484k', 'http://data.bnf.fr/ark:/12148/cb119673416', 'http://data.bnf.fr/ark:/12148/cb119934236', 'http://data.bnf.fr/ark:/12148/cb12062047t', 'http://data.bnf.fr/ark:/12148/cb119469567', 'http://data.bnf.fr/ark:/12148/cb11933232c', 'http://data.bnf.fr/ark:/12148/cb122890536', 'http://data.bnf.fr/ark:/12148/cb121155321', 'http://data.bnf.fr/ark:/12148/cb15556043g', 'http://data.bnf.fr/ark:/12148/cb123662513', 'http://d-nb.info/gnd/4066562-8', 'http://data.bnf.fr/ark:/12148/cb120745812', 'http://data.bnf.fr/ark:/12148/cb11973101n', 'http://data.bnf.fr/ark:/12148/cb13328497r')
350
+ expect(results['predicates']['http://www.w3.org/2004/02/skos/core#editorial']).to eq ['headings beginning with the word [Scientific;] and subdivision [Science] under ethnic groups and individual wars, e.g. [World War, 1939-1945--Science]']
351
+ expect(results['predicates']['http://www.w3.org/2004/02/skos/core#inScheme']).to eq ['http://id.loc.gov/authorities/subjects']
352
+ end
353
+ end
354
+ end
355
+
356
+ describe "language processing" do
357
+ context "when filtering #find result" do
358
+ context "and lang NOT passed in" do
359
+ context "and NO default defined in config" do
360
+ let(:lod_lang_no_defaults) { described_class.new(:LOD_LANG_NO_DEFAULTS) }
361
+ let :results do
362
+ stub_request(:get, "http://localhost/test_no_default/term/c_9513")
363
+ .to_return(status: 200, body: webmock_fixture("lod_lang_term_enfr.rdf.xml"), headers: { 'Content-Type' => 'application/rdf+xml' })
364
+ lod_lang_no_defaults.find('c_9513')
365
+ end
366
+ it "is not filtered" do
367
+ expect(results[:label]).to eq ['buttermilk', 'Babeurre']
368
+ expect(results[:altlabel]).to eq ['yummy', 'délicieux']
369
+ expect(results["predicates"]["http://www.w3.org/2004/02/skos/core#prefLabel"]).to include("buttermilk", "Babeurre")
370
+ expect(results["predicates"]["http://www.w3.org/2004/02/skos/core#altLabel"]).to include("yummy", "délicieux")
371
+ end
372
+ end
373
+ context "and default IS defined in config" do
374
+ let(:lod_lang_defaults) { described_class.new(:LOD_LANG_DEFAULTS) }
375
+ let :results do
376
+ stub_request(:get, "http://localhost/test_default/term/c_9513")
377
+ .to_return(status: 200, body: webmock_fixture("lod_lang_term_enfr.rdf.xml"), headers: { 'Content-Type' => 'application/rdf+xml' })
378
+ lod_lang_defaults.find('c_9513')
379
+ end
380
+ it "is filtered to default" do
381
+ expect(results[:label]).to eq ['buttermilk']
382
+ expect(results[:altlabel]).to eq ['yummy']
383
+ expect(results["predicates"]["http://www.w3.org/2004/02/skos/core#prefLabel"]).to eq ['buttermilk']
384
+ expect(results["predicates"]["http://www.w3.org/2004/02/skos/core#altLabel"]).to eq ['yummy']
385
+ end
386
+ end
387
+ context "and multiple defaults ARE defined in config" do
388
+ let(:lod_lang_multi_defaults) { described_class.new(:LOD_LANG_MULTI_DEFAULTS) }
389
+ let :results do
390
+ stub_request(:get, "http://localhost/test_default/term/c_9513")
391
+ .to_return(status: 200, body: webmock_fixture("lod_lang_term_enfrde.rdf.xml"), headers: { 'Content-Type' => 'application/rdf+xml' })
392
+ lod_lang_multi_defaults.find('c_9513')
393
+ end
394
+ it "is filtered to default" do
395
+ expect(results[:label]).to eq ['buttermilk', 'Babeurre']
396
+ expect(results[:altlabel]).to eq ['yummy', 'délicieux']
397
+ expect(results["predicates"]["http://www.w3.org/2004/02/skos/core#prefLabel"]).to include("buttermilk", "Babeurre")
398
+ expect(results["predicates"]["http://www.w3.org/2004/02/skos/core#altLabel"]).to include("yummy", "délicieux")
399
+ end
400
+ end
401
+ end
402
+
403
+ context "and lang IS passed in" do
404
+ let(:lod_lang_defaults) { described_class.new(:LOD_LANG_DEFAULTS) }
405
+ let :results do
406
+ stub_request(:get, "http://localhost/test_default/term/c_9513")
407
+ .to_return(status: 200, body: webmock_fixture("lod_lang_term_enfr.rdf.xml"), headers: { 'Content-Type' => 'application/rdf+xml' })
408
+ lod_lang_defaults.find('c_9513', language: 'fr')
409
+ end
410
+ it "is filtered to specified language" do
411
+ expect(results[:label]).to eq ['Babeurre']
412
+ expect(results[:altlabel]).to eq ['délicieux']
413
+ expect(results["predicates"]["http://www.w3.org/2004/02/skos/core#prefLabel"]).to eq ['Babeurre']
414
+ expect(results["predicates"]["http://www.w3.org/2004/02/skos/core#altLabel"]).to eq ['délicieux']
415
+ end
416
+ end
417
+
418
+ context "and result does not have altlabel" do
419
+ let(:lod_lang_defaults) { described_class.new(:LOD_LANG_DEFAULTS) }
420
+ let :results do
421
+ stub_request(:get, "http://localhost/test_default/term/c_9513")
422
+ .to_return(status: 200, body: webmock_fixture("lod_lang_term_enfr_noalt.rdf.xml"), headers: { 'Content-Type' => 'application/rdf+xml' })
423
+ lod_lang_defaults.find('c_9513', language: 'fr')
424
+ end
425
+ it "is filtered to specified language" do
426
+ expect(results[:label]).to eq ['Babeurre']
427
+ expect(results["predicates"]["http://www.w3.org/2004/02/skos/core#prefLabel"]).to eq ['Babeurre']
428
+ end
429
+ end
430
+
431
+ context "when replacement on authority term URL" do
432
+ context "and using default" do
433
+ let(:lod_lang_param) { described_class.new(:LOD_LANG_PARAM) }
434
+ let :results do
435
+ stub_request(:get, "http://localhost/test_replacement/term/c_9513?lang=en")
436
+ .to_return(status: 200, body: webmock_fixture("lod_lang_term_en.rdf.xml"), headers: { 'Content-Type' => 'application/rdf+xml' })
437
+ lod_lang_param.find("c_9513")
438
+ end
439
+ it "is correctly parsed" do
440
+ expect(results[:label]).to eq ['buttermilk']
441
+ expect(results[:altlabel]).to eq ['yummy']
442
+ expect(results["predicates"]["http://www.w3.org/2004/02/skos/core#prefLabel"]).to eq ['buttermilk']
443
+ expect(results["predicates"]["http://www.w3.org/2004/02/skos/core#altLabel"]).to eq ['yummy']
444
+ end
445
+ end
446
+
447
+ context "and lang specified" do
448
+ let(:lod_lang_param) { described_class.new(:LOD_LANG_PARAM) }
449
+ let :results do
450
+ stub_request(:get, "http://localhost/test_replacement/term/c_9513?lang=fr")
451
+ .to_return(status: 200, body: webmock_fixture("lod_lang_term_fr.rdf.xml"), headers: { 'Content-Type' => 'application/rdf+xml' })
452
+ lod_lang_param.find("c_9513", replacements: { 'lang' => 'fr' })
453
+ end
454
+ it "is correctly parsed" do
455
+ expect(results[:label]).to eq ['Babeurre']
456
+ expect(results[:altlabel]).to eq ['délicieux']
457
+ expect(results["predicates"]["http://www.w3.org/2004/02/skos/core#prefLabel"]).to eq ['Babeurre']
458
+ expect(results["predicates"]["http://www.w3.org/2004/02/skos/core#altLabel"]).to eq ['délicieux']
459
+ end
460
+ end
461
+ end
462
+ end
463
+ end
464
+ end
465
+
466
+ describe '#new' do
467
+ context 'without an authority' do
468
+ it 'raises an exception' do
469
+ expect { described_class.new }.to raise_error ArgumentError, /wrong number of arguments/
470
+ end
471
+ end
472
+ context 'with an invalid authority' do
473
+ it 'raises an exception' do
474
+ expect { described_class.new(:FOO) }.to raise_error Qa::InvalidLinkedDataAuthority, /Unable to initialize linked data authority 'FOO'/
475
+ end
476
+ end
477
+ context 'with a valid authority' do
478
+ it 'creates the authority' do
479
+ expect(described_class.new(:OCLC_FAST)).to be_kind_of described_class
480
+ end
481
+ end
482
+ end
483
+
484
+ context 'testing delegated method' do
485
+ let(:full_authority) { described_class.new(:LOD_FULL_CONFIG) }
486
+ let(:min_authority) { described_class.new(:LOD_MIN_CONFIG) }
487
+ let(:search_only_authority) { described_class.new(:LOD_SEARCH_ONLY_CONFIG) }
488
+ let(:term_only_authority) { described_class.new(:LOD_TERM_ONLY_CONFIG) }
489
+
490
+ describe '#supports_search?' do
491
+ it 'returns false if search is NOT configured' do
492
+ expect(term_only_authority.supports_search?).to eq false
493
+ end
494
+ it 'returns true if search is configured' do
495
+ expect(full_authority.supports_search?).to eq true
496
+ end
497
+ end
498
+
499
+ describe '#search_subauthorities?' do
500
+ it 'returns false if only term configuration is defined' do
501
+ expect(term_only_authority.search_subauthorities?).to eq false
502
+ end
503
+ it 'returns false if the configuration does NOT define subauthorities' do
504
+ expect(min_authority.search_subauthorities?).to eq false
505
+ end
506
+ it 'returns true if the configuration defines subauthorities' do
507
+ expect(full_authority.search_subauthorities?).to eq true
508
+ end
509
+ end
510
+
511
+ describe '#search_subauthority?' do
512
+ it 'returns false if only term configuration is defined' do
513
+ expect(term_only_authority.search_subauthority?('fake_subauth')).to eq false
514
+ end
515
+ it 'returns false if there are no subauthorities configured' do
516
+ expect(min_authority.search_subauthority?('fake_subauth')).to eq false
517
+ end
518
+ it 'returns false if the requested subauthority is NOT configured' do
519
+ expect(full_authority.search_subauthority?('fake_subauth')).to eq false
520
+ end
521
+ it 'returns true if the requested subauthority is configured' do
522
+ expect(full_authority.search_subauthority?('search_sub2_key')).to eq true
523
+ end
524
+ end
525
+
526
+ describe '#supports_term?' do
527
+ it 'returns false if term is NOT configured' do
528
+ expect(search_only_authority.supports_term?).to eq false
529
+ end
530
+ it 'returns true if term is configured' do
531
+ expect(full_authority.supports_term?).to eq true
532
+ end
533
+ end
534
+
535
+ describe '#term_subauthorities?' do
536
+ it 'returns false if only search configuration is defined' do
537
+ expect(search_only_authority.term_subauthorities?).to eq false
538
+ end
539
+ it 'returns false if the configuration does NOT define subauthorities' do
540
+ expect(min_authority.term_subauthorities?).to eq false
541
+ end
542
+ it 'returns true if the configuration defines subauthorities' do
543
+ expect(full_authority.term_subauthorities?).to eq true
544
+ end
545
+ end
546
+
547
+ describe '#term_subauthority?' do
548
+ it 'returns false if only search configuration is defined' do
549
+ expect(search_only_authority.term_subauthority?('fake_subauth')).to eq false
550
+ end
551
+ it 'returns false if there are no subauthorities configured' do
552
+ expect(min_authority.term_subauthority?('fake_subauth')).to eq false
553
+ end
554
+ it 'returns false if the requested subauthority is NOT configured' do
555
+ expect(full_authority.term_subauthority?('fake_subauth')).to eq false
556
+ end
557
+ it 'returns true if the requested subauthority is configured' do
558
+ expect(full_authority.term_subauthority?('term_sub2_key')).to eq true
559
+ end
560
+ end
561
+
562
+ describe '#term_id_expects_id?' do
563
+ it 'returns false if term_id specifies a URI is required' do
564
+ expect(min_authority.term_id_expects_id?).to eq false
565
+ end
566
+ it 'returns true if term_id specifies an ID is required' do
567
+ expect(full_authority.term_id_expects_id?).to eq true
568
+ end
569
+ end
570
+
571
+ describe '#term_id_expects_uri?' do
572
+ it 'returns false if term_id specifies a ID is required' do
573
+ expect(full_authority.term_id_expects_uri?).to eq false
574
+ end
575
+ it 'returns true if term_id specifies an URI is required' do
576
+ expect(min_authority.term_id_expects_uri?).to eq true
577
+ end
578
+ end
579
+ end
580
+ end