qa 3.1.0 → 4.0.0.rc1
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.
- checksums.yaml +5 -5
- data/README.md +16 -548
- data/app/controllers/qa/linked_data_terms_controller.rb +64 -42
- data/app/controllers/qa/terms_controller.rb +14 -6
- data/app/models/qa/iri_template/url_config.rb +47 -0
- data/app/models/qa/iri_template/variable_map.rb +62 -0
- data/app/models/qa/linked_data/config/context_map.rb +77 -0
- data/app/models/qa/linked_data/config/context_property_map.rb +144 -0
- data/app/models/qa/linked_data/config/helper.rb +34 -0
- data/app/services/qa/iri_template_service.rb +31 -0
- data/{lib/qa/authorities → app/services/qa}/linked_data/authority_service.rb +3 -4
- data/app/services/qa/linked_data/authority_url_service.rb +48 -0
- data/app/services/qa/linked_data/deep_sort_service.rb +238 -0
- data/app/services/qa/linked_data/graph_service.rb +106 -0
- data/app/services/qa/linked_data/language_service.rb +30 -0
- data/app/services/qa/linked_data/language_sort_service.rb +81 -0
- data/app/services/qa/linked_data/mapper/context_mapper_service.rb +59 -0
- data/app/services/qa/linked_data/mapper/graph_mapper_service.rb +40 -0
- data/app/services/qa/linked_data/mapper/search_results_mapper_service.rb +70 -0
- data/config/authorities/linked_data/loc.json +5 -2
- data/config/authorities/linked_data/oclc_fast.json +3 -2
- data/config/initializers/linked_data_authorities.rb +1 -1
- data/config/locales/qa.en.yml +9 -0
- data/lib/generators/qa/install/templates/config/initializers/qa.rb +4 -0
- data/lib/qa.rb +8 -0
- data/lib/qa/authorities/assign_fast/generic_authority.rb +1 -1
- data/lib/qa/authorities/base.rb +0 -11
- data/lib/qa/authorities/crossref/generic_authority.rb +1 -1
- data/lib/qa/authorities/geonames.rb +1 -1
- data/lib/qa/authorities/getty/aat.rb +7 -2
- data/lib/qa/authorities/getty/tgn.rb +7 -2
- data/lib/qa/authorities/getty/ulan.rb +7 -2
- data/lib/qa/authorities/linked_data.rb +0 -1
- data/lib/qa/authorities/linked_data/config.rb +29 -28
- data/lib/qa/authorities/linked_data/config/search_config.rb +21 -79
- data/lib/qa/authorities/linked_data/config/term_config.rb +7 -77
- data/lib/qa/authorities/linked_data/find_term.rb +25 -17
- data/lib/qa/authorities/linked_data/generic_authority.rb +6 -5
- data/lib/qa/authorities/linked_data/rdf_helper.rb +6 -73
- data/lib/qa/authorities/linked_data/search_query.rb +54 -101
- data/lib/qa/authorities/loc/generic_authority.rb +4 -4
- data/lib/qa/authorities/web_service_base.rb +1 -8
- data/lib/qa/configuration.rb +7 -0
- data/lib/qa/version.rb +1 -1
- data/lib/tasks/mesh.rake +19 -18
- data/spec/controllers/linked_data_terms_controller_spec.rb +51 -1
- data/spec/controllers/terms_controller_spec.rb +15 -15
- data/spec/fixtures/authorities/linked_data/lod_encoding_config.json +2 -1
- data/spec/fixtures/authorities/linked_data/lod_full_config.json +56 -2
- data/spec/fixtures/authorities/linked_data/lod_full_config_1_0.json +164 -0
- data/spec/fixtures/authorities/linked_data/lod_lang_defaults.json +5 -4
- data/spec/fixtures/authorities/linked_data/lod_lang_multi_defaults.json +3 -2
- data/spec/fixtures/authorities/linked_data/lod_lang_no_defaults.json +3 -2
- data/spec/fixtures/authorities/linked_data/lod_lang_param.json +3 -2
- data/spec/fixtures/authorities/linked_data/lod_min_config.json +3 -2
- data/spec/fixtures/authorities/linked_data/lod_search_only_config.json +2 -1
- data/spec/fixtures/authorities/linked_data/lod_sort.json +2 -1
- data/spec/fixtures/authorities/linked_data/lod_term_id_param_config.json +2 -1
- data/spec/fixtures/authorities/linked_data/lod_term_only_config.json +2 -1
- data/spec/fixtures/authorities/linked_data/lod_term_uri_param_config.json +2 -1
- data/spec/fixtures/getty-error-response.txt +10 -0
- data/spec/fixtures/lod_2_ranked_2_unranked.nt +17 -0
- data/spec/fixtures/lod_3_ranked_varying_preds.nt +16 -0
- data/spec/fixtures/lod_lang_search_filtering.nt +11 -0
- data/spec/fixtures/lod_search_with_blanknode_subjects.nt +18 -0
- data/spec/fixtures/lod_term_with_blanknode_objects.nt +8 -0
- data/spec/lib/authorities/assign_fast_spec.rb +1 -0
- data/spec/lib/authorities/getty/aat_spec.rb +14 -2
- data/spec/lib/authorities/getty/tgn_spec.rb +14 -2
- data/spec/lib/authorities/getty/ulan_spec.rb +14 -2
- data/spec/lib/authorities/linked_data/authority_service_spec.rb +2 -1
- data/spec/lib/authorities/linked_data/config_spec.rb +284 -5
- data/spec/lib/authorities/linked_data/find_term_spec.rb +3 -1
- data/spec/lib/authorities/linked_data/generic_authority_spec.rb +92 -42
- data/spec/lib/authorities/linked_data/search_config_spec.rb +67 -160
- data/spec/lib/authorities/linked_data/search_query_spec.rb +3 -127
- data/spec/lib/authorities/linked_data/term_config_spec.rb +6 -134
- data/spec/lib/authorities/loc_spec.rb +9 -9
- data/spec/lib/configuration_spec.rb +20 -7
- data/spec/lib/tasks/mesh.rake_spec.rb +2 -2
- data/spec/models/iri_template/url_config_spec.rb +102 -0
- data/spec/models/iri_template/variable_map_spec.rb +105 -0
- data/spec/models/linked_data/config/context_map_spec.rb +148 -0
- data/spec/models/linked_data/config/context_property_map_spec.rb +286 -0
- data/spec/services/iri_template_service_spec.rb +69 -0
- data/spec/services/linked_data/authority_url_service_spec.rb +107 -0
- data/spec/services/linked_data/deep_sort_service_spec.rb +260 -0
- data/spec/services/linked_data/graph_service_spec.rb +232 -0
- data/spec/services/linked_data/language_service_spec.rb +66 -0
- data/spec/services/linked_data/language_sort_service_spec.rb +58 -0
- data/spec/services/linked_data/mapper/context_mapper_service_spec.rb +137 -0
- data/spec/services/linked_data/mapper/graph_mapper_service_spec.rb +110 -0
- data/spec/services/linked_data/mapper/search_results_mapper_service_spec.rb +109 -0
- data/spec/spec_helper.rb +10 -2
- metadata +81 -11
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
RSpec.describe Qa::IriTemplate::VariableMap do
|
|
4
|
+
subject { described_class.new(map) }
|
|
5
|
+
|
|
6
|
+
let(:map) do
|
|
7
|
+
{
|
|
8
|
+
:"@type" => "IriTemplateMapping",
|
|
9
|
+
property: "hydra:freetextQuery",
|
|
10
|
+
variable: "subauth",
|
|
11
|
+
required: true
|
|
12
|
+
}
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
describe 'model attributes' do
|
|
16
|
+
it { is_expected.to respond_to :variable }
|
|
17
|
+
it { is_expected.to respond_to :simple_value }
|
|
18
|
+
# it { is_expected.to respond_to :parameter_value }
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
describe '#new' do
|
|
22
|
+
context 'when variable is missing' do
|
|
23
|
+
before do
|
|
24
|
+
map.delete(:variable)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it 'raises an error' do
|
|
28
|
+
expect { described_class.new(map) }.to raise_error(Qa::InvalidConfiguration, 'variable is required')
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
context 'when invalid required value' do
|
|
33
|
+
before do
|
|
34
|
+
map[:required] = 'BAD_REQUIRED'
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it 'raises an error' do
|
|
38
|
+
expect { described_class.new(map) }.to raise_error(Qa::InvalidConfiguration, 'required must be true or false')
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
describe '#variable' do
|
|
44
|
+
it 'returns the configured variable' do
|
|
45
|
+
expect(subject.variable).to eq 'subauth'
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
describe '#simple_value' do
|
|
50
|
+
context 'when sub_value is not passed in' do
|
|
51
|
+
context 'and default is not defined' do
|
|
52
|
+
context 'and variable is required' do
|
|
53
|
+
before do
|
|
54
|
+
map[:required] = true
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it 'raises error' do
|
|
58
|
+
expect { subject.simple_value }.to raise_error(StandardError, 'subauth is required, but missing')
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
context 'and variable is not required' do
|
|
63
|
+
before do
|
|
64
|
+
map[:required] = false
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it 'returns empty string' do
|
|
68
|
+
expect(subject.simple_value).to eq ''
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
context 'and default is defined' do
|
|
74
|
+
before do
|
|
75
|
+
map[:required] = false
|
|
76
|
+
map[:default] = 'personal_name'
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it 'returns the default' do
|
|
80
|
+
expect(subject.simple_value).to eq 'personal_name'
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
context 'when sub_value is passed in' do
|
|
86
|
+
before do
|
|
87
|
+
map[:required] = true
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
it 'returns passed in sub_value' do
|
|
91
|
+
expect(subject.simple_value('corporate_name')).to eq 'corporate_name'
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
context 'when sub_value should be encoded' do
|
|
96
|
+
before do
|
|
97
|
+
map[:encode] = true
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
it 'returns encoded sub_value' do
|
|
101
|
+
expect(subject.simple_value('http://example.org/over/the_rainbow')).to eq 'http%3A%2F%2Fexample%2Eorg%2Fover%2Fthe_rainbow'
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
RSpec.describe Qa::LinkedData::Config::ContextMap do
|
|
4
|
+
subject { described_class.new(context_map) }
|
|
5
|
+
|
|
6
|
+
before do
|
|
7
|
+
# simulate the existence of the i18n entries
|
|
8
|
+
allow(I18n).to receive(:t).and_call_original
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
let(:context_map) do
|
|
12
|
+
{
|
|
13
|
+
groups: {
|
|
14
|
+
dates: {
|
|
15
|
+
group_label_i18n: 'qa.linked_data.authority.locnames_ld4l_cache.dates',
|
|
16
|
+
group_label_default: 'default_Dates'
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
properties: [
|
|
20
|
+
{
|
|
21
|
+
property_label_i18n: 'qa.linked_data.authority.locgenres_ld4l_cache.authoritative_label',
|
|
22
|
+
property_label_default: 'default_Authoritative Label',
|
|
23
|
+
ldpath: 'madsrdf:authoritativeLabel',
|
|
24
|
+
selectable: true,
|
|
25
|
+
drillable: false
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
group_id: 'dates',
|
|
29
|
+
property_label_i18n: 'qa.linked_data.authority.locnames_ld4l_cache.birth_date',
|
|
30
|
+
property_label_default: 'default_Birth',
|
|
31
|
+
ldpath: 'madsrdf:identifiesRWO/madsrdf:birthDate/schema:label',
|
|
32
|
+
selectable: false,
|
|
33
|
+
drillable: false
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
group_id: 'dates',
|
|
37
|
+
property_label_i18n: 'qa.linked_data.authority.locnames_ld4l_cache.death_date',
|
|
38
|
+
property_label_default: 'default_Death',
|
|
39
|
+
ldpath: 'madsrdf:identifiesRWO/madsrdf:deathDate/schema:label',
|
|
40
|
+
selectable: false,
|
|
41
|
+
drillable: false
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
}
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
let(:prefixes) do
|
|
48
|
+
{
|
|
49
|
+
schema: "http://www.w3.org/2000/01/rdf-schema#",
|
|
50
|
+
skos: "http://www.w3.org/2004/02/skos/core#"
|
|
51
|
+
}
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
describe '#new' do
|
|
55
|
+
it 'accepts a single parameter for context_map' do
|
|
56
|
+
expect(subject).to be_kind_of described_class
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it 'accepts required context_map parameter and optional prefixes parameter' do
|
|
60
|
+
expect(described_class.new(context_map, prefixes)).to be_kind_of described_class
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
describe '#properties' do
|
|
65
|
+
it 'returns the configured url template' do
|
|
66
|
+
expect(subject.properties.size).to eq 3
|
|
67
|
+
expect(subject.properties.first).to be_kind_of Qa::LinkedData::Config::ContextPropertyMap
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
describe '#group_label' do
|
|
72
|
+
context 'when map defines group_label_i18n key' do
|
|
73
|
+
context 'and i18n translation is defined in locales' do
|
|
74
|
+
before do
|
|
75
|
+
allow(I18n).to receive(:t).with('qa.linked_data.authority.locnames_ld4l_cache.dates', default: 'default_Dates').and_return('Dates')
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it 'returns the translated text' do
|
|
79
|
+
expect(subject.group_label(:dates)).to eq 'Dates'
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
context 'and i18n translation is NOT defined in locales' do
|
|
84
|
+
context 'and default is defined in the map' do
|
|
85
|
+
before do
|
|
86
|
+
allow(I18n).to receive(:t).with('qa.linked_data.authority.locnames_ld4l_cache.dates', default: 'default_Dates').and_return('default_Dates')
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it 'returns the default value' do
|
|
90
|
+
expect(subject.group_label(:dates)).to eq 'default_Dates'
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
context 'and default is NOT defined in the map' do
|
|
95
|
+
let(:groups) do
|
|
96
|
+
{
|
|
97
|
+
dates: {
|
|
98
|
+
group_label_i18n: 'qa.linked_data.authority.locnames_ld4l_cache.dates'
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
end
|
|
102
|
+
before do
|
|
103
|
+
context_map[:groups] = groups
|
|
104
|
+
allow(I18n).to receive(:t).with('qa.linked_data.authority.locnames_ld4l_cache.dates', nil).and_return(nil)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
it 'returns nil' do
|
|
108
|
+
expect(subject.group_label(:dates)).to eq nil
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
context 'when map does NOT define group_label_i18n key' do
|
|
115
|
+
context 'and default is defined in map' do
|
|
116
|
+
let(:groups) do
|
|
117
|
+
{
|
|
118
|
+
dates: {
|
|
119
|
+
group_label_default: 'default_Dates'
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
end
|
|
123
|
+
before do
|
|
124
|
+
context_map[:groups] = groups
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
it 'returns the default value' do
|
|
128
|
+
expect(subject.group_label(:dates)).to eq 'default_Dates'
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
context 'and default is NOT defined in map' do
|
|
133
|
+
let(:groups) do
|
|
134
|
+
{
|
|
135
|
+
dates: {}
|
|
136
|
+
}
|
|
137
|
+
end
|
|
138
|
+
before do
|
|
139
|
+
context_map[:groups] = groups
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
it 'returns nil' do
|
|
143
|
+
expect(subject.group_label(:dates)).to eq nil
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
end
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
RSpec.describe Qa::LinkedData::Config::ContextPropertyMap do
|
|
4
|
+
subject { described_class.new(property_map) }
|
|
5
|
+
|
|
6
|
+
let(:property_map) do
|
|
7
|
+
{
|
|
8
|
+
group_id: 'dates',
|
|
9
|
+
property_label_i18n: 'qa.linked_data.authority.locnames_ld4l_cache.birth_date',
|
|
10
|
+
property_label_default: 'default_Birth',
|
|
11
|
+
ldpath: 'madsrdf:identifiesRWO/madsrdf:birthDate/schema:label',
|
|
12
|
+
selectable: false,
|
|
13
|
+
drillable: false,
|
|
14
|
+
expansion_label_ldpath: 'skos:prefLabel ::xsd:string',
|
|
15
|
+
expansion_id_ldpath: 'loc:lccn ::xsd:string'
|
|
16
|
+
}
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
let(:prefixes) do
|
|
20
|
+
{
|
|
21
|
+
schema: 'http://www.w3.org/2000/01/rdf-schema#',
|
|
22
|
+
skos: 'http://www.w3.org/2004/02/skos/core#'
|
|
23
|
+
}
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
describe '#new' do
|
|
27
|
+
context 'when ldpath is missing' do
|
|
28
|
+
before { property_map.delete(:ldpath) }
|
|
29
|
+
|
|
30
|
+
it 'raises an error' do
|
|
31
|
+
expect { subject }.to raise_error(Qa::InvalidConfiguration, 'ldpath is required')
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
context 'when invalid selectable value' do
|
|
36
|
+
before { property_map[:selectable] = 'INVALID' }
|
|
37
|
+
|
|
38
|
+
it 'raises an error' do
|
|
39
|
+
expect { subject }.to raise_error(Qa::InvalidConfiguration, 'selectable must be true or false')
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
context 'when invalid drillable value' do
|
|
44
|
+
before { property_map[:drillable] = 'INVALID' }
|
|
45
|
+
|
|
46
|
+
it 'raises an error' do
|
|
47
|
+
expect { subject }.to raise_error(Qa::InvalidConfiguration, 'drillable must be true or false')
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it 'accepts a single parameter for property_map' do
|
|
52
|
+
expect(subject).to be_kind_of described_class
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
it 'accepts required property_map parameter and optional prefixes parameter' do
|
|
56
|
+
expect(described_class.new(property_map, prefixes)).to be_kind_of described_class
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
describe '#selectable?' do
|
|
61
|
+
context 'when map has selectable: true' do
|
|
62
|
+
before { property_map[:selectable] = true }
|
|
63
|
+
|
|
64
|
+
it 'returns true' do
|
|
65
|
+
expect(subject.selectable?).to be true
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
context 'when map has selectable: false' do
|
|
70
|
+
before { property_map[:selectable] = false }
|
|
71
|
+
|
|
72
|
+
it 'returns false' do
|
|
73
|
+
expect(subject.selectable?).to be false
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
context 'when selectable: is not defined in the map' do
|
|
78
|
+
before { property_map.delete(:selectable) }
|
|
79
|
+
|
|
80
|
+
it 'returns false' do
|
|
81
|
+
expect(subject.selectable?).to be false
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
describe '#drillable?' do
|
|
87
|
+
context 'when map has drillable: true' do
|
|
88
|
+
before { property_map[:drillable] = true }
|
|
89
|
+
|
|
90
|
+
it 'returns true' do
|
|
91
|
+
expect(subject.drillable?).to be true
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
context 'when map has drillable: false' do
|
|
96
|
+
before { property_map[:drillable] = false }
|
|
97
|
+
|
|
98
|
+
it 'returns false' do
|
|
99
|
+
expect(subject.drillable?).to be false
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
context 'when drillable: is not defined in the map' do
|
|
104
|
+
before { property_map.delete(:drillable) }
|
|
105
|
+
|
|
106
|
+
it 'returns false' do
|
|
107
|
+
expect(subject.drillable?).to be false
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
describe '#label' do
|
|
113
|
+
context 'when map defines property_label_i18n key' do
|
|
114
|
+
context 'and i18n translation is defined in locales' do
|
|
115
|
+
before do
|
|
116
|
+
allow(I18n).to receive(:t).with('qa.linked_data.authority.locnames_ld4l_cache.birth_date', default: 'default_Birth').and_return('Birth')
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
it 'returns the translated text' do
|
|
120
|
+
expect(subject.label).to eq 'Birth'
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
context 'and i18n translation is NOT defined in locales' do
|
|
125
|
+
context 'and default is defined in the map' do
|
|
126
|
+
before do
|
|
127
|
+
allow(I18n).to receive(:t).with('qa.linked_data.authority.locnames_ld4l_cache.birth_date', default: 'default_Birth').and_return('default_Birth')
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
it 'returns the default value' do
|
|
131
|
+
expect(subject.label).to eq 'default_Birth'
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
context 'and default is NOT defined in the map' do
|
|
136
|
+
before do
|
|
137
|
+
property_map.delete(:property_label_default)
|
|
138
|
+
allow(I18n).to receive(:t).with('qa.linked_data.authority.locnames_ld4l_cache.birth_date', default: nil).and_return(nil)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
it 'returns nil' do
|
|
142
|
+
expect(subject.label).to eq nil
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
context 'when map does NOT define property_label_i18n key' do
|
|
149
|
+
before { property_map.delete(:property_label_i18n) }
|
|
150
|
+
|
|
151
|
+
context 'and default is defined in map' do
|
|
152
|
+
it 'returns the default value' do
|
|
153
|
+
expect(subject.label).to eq 'default_Birth'
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
context 'and default is NOT defined in map' do
|
|
158
|
+
before { property_map.delete(:property_label_default) }
|
|
159
|
+
|
|
160
|
+
it 'returns nil' do
|
|
161
|
+
expect(subject.label).to eq nil
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
describe '#group_id' do
|
|
168
|
+
context 'when map defines group_id' do
|
|
169
|
+
it 'returns group_id as a symbol' do
|
|
170
|
+
expect(subject.group_id).to eq :dates
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
context 'when map does NOT define group_id' do
|
|
175
|
+
before { property_map.delete(:group_id) }
|
|
176
|
+
|
|
177
|
+
it 'returns nil' do
|
|
178
|
+
expect(subject.group_id).to eq nil
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
describe '#group?' do
|
|
184
|
+
context 'when map defines group_id' do
|
|
185
|
+
it 'returns true' do
|
|
186
|
+
expect(subject.group?).to be true
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
context 'when map does NOT define group_id' do
|
|
191
|
+
before { property_map.delete(:group_id) }
|
|
192
|
+
|
|
193
|
+
it 'returns false' do
|
|
194
|
+
expect(subject.group?).to be false
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
describe '#values' do
|
|
200
|
+
let(:program) { instance_double(Ldpath::Program) }
|
|
201
|
+
let(:coordinates) { '42.4488° N, 76.4763° W' }
|
|
202
|
+
let(:subject_uri) { instance_double(RDF::URI) }
|
|
203
|
+
let(:graph) { instance_double(RDF::Graph) }
|
|
204
|
+
|
|
205
|
+
before do
|
|
206
|
+
allow(Ldpath::Program).to receive(:parse).with(anything).and_return(program)
|
|
207
|
+
allow(program).to receive(:evaluate).with(anything, anything).and_return('property' => [coordinates, coordinates, coordinates]) # check that uniq is applied
|
|
208
|
+
end
|
|
209
|
+
it 'returns the values selected from the graph' do
|
|
210
|
+
expect(subject.values(graph, subject_uri)).to match_array coordinates
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
context 'when ldpath_program gets parse error' do
|
|
214
|
+
let(:ldpath) { property_map[:ldpath] }
|
|
215
|
+
let(:cause) { "undefined method `ascii_tree' for nil:NilClass" }
|
|
216
|
+
let(:warning) { I18n.t('qa.linked_data.ldpath.parse_logger_error') }
|
|
217
|
+
let(:log_message) { "WARNING: #{warning} (ldpath='#{ldpath}')\n cause: #{cause}" }
|
|
218
|
+
|
|
219
|
+
before { allow(Ldpath::Program).to receive(:parse).with(anything).and_raise(cause) }
|
|
220
|
+
|
|
221
|
+
it 'logs error and returns PARSE ERROR as the value' do
|
|
222
|
+
expect(Rails.logger).to receive(:warn).with(log_message)
|
|
223
|
+
expect { subject.values(graph, subject_uri) }.to raise_error StandardError, I18n.t('qa.linked_data.ldpath.parse_error')
|
|
224
|
+
end
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
context 'when ldpath_evaluate gets parse error' do
|
|
228
|
+
let(:ldpath) { property_map[:ldpath] }
|
|
229
|
+
let(:cause) { "unknown cause" }
|
|
230
|
+
let(:warning) { I18n.t('qa.linked_data.ldpath.evaluate_logger_error') }
|
|
231
|
+
let(:log_message) { "WARNING: #{warning} (ldpath='#{ldpath}')\n cause: #{cause}" }
|
|
232
|
+
|
|
233
|
+
before { allow(program).to receive(:evaluate).with(subject_uri, graph).and_raise(cause) }
|
|
234
|
+
|
|
235
|
+
it 'logs error and returns PARSE ERROR as the value' do
|
|
236
|
+
expect(Rails.logger).to receive(:warn).with(log_message)
|
|
237
|
+
expect { subject.values(graph, subject_uri) }.to raise_error StandardError, I18n.t('qa.linked_data.ldpath.evaluate_error')
|
|
238
|
+
end
|
|
239
|
+
end
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
describe '#expand_uri?' do
|
|
243
|
+
context 'when map has a value for expansion_label_ldpath' do
|
|
244
|
+
it 'returns true' do
|
|
245
|
+
expect(subject.expand_uri?).to be true
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
context 'when map does NOT have a value for expansion_label_ldpath' do
|
|
250
|
+
before { property_map.delete(:expansion_label_ldpath) }
|
|
251
|
+
|
|
252
|
+
it 'returns false' do
|
|
253
|
+
expect(subject.expand_uri?).to be false
|
|
254
|
+
end
|
|
255
|
+
end
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
describe '#expanded_values' do
|
|
259
|
+
let(:graph) { instance_double(RDF::Graph) }
|
|
260
|
+
let(:subject_uri) { instance_double(RDF::URI) }
|
|
261
|
+
|
|
262
|
+
let(:basic_program) { instance_double(Ldpath::Program) }
|
|
263
|
+
let(:expanded_label_program) { instance_double(Ldpath::Program) }
|
|
264
|
+
let(:expanded_id_program) { instance_double(Ldpath::Program) }
|
|
265
|
+
|
|
266
|
+
let(:expanded_uri) { instance_double(RDF::URI) }
|
|
267
|
+
let(:expanded_label) { 'A Broader Term' }
|
|
268
|
+
let(:expanded_id) { '123' }
|
|
269
|
+
|
|
270
|
+
before do
|
|
271
|
+
allow(Ldpath::Program).to receive(:parse).with('property = madsrdf:identifiesRWO/madsrdf:birthDate/schema:label ;').and_return(basic_program)
|
|
272
|
+
allow(Ldpath::Program).to receive(:parse).with('property = skos:prefLabel ::xsd:string ;').and_return(expanded_label_program)
|
|
273
|
+
allow(Ldpath::Program).to receive(:parse).with('property = loc:lccn ::xsd:string ;').and_return(expanded_id_program)
|
|
274
|
+
allow(basic_program).to receive(:evaluate).with(subject_uri, graph).and_return('property' => [expanded_uri])
|
|
275
|
+
allow(expanded_label_program).to receive(:evaluate).with(RDF::URI.new(subject_uri), graph).and_return('property' => [expanded_label])
|
|
276
|
+
allow(expanded_id_program).to receive(:evaluate).with(RDF::URI.new(subject_uri), graph).and_return('property' => [expanded_id])
|
|
277
|
+
end
|
|
278
|
+
it 'returns the uri, id, label for the expanded uri value' do
|
|
279
|
+
expanded_values = subject.expanded_values(graph, subject_uri).first
|
|
280
|
+
expect(expanded_values).to be_kind_of Hash
|
|
281
|
+
expect(expanded_values[:uri]).to eq expanded_uri
|
|
282
|
+
expect(expanded_values[:id]).to eq expanded_id
|
|
283
|
+
expect(expanded_values[:label]).to eq expanded_label
|
|
284
|
+
end
|
|
285
|
+
end
|
|
286
|
+
end
|