qa 2.0.0 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +54 -6
  3. data/app/controllers/qa/application_controller.rb +24 -0
  4. data/app/controllers/qa/linked_data_terms_controller.rb +116 -51
  5. data/app/controllers/qa/terms_controller.rb +7 -2
  6. data/app/models/qa/mesh_tree.rb +5 -9
  7. data/app/models/qa/subject_mesh_term.rb +2 -7
  8. data/config/authorities/linked_data/agrovoc.json +8 -1
  9. data/config/initializers/linked_data_authorities.rb +1 -17
  10. data/config/routes.rb +11 -0
  11. data/lib/generators/qa/apidoc/USAGE +11 -0
  12. data/lib/generators/qa/apidoc/apidoc_generator.rb +22 -0
  13. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/apidoc.json +1322 -0
  14. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/favicon-16x16.png +0 -0
  15. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/favicon-32x32.png +0 -0
  16. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/index.html +61 -0
  17. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/oauth2-redirect.html +67 -0
  18. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui-bundle.js +93 -0
  19. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui-bundle.js.map +1 -0
  20. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui-standalone-preset.js +14 -0
  21. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui-standalone-preset.js.map +1 -0
  22. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui.css +3 -0
  23. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui.css.map +1 -0
  24. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui.js +9 -0
  25. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui.js.map +1 -0
  26. data/lib/generators/qa/install/install_generator.rb +11 -0
  27. data/lib/generators/qa/install/templates/config/initializers/qa.rb +13 -0
  28. data/lib/generators/qa/local/tables/mysql/mysql_generator.rb +1 -1
  29. data/lib/generators/qa/local/tables/tables_generator.rb +1 -1
  30. data/lib/qa.rb +16 -0
  31. data/lib/qa/authorities/assign_fast_subauthority.rb +3 -3
  32. data/lib/qa/authorities/getty/aat.rb +13 -6
  33. data/lib/qa/authorities/getty/tgn.rb +11 -22
  34. data/lib/qa/authorities/getty/ulan.rb +13 -16
  35. data/lib/qa/authorities/linked_data.rb +1 -0
  36. data/lib/qa/authorities/linked_data/authority_service.rb +47 -0
  37. data/lib/qa/authorities/linked_data/config.rb +9 -3
  38. data/lib/qa/authorities/linked_data/config/search_config.rb +16 -2
  39. data/lib/qa/authorities/linked_data/config/term_config.rb +17 -3
  40. data/lib/qa/authorities/linked_data/find_term.rb +4 -3
  41. data/lib/qa/authorities/linked_data/generic_authority.rb +8 -1
  42. data/lib/qa/authorities/linked_data/rdf_helper.rb +15 -0
  43. data/lib/qa/authorities/linked_data/search_query.rb +19 -3
  44. data/lib/qa/authorities/loc/generic_authority.rb +2 -2
  45. data/lib/qa/authorities/loc_subauthority.rb +2 -2
  46. data/lib/qa/authorities/local.rb +2 -4
  47. data/lib/qa/authorities/local/file_based_authority.rb +1 -1
  48. data/lib/qa/authorities/local/mysql_table_based_authority.rb +11 -2
  49. data/lib/qa/authorities/local/table_based_authority.rb +2 -1
  50. data/lib/qa/authorities/mesh_tools/mesh_data_parser.rb +1 -1
  51. data/lib/qa/authorities/mesh_tools/mesh_importer.rb +1 -1
  52. data/lib/qa/authorities/oclcts/generic_oclc_authority.rb +1 -3
  53. data/lib/qa/configuration.rb +34 -0
  54. data/lib/qa/version.rb +1 -1
  55. data/lib/tasks/mesh.rake +3 -3
  56. data/spec/controllers/linked_data_terms_controller_spec.rb +247 -18
  57. data/spec/controllers/terms_controller_spec.rb +87 -12
  58. data/spec/fixtures/authorities/linked_data/lod_encoding_config.json +91 -0
  59. data/spec/fixtures/authorities/linked_data/lod_term_id_param_config.json +27 -0
  60. data/spec/fixtures/authorities/linked_data/lod_term_uri_param_config.json +27 -0
  61. data/spec/fixtures/{lexvo_snippet.rdf → lexvo_snippet.rdf.xml} +1 -0
  62. data/spec/lib/authorities/assign_fast_spec.rb +3 -1
  63. data/spec/lib/authorities/file_based_authority_spec.rb +19 -11
  64. data/spec/lib/authorities/geonames_spec.rb +3 -3
  65. data/spec/lib/authorities/getty/aat_spec.rb +14 -8
  66. data/spec/lib/authorities/getty/tgn_spec.rb +8 -15
  67. data/spec/lib/authorities/getty/ulan_spec.rb +8 -6
  68. data/spec/lib/authorities/getty_spec.rb +2 -1
  69. data/spec/lib/authorities/linked_data/authority_service_spec.rb +47 -0
  70. data/spec/lib/authorities/linked_data/generic_authority_spec.rb +56 -14
  71. data/spec/lib/authorities/linked_data/search_config_spec.rb +33 -19
  72. data/spec/lib/authorities/linked_data/search_query_spec.rb +67 -15
  73. data/spec/lib/authorities/linked_data/term_config_spec.rb +34 -20
  74. data/spec/lib/authorities/loc_spec.rb +9 -9
  75. data/spec/lib/authorities/local_spec.rb +7 -8
  76. data/spec/lib/authorities/oclcts_spec.rb +27 -20
  77. data/spec/lib/authorities/table_based_authority_spec.rb +5 -3
  78. data/spec/lib/authorities_loc_subauthorities.rb +2 -2
  79. data/spec/lib/configuration_spec.rb +58 -0
  80. data/spec/lib/mesh_data_parser_spec.rb +2 -0
  81. data/spec/lib/services/rdf_authority_parser_spec.rb +1 -1
  82. data/spec/lib/tasks/mesh.rake_spec.rb +13 -12
  83. data/spec/models/subject_mesh_term_spec.rb +2 -0
  84. data/spec/requests/cors_headers_spec.rb +118 -0
  85. data/spec/spec_helper.rb +2 -2
  86. metadata +167 -137
@@ -69,25 +69,27 @@ describe Qa::Authorities::Getty::Ulan do
69
69
  describe "#sparql" do
70
70
  context "using a single subject term" do
71
71
  subject { authority.sparql('search_term') }
72
- it { is_expected.to eq 'SELECT DISTINCT ?s ?name ?bio {
72
+ it {
73
+ is_expected.to eq 'SELECT DISTINCT ?s ?name ?bio {
73
74
  ?s a skos:Concept; luc:term "search_term";
74
75
  skos:inScheme <http://vocab.getty.edu/ulan/> ;
75
76
  gvp:prefLabelGVP [skosxl:literalForm ?name] ;
76
77
  foaf:focus/gvp:biographyPreferred [schema:description ?bio] ;
77
78
  skos:altLabel ?alt .
78
79
  FILTER regex(?name, "search_term", "i") .
79
- } ORDER BY ?name' }
80
+ } ORDER BY ?name'.gsub(/[\s\n]+/, ' ') }
80
81
  end
81
82
  context "using a two subject terms" do
82
83
  subject { authority.sparql('search term') }
83
- it { is_expected.to eq "SELECT DISTINCT ?s ?name ?bio {
84
- ?s a skos:Concept; luc:term \"search term\";
84
+ it {
85
+ is_expected.to eq %(SELECT DISTINCT ?s ?name ?bio {
86
+ ?s a skos:Concept; luc:term "search term";
85
87
  skos:inScheme <http://vocab.getty.edu/ulan/> ;
86
88
  gvp:prefLabelGVP [skosxl:literalForm ?name] ;
87
89
  foaf:focus/gvp:biographyPreferred [schema:description ?bio] ;
88
90
  skos:altLabel ?alt .
89
- FILTER (regex(CONCAT(?name, ' ', ?alt), \"search\",\"i\" ) && regex(CONCAT(?name, ' ', ?alt), \"term\",\"i\" ) ) .
90
- } ORDER BY ?name" }
91
+ FILTER ((regex(?name, "search", "i") || regex(?alt, "search", "i")) && (regex(?name, "term", "i") || regex(?alt, "term", "i"))) .
92
+ } ORDER BY ?name).gsub(/[\s\n]+/, ' ') }
91
93
  end
92
94
  end
93
95
  end
@@ -3,7 +3,8 @@ require 'spec_helper'
3
3
  describe Qa::Authorities::Getty do
4
4
  describe "#new" do
5
5
  it "raises an exception" do
6
- expect { described_class.new }.to raise_error RuntimeError, "Initializing with as sub authority is removed. use Module.subauthority_for(nil) instead"
6
+ msg = "Initializing with as sub authority is removed. use Module.subauthority_for(nil) instead"
7
+ expect { described_class.new }.to raise_error RuntimeError, msg
7
8
  end
8
9
  end
9
10
 
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ describe Qa::Authorities::LinkedData::AuthorityService do
4
+ let(:auth_names) do
5
+ [:AGROVOC,
6
+ :LOC,
7
+ :LOD_ENCODING_CONFIG,
8
+ :LOD_FULL_CONFIG,
9
+ :LOD_LANG_DEFAULTS,
10
+ :LOD_LANG_MULTI_DEFAULTS,
11
+ :LOD_LANG_NO_DEFAULTS,
12
+ :LOD_LANG_PARAM,
13
+ :LOD_MIN_CONFIG,
14
+ :LOD_SEARCH_ONLY_CONFIG,
15
+ :LOD_SORT,
16
+ :LOD_TERM_ID_PARAM_CONFIG,
17
+ :LOD_TERM_ONLY_CONFIG,
18
+ :LOD_TERM_URI_PARAM_CONFIG,
19
+ :OCLC_FAST]
20
+ end
21
+
22
+ describe '#authority_configs' do
23
+ let(:result) { described_class.authority_configs }
24
+ it 'returns all authorities' do
25
+ expect(result).to be_kind_of(Hash)
26
+ expect(result.keys).to match_array auth_names
27
+ expect(result.values.first).to be_kind_of(Hash)
28
+ expect(result.values.first).to have_key(:term)
29
+ expect(result.values.first).to have_key(:search)
30
+ end
31
+ end
32
+
33
+ describe '#authority_config' do
34
+ let(:result) { described_class.authority_config(:LOD_FULL_CONFIG) }
35
+ it 'returns a single authority' do
36
+ expect(result).to be_kind_of(Hash)
37
+ expect(result).to have_key(:term)
38
+ expect(result).to have_key(:search)
39
+ end
40
+ end
41
+
42
+ describe '#authority_names' do
43
+ it "returns a list of all authorities' names" do
44
+ expect(described_class.authority_names).to eq auth_names
45
+ end
46
+ end
47
+ end
@@ -62,7 +62,7 @@ RSpec.describe Qa::Authorities::LinkedData::GenericAuthority do
62
62
  context 'in AGROVOC authority' do
63
63
  context '0 search results' do
64
64
  let :results do
65
- stub_request(:get, 'http://artemide.art.uniroma2.it:8081/agrovoc/rest/v1/search/?lang=en&query=*supercalifragilisticexpialidocious*')
65
+ stub_request(:get, 'http://artemide.art.uniroma2.it:8081/agrovoc/rest/v1/search/?lang=en&query=*supercalifragilisticexpialidocious*&maxhits=20')
66
66
  .to_return(status: 200, body: webmock_fixture('lod_agrovoc_query_no_results.json'), headers: { 'Content-Type' => 'application/json' })
67
67
  lod_agrovoc.search('supercalifragilisticexpialidocious')
68
68
  end
@@ -73,7 +73,7 @@ RSpec.describe Qa::Authorities::LinkedData::GenericAuthority do
73
73
 
74
74
  context '3 search results' do
75
75
  let :results do
76
- stub_request(:get, 'http://artemide.art.uniroma2.it:8081/agrovoc/rest/v1/search/?lang=en&query=*milk*')
76
+ stub_request(:get, 'http://artemide.art.uniroma2.it:8081/agrovoc/rest/v1/search/?lang=en&query=*milk*&maxhits=20')
77
77
  .to_return(status: 200, body: webmock_fixture('lod_agrovoc_query_many_results.json'), headers: { 'Content-Type' => 'application/json' })
78
78
  lod_agrovoc.search('milk')
79
79
  end
@@ -93,6 +93,7 @@ RSpec.describe Qa::Authorities::LinkedData::GenericAuthority do
93
93
  # # let(:lod_loc) { Qa::Authorities::LinkedData::GenericAuthority.new(:LOC) }
94
94
  # end
95
95
 
96
+ # rubocop:disable RSpec/NestedGroups
96
97
  describe "language processing" do
97
98
  context "when filtering #search results" do
98
99
  context "and lang NOT passed in" do
@@ -184,6 +185,7 @@ RSpec.describe Qa::Authorities::LinkedData::GenericAuthority do
184
185
  end
185
186
  end
186
187
  end
188
+ # rubocop:enable RSpec/NestedGroups
187
189
  end
188
190
 
189
191
  describe '#find' do
@@ -195,7 +197,7 @@ RSpec.describe Qa::Authorities::LinkedData::GenericAuthority do
195
197
  context 'with bad id' do
196
198
  before do
197
199
  stub_request(:get, 'http://id.worldcat.org/fast/FAKE_ID')
198
- .to_return(status: 404, body: '', headers: {})
200
+ .to_return(status: 404, body: '', headers: {})
199
201
  end
200
202
  it 'raises a TermNotFound exception' do
201
203
  expect { lod_oclc.find('FAKE_ID') }.to raise_error Qa::TermNotFound, /.*\/FAKE_ID\ Not Found - Term may not exist at LOD Authority./
@@ -256,14 +258,19 @@ RSpec.describe Qa::Authorities::LinkedData::GenericAuthority do
256
258
  it 'has primary predicates in pred-obj list' do
257
259
  expect(results['predicates']['http://purl.org/dc/terms/identifier']).to eq ['530369']
258
260
  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")
261
+ expect(results['predicates']['http://www.w3.org/2004/02/skos/core#altLabel'])
262
+ .to include('Ithaca (N.Y.). Cornell University', "Kornel\\xCA\\xB9skii universitet",
263
+ "K\\xCA\\xBBang-nai-erh ta hs\\xC3\\xBCeh")
260
264
  expect(results['predicates']['http://schema.org/sameAs']).to include('http://id.loc.gov/authorities/names/n79021621', 'https://viaf.org/viaf/126293486')
261
265
  end
262
266
 
263
267
  it 'has unspecified predicate values' do
264
268
  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")
269
+ expect(results['predicates']['http://www.w3.org/2004/02/skos/core#inScheme'])
270
+ .to include('http://id.worldcat.org/fast/ontology/1.0/#fast', 'http://id.worldcat.org/fast/ontology/1.0/#facet-Corporate')
271
+ expect(results['predicates']['http://schema.org/name'])
272
+ .to include('Cornell University', 'Ithaca (N.Y.). Cornell University', "Kornel\\xCA\\xB9skii universitet",
273
+ "K\\xCA\\xBBang-nai-erh ta hs\\xC3\\xBCeh")
267
274
  end
268
275
  end
269
276
  end
@@ -290,11 +297,24 @@ RSpec.describe Qa::Authorities::LinkedData::GenericAuthority do
290
297
  it 'has primary predicates in pred-obj list' do
291
298
  expect(results['predicates']['http://www.w3.org/2004/02/skos/core#prefLabel']).to eq ['buttermilk']
292
299
  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')
300
+ expect(results['predicates']['http://www.w3.org/2004/02/skos/core#exactMatch'])
301
+ .to include('http://cat.aii.caas.cn/concept/c_26308', 'http://lod.nal.usda.gov/nalt/20627',
302
+ 'http://d-nb.info/gnd/4147072-2')
294
303
  end
295
304
 
296
305
  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')
306
+ expect(results['predicates']['http://www.w3.org/2008/05/skos-xl#prefLabel'])
307
+ .to include('http://aims.fao.org/aos/agrovoc/xl_es_1299487482038', 'http://aims.fao.org/aos/agrovoc/xl_it_1299487482154',
308
+ 'http://aims.fao.org/aos/agrovoc/xl_ko_1299487482210', 'http://aims.fao.org/aos/agrovoc/xl_pl_1299487482273',
309
+ 'http://aims.fao.org/aos/agrovoc/xl_sk_1299487482378', 'http://aims.fao.org/aos/agrovoc/xl_en_1299487482019',
310
+ 'http://aims.fao.org/aos/agrovoc/xl_tr_9513_1321792194941',
311
+ 'http://aims.fao.org/aos/agrovoc/xl_de_1299487482000', 'http://aims.fao.org/aos/agrovoc/xl_fa_1299487482058',
312
+ 'http://aims.fao.org/aos/agrovoc/xl_th_1299487482417', 'http://aims.fao.org/aos/agrovoc/xl_fr_1299487482080',
313
+ 'http://aims.fao.org/aos/agrovoc/xl_hi_1299487482102', 'http://aims.fao.org/aos/agrovoc/xl_ar_1299487481966',
314
+ 'http://aims.fao.org/aos/agrovoc/xl_ja_1299487482181', 'http://aims.fao.org/aos/agrovoc/xl_lo_1299487482240',
315
+ 'http://aims.fao.org/aos/agrovoc/xl_ru_1299487482341', 'http://aims.fao.org/aos/agrovoc/xl_cs_1299487481982',
316
+ 'http://aims.fao.org/aos/agrovoc/xl_zh_1299487482458', 'http://aims.fao.org/aos/agrovoc/xl_pt_1299487482307',
317
+ 'http://aims.fao.org/aos/agrovoc/xl_hu_1299487482127')
298
318
  expect(results['predicates']['http://www.w3.org/2004/02/skos/core#inScheme']).to eq ['http://aims.fao.org/aos/agrovoc']
299
319
  expect(results['predicates']['http://www.w3.org/2004/02/skos/core#closeMatch']).to eq ['http://dbpedia.org/resource/Buttermilk']
300
320
  expect(results['predicates']['http://www.w3.org/2008/05/skos-xl#altLabel']).to eq ['http://aims.fao.org/aos/agrovoc/xl_fa_1299487482544']
@@ -337,22 +357,43 @@ RSpec.describe Qa::Authorities::LinkedData::GenericAuthority do
337
357
 
338
358
  it 'has loc mads predicate values' do
339
359
  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]']
360
+ expect(results['predicates']['http://www.loc.gov/mads/rdf/v1#isMemberOfMADSCollection'])
361
+ .to include('http://id.loc.gov/authorities/subjects/collection_LCSHAuthorizedHeadings',
362
+ 'http://id.loc.gov/authorities/subjects/collection_LCSH_General',
363
+ 'http://id.loc.gov/authorities/subjects/collection_SubdivideGeographically')
364
+ expect(results['predicates']['http://www.loc.gov/mads/rdf/v1#hasCloseExternalAuthority'])
365
+ .to include('http://data.bnf.fr/ark:/12148/cb12321484k', 'http://data.bnf.fr/ark:/12148/cb119673416',
366
+ 'http://data.bnf.fr/ark:/12148/cb119934236', 'http://data.bnf.fr/ark:/12148/cb12062047t',
367
+ 'http://data.bnf.fr/ark:/12148/cb119469567', 'http://data.bnf.fr/ark:/12148/cb11933232c',
368
+ 'http://data.bnf.fr/ark:/12148/cb122890536', 'http://data.bnf.fr/ark:/12148/cb121155321',
369
+ 'http://data.bnf.fr/ark:/12148/cb15556043g', 'http://data.bnf.fr/ark:/12148/cb123662513',
370
+ 'http://d-nb.info/gnd/4066562-8', 'http://data.bnf.fr/ark:/12148/cb120745812',
371
+ 'http://data.bnf.fr/ark:/12148/cb11973101n', 'http://data.bnf.fr/ark:/12148/cb13328497r')
372
+ expect(results['predicates']['http://www.loc.gov/mads/rdf/v1#isMemberOfMADSScheme'])
373
+ .to eq ['http://id.loc.gov/authorities/subjects']
374
+ expect(results['predicates']['http://www.loc.gov/mads/rdf/v1#editorialNote'])
375
+ .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
376
  end
345
377
 
346
378
  it 'has more unspecified predicate values' do
347
379
  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
380
  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]']
381
+ expect(results['predicates']['http://www.w3.org/2004/02/skos/core#closeMatch'])
382
+ .to include('http://data.bnf.fr/ark:/12148/cb12321484k', 'http://data.bnf.fr/ark:/12148/cb119673416',
383
+ 'http://data.bnf.fr/ark:/12148/cb119934236', 'http://data.bnf.fr/ark:/12148/cb12062047t',
384
+ 'http://data.bnf.fr/ark:/12148/cb119469567', 'http://data.bnf.fr/ark:/12148/cb11933232c',
385
+ 'http://data.bnf.fr/ark:/12148/cb122890536', 'http://data.bnf.fr/ark:/12148/cb121155321',
386
+ 'http://data.bnf.fr/ark:/12148/cb15556043g', 'http://data.bnf.fr/ark:/12148/cb123662513',
387
+ 'http://d-nb.info/gnd/4066562-8', 'http://data.bnf.fr/ark:/12148/cb120745812',
388
+ 'http://data.bnf.fr/ark:/12148/cb11973101n', 'http://data.bnf.fr/ark:/12148/cb13328497r')
389
+ expect(results['predicates']['http://www.w3.org/2004/02/skos/core#editorial'])
390
+ .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
391
  expect(results['predicates']['http://www.w3.org/2004/02/skos/core#inScheme']).to eq ['http://id.loc.gov/authorities/subjects']
352
392
  end
353
393
  end
354
394
  end
355
395
 
396
+ # rubocop:disable RSpec/NestedGroups
356
397
  describe "language processing" do
357
398
  context "when filtering #find result" do
358
399
  context "and lang NOT passed in" do
@@ -461,6 +502,7 @@ RSpec.describe Qa::Authorities::LinkedData::GenericAuthority do
461
502
  end
462
503
  end
463
504
  end
505
+ # rubocop:enable RSpec/NestedGroups
464
506
  end
465
507
 
466
508
  describe '#new' do
@@ -4,6 +4,7 @@ RSpec.describe Qa::Authorities::LinkedData::SearchConfig do
4
4
  let(:full_config) { Qa::Authorities::LinkedData::Config.new(:LOD_FULL_CONFIG).search }
5
5
  let(:min_config) { Qa::Authorities::LinkedData::Config.new(:LOD_MIN_CONFIG).search }
6
6
  let(:term_only_config) { Qa::Authorities::LinkedData::Config.new(:LOD_TERM_ONLY_CONFIG).search }
7
+ let(:encoding_config) { Qa::Authorities::LinkedData::Config.new(:LOD_ENCODING_CONFIG).search }
7
8
 
8
9
  describe '#search_config' do
9
10
  let(:full_search_config) do
@@ -335,29 +336,32 @@ RSpec.describe Qa::Authorities::LinkedData::SearchConfig do
335
336
  end
336
337
  end
337
338
 
339
+ # rubocop:disable RSpec/RepeatedExample
338
340
  describe '#search_url_with_replacements' do
339
341
  it 'returns nil if only term configuration is defined' do
340
342
  expect(term_only_config.url_with_replacements('Smith')).to eq nil
341
343
  end
342
- it 'returns the url with query substitution applied' do
343
- expected_url = 'http://localhost/test_default/search?subauth=search_sub1_name&query=Smith&param1=delta&param2=echo'
344
- expect(full_config.url_with_replacements('Smith')).to eq expected_url
345
- end
346
- it 'returns the url with default subauthority when NOT specified' do
347
- expected_url = 'http://localhost/test_default/search?subauth=search_sub1_name&query=Smith&param1=delta&param2=echo'
348
- expect(full_config.url_with_replacements('Smith')).to eq expected_url
349
- end
350
- it 'returns the url with subauthority substitution when specified' do
351
- expected_url = 'http://localhost/test_default/search?subauth=search_sub3_name&query=Smith&param1=delta&param2=echo'
352
- expect(full_config.url_with_replacements('Smith', 'search_sub3_key')).to eq expected_url
353
- end
354
- it 'returns the url with default values when replacements are NOT specified' do
355
- expected_url = 'http://localhost/test_default/search?subauth=search_sub1_name&query=Smith&param1=delta&param2=echo'
356
- expect(full_config.url_with_replacements('Smith')).to eq expected_url
357
- end
358
- it 'returns the url with replacement substitution values when replacements are specified' do
359
- expected_url = 'http://localhost/test_default/search?subauth=search_sub1_name&query=Smith&param1=golf&param2=hotel'
360
- expect(full_config.url_with_replacements('Smith', nil, param1: 'golf', param2: 'hotel')).to eq expected_url
344
+ context 'when subauthorities ARE defined' do
345
+ it 'returns the url with query substitution applied' do
346
+ expected_url = 'http://localhost/test_default/search?subauth=search_sub1_name&query=Smith&param1=delta&param2=echo'
347
+ expect(full_config.url_with_replacements('Smith')).to eq expected_url
348
+ end
349
+ it 'returns the url with default subauthority when NOT specified' do
350
+ expected_url = 'http://localhost/test_default/search?subauth=search_sub1_name&query=Smith&param1=delta&param2=echo'
351
+ expect(full_config.url_with_replacements('Smith')).to eq expected_url
352
+ end
353
+ it 'returns the url with subauthority substitution when specified' do
354
+ expected_url = 'http://localhost/test_default/search?subauth=search_sub3_name&query=Smith&param1=delta&param2=echo'
355
+ expect(full_config.url_with_replacements('Smith', 'search_sub3_key')).to eq expected_url
356
+ end
357
+ it 'returns the url with default values when replacements are NOT specified' do
358
+ expected_url = 'http://localhost/test_default/search?subauth=search_sub1_name&query=Smith&param1=delta&param2=echo'
359
+ expect(full_config.url_with_replacements('Smith')).to eq expected_url
360
+ end
361
+ it 'returns the url with replacement substitution values when replacements are specified' do
362
+ expected_url = 'http://localhost/test_default/search?subauth=search_sub1_name&query=Smith&param1=golf&param2=hotel'
363
+ expect(full_config.url_with_replacements('Smith', nil, param1: 'golf', param2: 'hotel')).to eq expected_url
364
+ end
361
365
  end
362
366
 
363
367
  context 'when subauthorities are not defined' do
@@ -381,5 +385,15 @@ RSpec.describe Qa::Authorities::LinkedData::SearchConfig do
381
385
  expect(min_config.url_with_replacements('Smith', nil, fake_replacement_key: 'fake_value')).to eq expected_url
382
386
  end
383
387
  end
388
+
389
+ context 'with encoding specified in config' do
390
+ it 'returns the uri as the url' do
391
+ expected_url = 'http://localhost/test_default/search?query=encoded%20because%3Aencode%3Dtrue&yes%3Aencoded%20here&no:encoding here&defaults:to not encoded'
392
+ query = 'encoded because:encode=true'
393
+ replacements = { encode_true: 'yes:encoded here', encode_false: 'no:encoding here', encode_not_specified: 'defaults:to not encoded' }
394
+ expect(encoding_config.url_with_replacements(query, nil, replacements)).to eq expected_url
395
+ end
396
+ end
384
397
  end
398
+ # rubocop:enable RSpec/RepeatedExample
385
399
  end
@@ -14,7 +14,9 @@ RSpec.describe Qa::Authorities::LinkedData::SearchQuery do
14
14
  let(:auth_name) { :LOD_MIN_CONFIG }
15
15
 
16
16
  it "does not change order" do
17
- json_results = [{ label: "[#{term_b}, #{term_c}]", sort: [term_b, term_c] }, { label: "[#{term_b}, #{term_d}]", sort: [term_b, term_d] }, { label: "[#{term_b}, #{term_a}]", sort: [term_b, term_a] }]
17
+ json_results = [{ label: "[#{term_b}, #{term_c}]", sort: [term_b, term_c] },
18
+ { label: "[#{term_b}, #{term_d}]", sort: [term_b, term_d] },
19
+ { label: "[#{term_b}, #{term_a}]", sort: [term_b, term_a] }]
18
20
  expect(instance.send(:sort_search_results, json_results)).to eq json_results
19
21
  end
20
22
  end
@@ -22,28 +24,58 @@ RSpec.describe Qa::Authorities::LinkedData::SearchQuery do
22
24
  context 'when sort predicate is specified in configuration' do
23
25
  let(:auth_name) { :LOD_SORT }
24
26
 
25
- context "when sort term is empty" do
27
+ context "and sort term is empty" do
26
28
  context "for all" do
27
29
  it "does not change order" do
28
- json_results = [{ label: "[#{term_b}]", sort: [""] }, { label: "[#{term_a}]", sort: [""] }, { label: "[#{term_c}]", sort: [""] }]
30
+ json_results = [{ label: "[#{term_b}]", sort: [""] },
31
+ { label: "[#{term_a}]", sort: [""] },
32
+ { label: "[#{term_c}]", sort: [""] }]
29
33
  expect(instance.send(:sort_search_results, json_results)).to eq json_results
30
34
  end
31
35
  end
32
36
 
33
37
  context "for one" do
34
- it "puts empty first" do
35
- json_results = [{ label: "[#{term_b}]", sort: [""] }, { label: "[#{term_c}]", sort: [term_c] }, { label: "[#{term_a}]", sort: [term_a] }]
36
- expected_results = [{ label: "[#{term_b}]" }, { label: "[#{term_a}]" }, { label: "[#{term_c}]" }]
38
+ it "puts empty first when empty is in 1st position" do
39
+ json_results = [{ label: "['_empty_1_']", sort: [""] },
40
+ { label: "[#{term_c}]", sort: [term_c] },
41
+ { label: "[#{term_a}]", sort: [term_a] }]
42
+ expected_results = [{ label: "['_empty_1_']" },
43
+ { label: "[#{term_a}]" },
44
+ { label: "[#{term_c}]" }]
45
+ expect(instance.send(:sort_search_results, json_results)).to eq expected_results
46
+ end
47
+
48
+ it "puts empty first when empty is in 2nd position" do
49
+ json_results = [{ label: "[#{term_b}]", sort: [term_b] },
50
+ { label: "['_empty_2_']", sort: [""] },
51
+ { label: "[#{term_a}]", sort: [term_a] }]
52
+ expected_results = [{ label: "['_empty_2_']" },
53
+ { label: "[#{term_a}]" },
54
+ { label: "[#{term_b}]" }]
55
+ expect(instance.send(:sort_search_results, json_results)).to eq expected_results
56
+ end
57
+
58
+ it "puts empty first when empty is in last position" do
59
+ json_results = [{ label: "[#{term_b}]", sort: [term_b] },
60
+ { label: "[#{term_c}]", sort: [term_c] },
61
+ { label: "['_empty_last_']", sort: [""] }]
62
+ expected_results = [{ label: "['_empty_last_']" },
63
+ { label: "[#{term_b}]" },
64
+ { label: "[#{term_c}]" }]
37
65
  expect(instance.send(:sort_search_results, json_results)).to eq expected_results
38
66
  end
39
67
  end
40
68
  end
41
69
 
42
- context "when sort term is single value" do
70
+ context "and sort term is single value" do
43
71
  context "for all" do
44
72
  it "sorts on the single value" do
45
- json_results = [{ label: "[#{term_b}]", sort: [term_b] }, { label: "[#{term_c}]", sort: [term_c] }, { label: "[#{term_a}]", sort: [term_a] }]
46
- expected_results = [{ label: "[#{term_a}]" }, { label: "[#{term_b}]" }, { label: "[#{term_c}]" }]
73
+ json_results = [{ label: "[#{term_b}]", sort: [term_b] },
74
+ { label: "[#{term_c}]", sort: [term_c] },
75
+ { label: "[#{term_a}]", sort: [term_a] }]
76
+ expected_results = [{ label: "[#{term_a}]" },
77
+ { label: "[#{term_b}]" },
78
+ { label: "[#{term_c}]" }]
47
79
  expect(instance.send(:sort_search_results, json_results)).to eq expected_results
48
80
  end
49
81
  end
@@ -51,8 +83,12 @@ RSpec.describe Qa::Authorities::LinkedData::SearchQuery do
51
83
 
52
84
  context "when first sort term is same" do
53
85
  it "sorts on second sort term" do
54
- json_results = [{ label: "[#{term_b}, #{term_c}]", sort: [term_b, term_c] }, { label: "[#{term_b}, #{term_d}]", sort: [term_b, term_d] }, { label: "[#{term_b}, #{term_a}]", sort: [term_b, term_a] }]
55
- expected_results = [{ label: "[#{term_b}, #{term_a}]" }, { label: "[#{term_b}, #{term_c}]" }, { label: "[#{term_b}, #{term_d}]" }]
86
+ json_results = [{ label: "[#{term_b}, #{term_c}]", sort: [term_b, term_c] },
87
+ { label: "[#{term_b}, #{term_d}]", sort: [term_b, term_d] },
88
+ { label: "[#{term_b}, #{term_a}]", sort: [term_b, term_a] }]
89
+ expected_results = [{ label: "[#{term_b}, #{term_a}]" },
90
+ { label: "[#{term_b}, #{term_c}]" },
91
+ { label: "[#{term_b}, #{term_d}]" }]
56
92
  expect(instance.send(:sort_search_results, json_results)).to eq expected_results
57
93
  end
58
94
  end
@@ -60,20 +96,36 @@ RSpec.describe Qa::Authorities::LinkedData::SearchQuery do
60
96
  context "when different number of sort terms" do
61
97
  context "and initial terms match" do
62
98
  it "puts shorter set of terms before longer set" do
63
- json_results = [{ label: "[#{term_b}, #{term_c}]", sort: [term_b, term_c] }, { label: "[#{term_b}]", sort: [term_b] }, { label: "[#{term_b}, #{term_a}]", sort: [term_b, term_a] }]
64
- expected_results = [{ label: "[#{term_b}]" }, { label: "[#{term_b}, #{term_a}]" }, { label: "[#{term_b}, #{term_c}]" }]
99
+ json_results = [{ label: "[#{term_b}, #{term_c}]", sort: [term_b, term_c] },
100
+ { label: "[#{term_b}]", sort: [term_b] },
101
+ { label: "[#{term_b}, #{term_a}]", sort: [term_b, term_a] }]
102
+ expected_results = [{ label: "[#{term_b}]" },
103
+ { label: "[#{term_b}, #{term_a}]" },
104
+ { label: "[#{term_b}, #{term_c}]" }]
65
105
  expect(instance.send(:sort_search_results, json_results)).to eq expected_results
66
106
  end
67
107
  end
68
108
 
69
109
  context "and a difference happens before end of term sets" do
70
110
  it "stops ordering as soon as a difference is found" do
71
- json_results = [{ label: "[#{term_b}, #{term_d}, #{term_c}]", sort: [term_b, term_d, term_c] }, { label: "[#{term_a}, #{term_c}]", sort: [term_a, term_c] }, { label: "[#{term_b}, #{term_d}, #{term_a}]", sort: [term_b, term_d, term_a] }]
72
- expected_results = [{ label: "[#{term_a}, #{term_c}]" }, { label: "[#{term_b}, #{term_d}, #{term_a}]" }, { label: "[#{term_b}, #{term_d}, #{term_c}]" }]
111
+ json_results = [{ label: "[#{term_b}, #{term_d}, #{term_c}]", sort: [term_b, term_d, term_c] },
112
+ { label: "[#{term_a}, #{term_c}]", sort: [term_a, term_c] },
113
+ { label: "[#{term_b}, #{term_d}, #{term_a}]", sort: [term_b, term_d, term_a] }]
114
+ expected_results = [{ label: "[#{term_a}, #{term_c}]" },
115
+ { label: "[#{term_b}, #{term_d}, #{term_a}]" },
116
+ { label: "[#{term_b}, #{term_d}, #{term_c}]" }]
73
117
  expect(instance.send(:sort_search_results, json_results)).to eq expected_results
74
118
  end
75
119
  end
76
120
  end
121
+
122
+ context "and sort values are numeric" do
123
+ it "does numeric compare" do
124
+ json_results = [{ label: "['22']", sort: ["22"] }, { label: "['1']", sort: ["1"] }, { label: "['215']", sort: ["215"] }]
125
+ expected_results = [{ label: "['1']" }, { label: "['22']" }, { label: "['215']" }]
126
+ expect(instance.send(:sort_search_results, json_results)).to eq expected_results
127
+ end
128
+ end
77
129
  end
78
130
  end
79
131
  end
@@ -4,6 +4,7 @@ describe Qa::Authorities::LinkedData::TermConfig do
4
4
  let(:full_config) { Qa::Authorities::LinkedData::Config.new(:LOD_FULL_CONFIG).term }
5
5
  let(:min_config) { Qa::Authorities::LinkedData::Config.new(:LOD_MIN_CONFIG).term }
6
6
  let(:search_only_config) { Qa::Authorities::LinkedData::Config.new(:LOD_SEARCH_ONLY_CONFIG).term }
7
+ let(:encoding_config) { Qa::Authorities::LinkedData::Config.new(:LOD_ENCODING_CONFIG).term }
7
8
 
8
9
  describe '#term_config' do
9
10
  let(:full_term_config) do
@@ -369,32 +370,35 @@ describe Qa::Authorities::LinkedData::TermConfig do
369
370
  end
370
371
  end
371
372
 
373
+ # rubocop:disable RSpec/RepeatedExample
372
374
  describe '#term_url_with_replacements' do
373
375
  it 'returns nil if only search configuration is defined' do
374
376
  expect(search_only_config.term_url_with_replacements('C123')).to eq nil
375
377
  end
376
- it 'returns the url with query substitution applied' do
377
- expected_url = 'http://localhost/test_default/term/term_sub2_name/C123?param1=alpha&param2=beta'
378
- expect(full_config.term_url_with_replacements('C123')).to eq expected_url
379
- end
380
- it 'returns the url with default subauthority when NOT specified' do
381
- expected_url = 'http://localhost/test_default/term/term_sub2_name/C123?param1=alpha&param2=beta'
382
- expect(full_config.term_url_with_replacements('C123')).to eq expected_url
383
- end
384
- it 'returns the url with subauthority substitution when specified' do
385
- expected_url = 'http://localhost/test_default/term/term_sub3_name/C123?param1=alpha&param2=beta'
386
- expect(full_config.term_url_with_replacements('C123', 'term_sub3_key')).to eq expected_url
387
- end
388
- it 'returns the url with default values when replacements are NOT specified' do
389
- expected_url = 'http://localhost/test_default/term/term_sub2_name/C123?param1=alpha&param2=beta'
390
- expect(full_config.term_url_with_replacements('C123')).to eq expected_url
391
- end
392
- it 'returns the url with replacement substitution values when replacements are specified' do
393
- expected_url = 'http://localhost/test_default/term/term_sub2_name/C123?param1=golf&param2=hotel'
394
- expect(full_config.term_url_with_replacements('C123', nil, param1: 'golf', param2: 'hotel')).to eq expected_url
378
+ context 'when subauthorities ARE defined' do
379
+ it 'returns the url with query substitution applied' do
380
+ expected_url = 'http://localhost/test_default/term/term_sub2_name/C123?param1=alpha&param2=beta'
381
+ expect(full_config.term_url_with_replacements('C123')).to eq expected_url
382
+ end
383
+ it 'returns the url with default subauthority when NOT specified' do
384
+ expected_url = 'http://localhost/test_default/term/term_sub2_name/C123?param1=alpha&param2=beta'
385
+ expect(full_config.term_url_with_replacements('C123')).to eq expected_url
386
+ end
387
+ it 'returns the url with subauthority substitution when specified' do
388
+ expected_url = 'http://localhost/test_default/term/term_sub3_name/C123?param1=alpha&param2=beta'
389
+ expect(full_config.term_url_with_replacements('C123', 'term_sub3_key')).to eq expected_url
390
+ end
391
+ it 'returns the url with default values when replacements are NOT specified' do
392
+ expected_url = 'http://localhost/test_default/term/term_sub2_name/C123?param1=alpha&param2=beta'
393
+ expect(full_config.term_url_with_replacements('C123')).to eq expected_url
394
+ end
395
+ it 'returns the url with replacement substitution values when replacements are specified' do
396
+ expected_url = 'http://localhost/test_default/term/term_sub2_name/C123?param1=golf&param2=hotel'
397
+ expect(full_config.term_url_with_replacements('C123', nil, param1: 'golf', param2: 'hotel')).to eq expected_url
398
+ end
395
399
  end
396
400
 
397
- context 'when subauthorities are not defined' do
401
+ context 'when subauthorities are NOT defined' do
398
402
  it 'returns the url with query substitution applied' do
399
403
  expected_url = 'http://localhost/test_default/term/C123'
400
404
  expect(min_config.term_url_with_replacements('C123')).to eq expected_url
@@ -415,5 +419,15 @@ describe Qa::Authorities::LinkedData::TermConfig do
415
419
  expect(min_config.term_url_with_replacements('C123', nil, fake_replacement_key: 'fake_value')).to eq expected_url
416
420
  end
417
421
  end
422
+
423
+ context 'with encoding specified in config' do
424
+ it 'returns the uri as the url' do
425
+ expected_url = 'http://localhost/test_default/term?uri=http%3A%2F%2Fencoded%2Ebecause%3Fencode%3Dtrue&yes%3Aencoded%20here&no:encoding here&defaults:to not encoded'
426
+ term_uri = 'http://encoded.because?encode=true'
427
+ replacements = { encode_true: 'yes:encoded here', encode_false: 'no:encoding here', encode_not_specified: 'defaults:to not encoded' }
428
+ expect(encoding_config.term_url_with_replacements(term_uri, nil, replacements)).to eq expected_url
429
+ end
430
+ end
418
431
  end
432
+ # rubocop:enable RSpec/RepeatedExample
419
433
  end