geo_combine 0.1.0 → 0.5.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 (42) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +6 -1
  3. data/Gemfile +2 -1
  4. data/README.md +108 -23
  5. data/geo_combine.gemspec +4 -2
  6. data/lib/geo_combine.rb +11 -1
  7. data/lib/geo_combine/bounding_box.rb +71 -0
  8. data/lib/geo_combine/ckan_metadata.rb +112 -0
  9. data/lib/geo_combine/esri_open_data.rb +0 -9
  10. data/lib/geo_combine/exceptions.rb +8 -0
  11. data/lib/geo_combine/formatting.rb +6 -1
  12. data/lib/geo_combine/geo_blacklight_harvester.rb +203 -0
  13. data/lib/geo_combine/geoblacklight.rb +80 -12
  14. data/lib/geo_combine/ogp.rb +229 -0
  15. data/lib/geo_combine/railtie.rb +7 -0
  16. data/lib/geo_combine/version.rb +1 -1
  17. data/lib/tasks/geo_combine.rake +54 -20
  18. data/lib/xslt/fgdc2geoBL.xsl +95 -154
  19. data/lib/xslt/fgdc2html.xsl +105 -157
  20. data/lib/xslt/iso2geoBL.xsl +62 -84
  21. data/lib/xslt/iso2html.xsl +1107 -1070
  22. data/spec/features/iso2html_spec.rb +7 -1
  23. data/spec/fixtures/docs/basic_geoblacklight.json +5 -7
  24. data/spec/fixtures/docs/ckan.json +456 -0
  25. data/spec/fixtures/docs/full_geoblacklight.json +2 -8
  26. data/spec/fixtures/docs/geoblacklight_pre_v1.json +37 -0
  27. data/spec/fixtures/docs/ogp_harvard_line.json +28 -0
  28. data/spec/fixtures/docs/ogp_harvard_raster.json +28 -0
  29. data/spec/fixtures/docs/ogp_tufts_vector.json +31 -0
  30. data/spec/fixtures/json_docs.rb +20 -0
  31. data/spec/lib/geo_combine/bounding_box_spec.rb +59 -0
  32. data/spec/lib/geo_combine/ckan_metadata_spec.rb +114 -0
  33. data/spec/lib/geo_combine/esri_open_data_spec.rb +1 -14
  34. data/spec/lib/geo_combine/fgdc_spec.rb +11 -14
  35. data/spec/lib/geo_combine/formatting_spec.rb +6 -0
  36. data/spec/lib/geo_combine/geo_blacklight_harvester_spec.rb +190 -0
  37. data/spec/lib/geo_combine/geoblacklight_spec.rb +137 -11
  38. data/spec/lib/geo_combine/iso19139_spec.rb +5 -2
  39. data/spec/lib/geo_combine/ogp_spec.rb +163 -0
  40. data/spec/spec_helper.rb +1 -0
  41. metadata +63 -14
  42. data/lib/schema/geoblacklight-schema.json +0 -169
@@ -19,4 +19,10 @@ RSpec.describe GeoCombine::Formatting do
19
19
  expect(subject.sanitize_and_remove_lines(dirty)).to_not match(/\n/)
20
20
  end
21
21
  end
22
+ describe '#sluggify' do
23
+ let(:preslug) { 'HARVARD...Co_0l' }
24
+ it 'handles multiple . and _ and uppercase' do
25
+ expect(subject.sluggify(preslug)).to eq 'harvard-co-0l'
26
+ end
27
+ end
22
28
  end
@@ -0,0 +1,190 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'rsolr'
5
+
6
+ RSpec.describe GeoCombine::GeoBlacklightHarvester do
7
+ let(:site_key) { :INSTITUTION }
8
+ let(:stub_json_response) { '{}' }
9
+ let(:stub_solr_connection) { double('RSolr::Connection') }
10
+ subject(:harvester) { described_class.new(site_key) }
11
+
12
+ before do
13
+ allow(described_class).to receive(:config).and_return({
14
+ INSTITUTION: {
15
+ host: 'https://example.com/',
16
+ params: {
17
+ f: { dct_provenance_s: ['INSTITUTION'] }
18
+ }
19
+ }
20
+ })
21
+ end
22
+
23
+ describe 'initialization' do
24
+ context 'when an unconfigured site is sent in' do
25
+ let(:site_key) { 'unknown' }
26
+
27
+ it { expect { harvester }.to raise_error(ArgumentError) }
28
+ end
29
+ end
30
+
31
+ describe '#index' do
32
+ before do
33
+ expect(Net::HTTP).to receive(:get).with(
34
+ URI('https://example.com?f%5Bdct_provenance_s%5D%5B%5D=INSTITUTION&format=json&per_page=100&page=1')
35
+ ).and_return(stub_json_response)
36
+ allow(RSolr).to receive(:connect).and_return(stub_solr_connection)
37
+ end
38
+
39
+ let(:docs) { [{ layer_slug_s: 'abc-123' }, { layer_slug_s: 'abc-321' }] }
40
+ let(:stub_json_response) do
41
+ { response: { docs: docs, pages: { current_page: 1, total_pages: 1 } } }.to_json
42
+ end
43
+
44
+ it 'adds documents returned to solr' do
45
+ expect(stub_solr_connection).to receive(:update).with(hash_including(data: docs.to_json)).and_return(nil)
46
+ harvester.index
47
+ end
48
+
49
+ describe 'document tranformations' do
50
+ let(:docs) do
51
+ [
52
+ { layer_slug_s: 'abc-123', _version_: '1', timestamp: '1999-12-31', score: 0.1 },
53
+ { layer_slug_s: 'abc-321', dc_source_s: 'abc-123' }
54
+ ]
55
+ end
56
+
57
+ context 'when a tranformer is set' do
58
+ before do
59
+ expect(described_class).to receive(:document_transformer).at_least(:once).and_return(
60
+ ->(doc) {
61
+ doc.delete('_version_')
62
+ doc
63
+ }
64
+ )
65
+ end
66
+
67
+ it 'removes the _version_ field as requested' do
68
+ expect(stub_solr_connection).to receive(:update).with(
69
+ hash_including(
70
+ data: [
71
+ { layer_slug_s: 'abc-123', timestamp: '1999-12-31', score: 0.1 },
72
+ { layer_slug_s: 'abc-321', dc_source_s: 'abc-123' }
73
+ ].to_json
74
+ )
75
+ ).and_return(nil)
76
+
77
+ harvester.index
78
+ end
79
+ end
80
+
81
+ context 'when no transformer is set' do
82
+ it 'removes the _version_, timestamp, and score fields' do
83
+ expect(stub_solr_connection).to receive(:update).with(
84
+ hash_including(
85
+ data: [
86
+ { layer_slug_s: 'abc-123' },
87
+ { layer_slug_s: 'abc-321', dc_source_s: 'abc-123' }
88
+ ].to_json
89
+ )
90
+ ).and_return(nil)
91
+
92
+ harvester.index
93
+ end
94
+ end
95
+ end
96
+ end
97
+
98
+ describe 'BlacklightResponseVersionFactory' do
99
+ let(:version_class) { described_class::BlacklightResponseVersionFactory.call(json) }
100
+
101
+ context 'when a legacy blacklight version (6 and earlier)' do
102
+ let(:json) { { 'response' => {} } }
103
+
104
+ it { expect(version_class).to be described_class::LegacyBlacklightResponse }
105
+ end
106
+
107
+ context 'when a modern blacklight version (7 and later)' do
108
+ let(:json) { { 'links' => {}, 'data' => [] } }
109
+
110
+ it { expect(version_class).to be described_class::ModernBlacklightResponse }
111
+ end
112
+
113
+ context 'when a the JSON response is not recognizable' do
114
+ let(:json) { { error: 'Broken' } }
115
+
116
+ it { expect { version_class }.to raise_error(NotImplementedError) }
117
+ end
118
+ end
119
+
120
+ describe 'LegacyBlacklightResponse' do
121
+ before do
122
+ allow(RSolr).to receive(:connect).and_return(stub_solr_connection)
123
+ end
124
+
125
+ let(:first_docs) { [{ 'layer_slug_s' => 'abc-123' }, { 'layer_slug_s' => 'abc-321' }] }
126
+ let(:second_docs) { [{ 'layer_slug_s' => 'xyz-123' }, { 'layer_slug_s' => 'xyz-321' }] }
127
+ let(:stub_first_response) do
128
+ { 'response' => { 'docs' => first_docs, 'pages' => { 'current_page' => 1, 'total_pages' => 2 } } }
129
+ end
130
+ let(:stub_second_response) do
131
+ { 'response' => { 'docs' => second_docs, 'pages' => { 'current_page' => 2, 'total_pages' => 2 } } }
132
+ end
133
+
134
+ describe '#documents' do
135
+ it 'pages through the response and returns all the documents' do
136
+ expect(Net::HTTP).to receive(:get).with(
137
+ URI('https://example.com?f%5Bdct_provenance_s%5D%5B%5D=INSTITUTION&format=json&per_page=100&page=2')
138
+ ).and_return(stub_second_response.to_json)
139
+ base_url = 'https://example.com?f%5Bdct_provenance_s%5D%5B%5D=INSTITUTION&format=json&per_page=100'
140
+ docs = described_class::LegacyBlacklightResponse.new(response: stub_first_response, base_url: base_url).documents
141
+
142
+ expect(docs.to_a).to eq([first_docs, second_docs])
143
+ end
144
+ end
145
+ end
146
+
147
+ describe 'ModernBlacklightResponse' do
148
+ before do
149
+ allow(RSolr).to receive(:connect).and_return(stub_solr_connection)
150
+ expect(Net::HTTP).to receive(:get).with(
151
+ URI('https://example.com?f%5Bdct_provenance_s%5D%5B%5D=INSTITUTION&format=json&per_page=100&page=2')
152
+ ).and_return(second_results_response.to_json)
153
+ end
154
+
155
+ let(:first_results_response) do
156
+ { 'data' => [
157
+ { 'links' => { 'self' => 'https://example.com/catalog/abc-123' } },
158
+ { 'links' => { 'self' => 'https://example.com/catalog/abc-321' } }
159
+ ],
160
+ 'links' => { 'next' => 'https://example.com?f%5Bdct_provenance_s%5D%5B%5D=INSTITUTION&format=json&per_page=100&page=2' }
161
+ }
162
+ end
163
+
164
+ let(:second_results_response) do
165
+ { 'data' => [
166
+ { 'links' => { 'self' => 'https://example.com/catalog/xyz-123' } },
167
+ { 'links' => { 'self' => 'https://example.com/catalog/xyz-321' } }
168
+ ]
169
+ }
170
+ end
171
+
172
+ describe '#documents' do
173
+ it 'pages through the response and fetches documents for each "link" on the response data' do
174
+ %w[abc-123 abc-321 xyz-123 xyz-321].each do |id|
175
+ expect(Net::HTTP).to receive(:get).with(
176
+ URI("https://example.com/catalog/#{id}/raw")
177
+ ).and_return({ 'layer_slug_s' => id }.to_json)
178
+ end
179
+
180
+ base_url = 'https://example.com?f%5Bdct_provenance_s%5D%5B%5D=INSTITUTION&format=json&per_page=100'
181
+ docs = described_class::ModernBlacklightResponse.new(response: first_results_response, base_url: base_url).documents
182
+
183
+ expect(docs.to_a).to eq([
184
+ [{ 'layer_slug_s' => 'abc-123' }, { 'layer_slug_s' => 'abc-321' }],
185
+ [{ 'layer_slug_s' => 'xyz-123' }, { 'layer_slug_s' => 'xyz-321' }],
186
+ ])
187
+ end
188
+ end
189
+ end
190
+ end
@@ -3,16 +3,18 @@ require 'spec_helper'
3
3
  RSpec.describe GeoCombine::Geoblacklight do
4
4
  include XmlDocs
5
5
  include JsonDocs
6
- let(:full_geobl) { GeoCombine::Geoblacklight.new(full_geoblacklight) }
7
- let(:basic_geobl) { GeoCombine::Geoblacklight.new(basic_geoblacklight) }
6
+ include GeoCombine::Exceptions
7
+ let(:full_geobl) { described_class.new(full_geoblacklight) }
8
+ let(:basic_geobl) { described_class.new(basic_geoblacklight) }
9
+ let(:pre_v1_geobl) { described_class.new(geoblacklight_pre_v1) }
8
10
  describe '#initialize' do
9
11
  it 'parses metadata argument JSON to Hash' do
10
12
  expect(basic_geobl.instance_variable_get(:@metadata)).to be_an Hash
11
13
  end
12
14
  describe 'merges fields argument into metadata' do
13
- let(:basic_geobl) { GeoCombine::Geoblacklight.new(basic_geoblacklight, 'uuid' => 'new one', "extra_field" => true)}
15
+ let(:basic_geobl) { described_class.new(basic_geoblacklight, 'dc_identifier_s' => 'new one', "extra_field" => true)}
14
16
  it 'overwrites existing metadata fields' do
15
- expect(basic_geobl.metadata['uuid']).to eq 'new one'
17
+ expect(basic_geobl.metadata['dc_identifier_s']).to eq 'new one'
16
18
  end
17
19
  it 'adds in new fields' do
18
20
  expect(basic_geobl.metadata['extra_field']).to be true
@@ -22,7 +24,7 @@ RSpec.describe GeoCombine::Geoblacklight do
22
24
  describe '#metadata' do
23
25
  it 'reads the metadata instance variable' do
24
26
  expect(basic_geobl.metadata).to be_an Hash
25
- expect(basic_geobl.metadata).to have_key 'uuid'
27
+ expect(basic_geobl.metadata).to have_key 'dc_identifier_s'
26
28
  end
27
29
  end
28
30
  describe '#to_json' do
@@ -31,13 +33,9 @@ RSpec.describe GeoCombine::Geoblacklight do
31
33
  expect(valid_json?(basic_geobl.to_json)).to be_truthy
32
34
  end
33
35
  end
36
+ let(:enhanced_geobl) { described_class.new(basic_geoblacklight, 'layer_geom_type_s' => 'esriGeometryPolygon') }
37
+ before { enhanced_geobl.enhance_metadata }
34
38
  describe '#enhance_metadata' do
35
- let(:enhanced_geobl) { GeoCombine::Geoblacklight.new(basic_geoblacklight, 'dct_references_s' => '', 'layer_geom_type_s' => 'esriGeometryPolygon') }
36
- before { enhanced_geobl.enhance_metadata }
37
- it 'calls enhancement methods to validate document' do
38
- expect { basic_geobl.valid? }.to raise_error JSON::Schema::ValidationError
39
- expect(enhanced_geobl.valid?).to be true
40
- end
41
39
  it 'enhances the dc_subject_sm field' do
42
40
  expect(enhanced_geobl.metadata['dc_subject_sm']).to include 'Boundaries', 'Inland Waters'
43
41
  end
@@ -52,8 +50,136 @@ RSpec.describe GeoCombine::Geoblacklight do
52
50
  it 'a valid geoblacklight-schema document should be valid' do
53
51
  expect(full_geobl.valid?).to be true
54
52
  end
53
+ context 'must have required fields' do
54
+ %w(
55
+ dc_title_s
56
+ dc_identifier_s
57
+ dc_rights_s
58
+ dct_provenance_s
59
+ layer_slug_s
60
+ solr_geom
61
+ ).each do |field|
62
+ it field do
63
+ full_geobl.metadata.delete field
64
+ expect { full_geobl.valid? }.to raise_error(JSON::Schema::ValidationError, /#{field}/)
65
+ end
66
+ end
67
+ end
68
+ context 'need not have optional fields' do
69
+ %w(
70
+ dc_description_s
71
+ dc_format_s
72
+ dc_language_s
73
+ dc_publisher_s
74
+ dc_source_sm
75
+ dc_subject_sm
76
+ dct_isPartOf_sm
77
+ dct_issued_dt
78
+ dct_references_s
79
+ dct_spatial_sm
80
+ dct_temporal_sm
81
+ geoblacklight_version
82
+ layer_geom_type_s
83
+ layer_id_s
84
+ layer_modified_dt
85
+ solr_year_i
86
+ ).each do |field|
87
+ it field do
88
+ full_geobl.metadata.delete field
89
+ expect { full_geobl.valid? }.not_to raise_error
90
+ end
91
+ end
92
+ end
93
+ context 'need not have deprecated fields' do
94
+ %w(
95
+ dc_relation_sm
96
+ dc_type_s
97
+ georss_box_s
98
+ georss_point_s
99
+ uuid
100
+ ).each do |field|
101
+ it field do
102
+ full_geobl.metadata.delete field
103
+ expect { full_geobl.valid? }.not_to raise_error
104
+ end
105
+ end
106
+ end
55
107
  it 'an invalid document' do
56
108
  expect { basic_geobl.valid? }.to raise_error JSON::Schema::ValidationError
57
109
  end
110
+ it 'calls the dct_references_s validator' do
111
+ expect(enhanced_geobl).to receive(:dct_references_validate!)
112
+ enhanced_geobl.valid?
113
+ end
114
+ it 'validates spatial bounding box' do
115
+ expect(JSON::Validator).to receive(:validate!).and_return true
116
+ expect { basic_geobl.valid? }
117
+ .to raise_error GeoCombine::Exceptions::InvalidGeometry
118
+ end
119
+ end
120
+ describe '#dct_references_validate!' do
121
+ context 'with valid document' do
122
+ it 'is valid' do
123
+ expect(full_geobl.dct_references_validate!).to be true
124
+ end
125
+ end
126
+ context 'with invalid document' do
127
+ let(:unparseable_json) do
128
+ <<-JSON
129
+ {
130
+ \"http://schema.org/url\":\"http://example.com/abc123\",,
131
+ \"http://schema.org/downloadUrl\":\"http://example.com/abc123/data.zip\"
132
+ }
133
+ JSON
134
+ end
135
+ let(:bad_ref) do
136
+ GeoCombine::Geoblacklight.new(
137
+ basic_geoblacklight, 'dct_references_s' => unparseable_json, 'layer_geom_type_s' => 'esriGeometryPolygon'
138
+ )
139
+ end
140
+ let(:not_hash) do
141
+ GeoCombine::Geoblacklight.new(
142
+ basic_geoblacklight, 'dct_references_s' => '[{}]', 'layer_geom_type_s' => 'esriGeometryPolygon'
143
+ )
144
+ end
145
+ before do
146
+ bad_ref.enhance_metadata
147
+ not_hash.enhance_metadata
148
+ end
149
+ it 'unparseable json' do
150
+ expect { bad_ref.dct_references_validate! }.to raise_error JSON::ParserError
151
+ end
152
+ it 'not a hash' do
153
+ expect { not_hash.dct_references_validate! }.to raise_error GeoCombine::Exceptions::InvalidDCTReferences
154
+ end
155
+ end
156
+ end
157
+ describe 'spatial_validate!' do
158
+ context 'when valid' do
159
+ it { full_geobl.spatial_validate! }
160
+ end
161
+ context 'when invalid' do
162
+ it { expect { basic_geobl.spatial_validate! }.to raise_error GeoCombine::Exceptions::InvalidGeometry }
163
+ end
164
+ end
165
+ describe 'upgrade_to_v1' do
166
+ before do
167
+ expect(pre_v1_geobl).to receive(:upgrade_to_v1).and_call_original
168
+ pre_v1_geobl.enhance_metadata
169
+ end
170
+
171
+ it 'tags with version' do
172
+ expect(pre_v1_geobl.metadata).to include('geoblacklight_version' => '1.0')
173
+ end
174
+
175
+ it 'properly deprecates fields' do
176
+ described_class::DEPRECATED_KEYS_V1.each do |k|
177
+ expect(pre_v1_geobl.metadata.keys).not_to include(k.to_s)
178
+ end
179
+ end
180
+
181
+ it 'normalizes slugs' do
182
+ expect(pre_v1_geobl.metadata).to include('layer_slug_s' => 'sde-columbia-esri-arcatlas-snow-ln')
183
+ end
58
184
  end
59
185
  end
@@ -19,7 +19,7 @@ RSpec.describe GeoCombine::Iso19139 do
19
19
  end
20
20
  end
21
21
  describe '#to_geoblacklight' do
22
- let(:valid_geoblacklight) { iso_object.to_geoblacklight('layer_geom_type_s' => 'Polygon', 'dct_references_s' => '') }
22
+ let(:valid_geoblacklight) { iso_object.to_geoblacklight('layer_geom_type_s' => 'Polygon') }
23
23
  it 'should create a GeoCombine::Geoblacklight object' do
24
24
  expect(valid_geoblacklight).to be_an GeoCombine::Geoblacklight
25
25
  end
@@ -27,6 +27,9 @@ RSpec.describe GeoCombine::Iso19139 do
27
27
  valid_geoblacklight.enhance_metadata
28
28
  expect(valid_geoblacklight.valid?).to be_truthy
29
29
  end
30
+ it 'should have geoblacklight_version' do
31
+ expect(valid_geoblacklight.metadata['geoblacklight_version']).to eq '1.0'
32
+ end
30
33
  it 'should have dc_creator_sm' do
31
34
  expect(valid_geoblacklight.metadata["dc_creator_sm"]).to be_an Array
32
35
  expect(valid_geoblacklight.metadata["dc_creator_sm"]).to eq ["Circuit Rider Productions"]
@@ -34,7 +37,7 @@ RSpec.describe GeoCombine::Iso19139 do
34
37
  it 'should have dc_publisher_sm' do
35
38
  expect(valid_geoblacklight.metadata["dc_publisher_sm"]).to be_an Array
36
39
  expect(valid_geoblacklight.metadata["dc_publisher_sm"]).to eq ["Circuit Rider Productions"]
37
- end
40
+ end
38
41
  end
39
42
  describe '#to_html' do
40
43
  it 'should create a transformation of the metadata as a String' do
@@ -0,0 +1,163 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe GeoCombine::OGP do
4
+ include JsonDocs
5
+
6
+ subject(:ogp) { GeoCombine::OGP.new(ogp_harvard_raster) }
7
+ let(:ogp_tufts) { GeoCombine::OGP.new(ogp_tufts_vector) }
8
+ let(:ogp_line) { GeoCombine::OGP.new(ogp_harvard_line) }
9
+ let(:metadata) { ogp.instance_variable_get(:@metadata) }
10
+
11
+ describe '#initialize' do
12
+ it 'parses JSON into metadata Hash' do
13
+ expect(metadata).to be_an Hash
14
+ end
15
+ end
16
+
17
+ describe '#to_geoblacklight' do
18
+ it 'calls geoblacklight_terms to create a GeoBlacklight object' do
19
+ expect(ogp).to receive(:geoblacklight_terms).and_return({})
20
+ expect(ogp.to_geoblacklight).to be_an GeoCombine::Geoblacklight
21
+ end
22
+ end
23
+
24
+ describe '#geoblacklight_terms' do
25
+ describe 'builds a hash which maps metadata' do
26
+ it 'with dc_identifier_s' do
27
+ expect(ogp.geoblacklight_terms).to include(dc_identifier_s: 'HARVARD.SDE2.G1059_W57_1654_PF_SH1')
28
+ end
29
+ it 'with dc_title_s' do
30
+ expect(ogp.geoblacklight_terms).to include(dc_title_s: 'World Map, 1654 (Raster Image)')
31
+ end
32
+ it 'with dc_description_s sanitized' do
33
+ expect(ogp.geoblacklight_terms).to include(dc_description_s: metadata['Abstract'])
34
+ end
35
+ it 'with dc_rights_s' do
36
+ expect(ogp.geoblacklight_terms).to include(dc_rights_s: 'Public')
37
+ expect(ogp_line.geoblacklight_terms).to include(dc_rights_s: 'Restricted')
38
+ end
39
+ it 'with dct_provenance_s' do
40
+ expect(ogp.geoblacklight_terms).to include(dct_provenance_s: 'Harvard')
41
+ end
42
+ it 'with dct_references_s' do
43
+ expect(ogp.geoblacklight_terms).to include(:dct_references_s)
44
+ end
45
+ it 'with layer_id_s that is blank' do
46
+ expect(ogp.geoblacklight_terms)
47
+ .to include(layer_id_s: "#{metadata['WorkspaceName']}:#{metadata['Name']}")
48
+ end
49
+ it 'with layer_geom_type_s' do
50
+ expect(ogp.geoblacklight_terms).to include(:layer_geom_type_s)
51
+ end
52
+ it 'with layer_slug_s' do
53
+ expect(ogp.geoblacklight_terms)
54
+ .to include(layer_slug_s: 'harvard-g1059-w57-1654-pf-sh1')
55
+ end
56
+ it 'with solr_geom' do
57
+ expect(ogp.geoblacklight_terms).to include(:solr_geom)
58
+ end
59
+ it 'with dc_subject_sm' do
60
+ expect(ogp.geoblacklight_terms).to include(
61
+ dc_subject_sm: [
62
+ 'Maps', 'Human settlements', 'Cities and towns', 'Villages',
63
+ 'Bodies of water', 'Landforms', 'Transportation',
64
+ 'imageryBaseMapsEarthCover'
65
+ ]
66
+ )
67
+ end
68
+ it 'with dct_spatial_sm' do
69
+ expect(ogp.geoblacklight_terms).to include(
70
+ dct_spatial_sm: [
71
+ 'Earth', 'Northern Hemisphere', 'Southern Hemisphere',
72
+ 'Eastern Hemisphere', 'Western Hemisphere', 'Africa', 'Asia',
73
+ 'Australia', 'Europe', 'North America', 'South America',
74
+ 'Arctic regions'
75
+ ]
76
+ )
77
+ end
78
+ end
79
+ end
80
+
81
+ describe '#ogp_geom' do
82
+ it 'when Paper Map use Raster' do
83
+ expect(ogp.ogp_geom).to eq 'Raster'
84
+ end
85
+ it 'anything else, return it' do
86
+ expect(ogp_tufts.ogp_geom).to eq 'Polygon'
87
+ end
88
+ end
89
+
90
+ describe '#ogp_formats' do
91
+ context 'when Paper Map or Raster' do
92
+ it 'returns GeoTIFF' do
93
+ %w[Raster Paper\ Map].each do |datatype|
94
+ expect(ogp).to receive(:metadata).and_return('DataType' => datatype)
95
+ expect(ogp.ogp_formats).to eq 'GeoTIFF'
96
+ end
97
+
98
+ end
99
+ end
100
+ context 'when Polygon, Line, or Point' do
101
+ it 'returns Shapefile' do
102
+ %w[Polygon Line Point].each do |datatype|
103
+ expect(ogp).to receive(:metadata).and_return('DataType' => datatype)
104
+ expect(ogp.ogp_formats).to eq 'Shapefile'
105
+ end
106
+ end
107
+ end
108
+ context 'unknown data types' do
109
+ it 'throws exception' do
110
+ expect(ogp).to receive(:metadata).twice.and_return('DataType' => 'Unknown')
111
+ expect { ogp.ogp_formats }.to raise_error(ArgumentError, 'Unknown')
112
+ end
113
+ end
114
+ end
115
+
116
+ describe '#envelope' do
117
+ it 'properly formatted envelope' do
118
+ expect(ogp.envelope).to eq 'ENVELOPE(-180.0, 180.0, 90.0, -90.0)'
119
+ end
120
+ it 'fails on out-of-bounds envelopes' do
121
+ expect(ogp).to receive(:west).and_return(-181)
122
+ expect { ogp.envelope }.to raise_error(ArgumentError)
123
+ end
124
+ end
125
+
126
+ describe '#references' do
127
+ context 'harvard raster' do
128
+ it 'has wms and download services' do
129
+ expect(JSON.parse(ogp.references)).to include(
130
+ 'http://www.opengis.net/def/serviceType/ogc/wms' => 'http://pelham.lib.harvard.edu:8080/geoserver/wms',
131
+ 'http://schema.org/DownloadAction' => 'http://pelham.lib.harvard.edu:8080/HGL/HGLOpenDelivery'
132
+ )
133
+ end
134
+ end
135
+ context 'tufts vector' do
136
+ it 'has wms wfs services' do
137
+ expect(JSON.parse(ogp_tufts.references)).to include(
138
+ 'http://www.opengis.net/def/serviceType/ogc/wms' => 'http://geoserver01.uit.tufts.edu/wms',
139
+ 'http://www.opengis.net/def/serviceType/ogc/wfs' => 'http://geoserver01.uit.tufts.edu/wfs'
140
+ )
141
+ end
142
+ end
143
+ context 'harvard line' do
144
+ it 'has restricted services' do
145
+ expect(JSON.parse(ogp_line.references)).to include(
146
+ 'http://www.opengis.net/def/serviceType/ogc/wfs' => 'http://hgl.harvard.edu:8080/geoserver/wfs',
147
+ 'http://www.opengis.net/def/serviceType/ogc/wms' => 'http://hgl.harvard.edu:8080/geoserver/wms'
148
+ )
149
+ expect(JSON.parse(ogp_line.references)).not_to include('http://schema.org/DownloadAction')
150
+ end
151
+ end
152
+ end
153
+
154
+ describe 'valid geoblacklight schema' do
155
+ context 'harvard' do
156
+ it { expect { ogp.to_geoblacklight.valid? }.to_not raise_error }
157
+ it { expect { ogp_line.to_geoblacklight.valid? }.to_not raise_error }
158
+ end
159
+ context 'tufts' do
160
+ it { expect { ogp_tufts.to_geoblacklight.valid? }.to_not raise_error }
161
+ end
162
+ end
163
+ end