geoblacklight 1.5.1 → 1.6.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 (61) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +7 -3
  3. data/app/assets/javascripts/geoblacklight/geoblacklight.js +1 -1
  4. data/app/assets/javascripts/geoblacklight/modules/metadata.js +7 -0
  5. data/app/assets/javascripts/geoblacklight/modules/metadata_download_button.js +58 -0
  6. data/app/assets/javascripts/geoblacklight/modules/results.js +10 -15
  7. data/app/assets/stylesheets/geoblacklight/_geoblacklight.scss +3 -2
  8. data/app/assets/stylesheets/geoblacklight/modules/metadata.scss +27 -3
  9. data/app/assets/stylesheets/geoblacklight/modules/metadata_content.scss +38 -0
  10. data/app/assets/stylesheets/geoblacklight/modules/metadata_markup.scss +9 -0
  11. data/app/assets/stylesheets/geoblacklight/modules/metadata_missing.scss +7 -0
  12. data/app/helpers/geoblacklight_helper.rb +24 -0
  13. data/app/presenters/geoblacklight/document_presenter.rb +2 -1
  14. data/app/views/catalog/_metadata.html.erb +21 -6
  15. data/app/views/catalog/metadata/_content.html.erb +3 -0
  16. data/app/views/catalog/metadata/_markup.html.erb +8 -0
  17. data/app/views/catalog/metadata/_missing.html.erb +6 -0
  18. data/app/views/catalog/metadata.js.erb +8 -4
  19. data/config/locales/geoblacklight.en.yml +1 -0
  20. data/geoblacklight.gemspec +4 -1
  21. data/lib/generators/geoblacklight/templates/settings.yml +2 -2
  22. data/lib/geoblacklight/engine.rb +2 -1
  23. data/lib/geoblacklight/metadata/base.rb +88 -0
  24. data/lib/geoblacklight/metadata/fgdc.rb +14 -0
  25. data/lib/geoblacklight/metadata/iso19139.rb +14 -0
  26. data/lib/geoblacklight/metadata.rb +12 -31
  27. data/lib/geoblacklight/metadata_transformer/base.rb +49 -0
  28. data/lib/geoblacklight/metadata_transformer/fgdc.rb +16 -0
  29. data/lib/geoblacklight/metadata_transformer/iso19139.rb +16 -0
  30. data/lib/geoblacklight/metadata_transformer.rb +33 -0
  31. data/lib/geoblacklight/references.rb +14 -0
  32. data/lib/geoblacklight/version.rb +1 -1
  33. data/lib/geoblacklight/view_helper_override.rb +3 -2
  34. data/lib/geoblacklight.rb +7 -0
  35. data/spec/features/download_layer_spec.rb +5 -2
  36. data/spec/features/layer_inspection_spec.rb +1 -1
  37. data/spec/features/metadata_panel_spec.rb +15 -4
  38. data/spec/features/saved_searches_spec.rb +1 -1
  39. data/spec/features/split_view.html.erb_spec.rb +2 -2
  40. data/spec/fixtures/solr_documents/harvard_raster.json +2 -2
  41. data/spec/fixtures/solr_documents/public_iiif_princeton.json +1 -1
  42. data/spec/helpers/{geoblacklight_helpers_spec.rb → geoblacklight_helper_spec.rb} +54 -0
  43. data/spec/javascripts/geoblacklight_spec.js +4 -0
  44. data/spec/javascripts/metadata_download_button_spec.js +14 -0
  45. data/spec/lib/geoblacklight/metadata/base_spec.rb +85 -0
  46. data/spec/lib/geoblacklight/metadata_spec.rb +26 -18
  47. data/spec/lib/geoblacklight/metadata_transformer/base_spec.rb +35 -0
  48. data/spec/lib/geoblacklight/metadata_transformer/fgdc_spec.rb +23 -0
  49. data/spec/lib/geoblacklight/metadata_transformer/iso19139_spec.rb +23 -0
  50. data/spec/lib/geoblacklight/metadata_transformer_spec.rb +69 -0
  51. data/spec/lib/geoblacklight/references_spec.rb +12 -1
  52. data/spec/lib/geoblacklight/view_helper_override_spec.rb +1 -0
  53. data/spec/spec_helper.rb +11 -8
  54. data/spec/test_app_templates/lib/generators/test_app_generator.rb +2 -0
  55. data/spec/test_app_templates/metadata/fgdc.html +129 -0
  56. data/spec/test_app_templates/metadata/fgdc.xml +145 -0
  57. data/spec/test_app_templates/metadata/iso.html +275 -0
  58. data/spec/test_app_templates/metadata/iso.xml +511 -0
  59. data/spec/test_app_templates/solr_documents +1 -1
  60. metadata +83 -7
  61. data/app/assets/stylesheets/geoblacklight/modules/coderay.scss +0 -147
@@ -0,0 +1,49 @@
1
+ module Geoblacklight
2
+ module MetadataTransformer
3
+ ##
4
+ # Abstract class for transforming geospatial metadata
5
+ class Base
6
+ ##
7
+ # @param [GeoCombine::Metadata] metadata metadata Object
8
+ # @see GeoCombine::Metadata
9
+ def initialize(metadata)
10
+ @metadata = metadata
11
+ # Access the Nokogiri::XML Document from the metadata Object
12
+ fail EmptyMetadataError, 'Failed to retrieve the metadata' if @metadata.blank?
13
+ end
14
+
15
+ ##
16
+ # Returns HTML for the metadata transformed into HTML using GeoCombine
17
+ # @see GeoCombine::Metadata#to_html
18
+ # @return [String] the transformed metadata in the HTML
19
+ def transform
20
+ cleaned_metadata.to_html
21
+ rescue => e
22
+ raise TransformError, e.message
23
+ end
24
+
25
+ private
26
+
27
+ ##
28
+ # Clean top-level HTML elements from GeoCombine HTML Documents (e. g. <html> and <body>)
29
+ # @return [Nokogiri::XML::Document] the Nokogiri XML Document for the cleaned HTML
30
+ def cleaned_metadata
31
+ transformed_doc = Nokogiri::XML(@metadata.to_html)
32
+ if transformed_doc.xpath('//body').children.empty?
33
+ fail TransformError,\
34
+ 'Failed to extract the <body> child elements from the transformed metadata'
35
+ end
36
+ transformed_doc.xpath('//body').children
37
+ rescue => e
38
+ raise TransformError, e.message
39
+ end
40
+
41
+ ##
42
+ # Retrieve the Class for the GeoCombine::Metadata instance
43
+ # @return [GeoCombine::Metadata]
44
+ def metadata_class
45
+ GeoCombine::Metadata
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,16 @@
1
+ module Geoblacklight
2
+ module MetadataTransformer
3
+ ##
4
+ # Class for transforming FGDC XML Documents
5
+ class Fgdc < Base
6
+ private
7
+
8
+ ##
9
+ # Retrieve the Class for the GeoCombine::Metadata instance
10
+ # @return [GeoCombine::Fgdc]
11
+ def metadata_class
12
+ GeoCombine::Fgdc
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module Geoblacklight
2
+ module MetadataTransformer
3
+ ##
4
+ # Class for transforming ISO19139 XML Documents
5
+ class Iso19139 < Base
6
+ private
7
+
8
+ ##
9
+ # Retrieve the Class for the GeoCombine::Metadata instance
10
+ # @return [GeoCombine::Iso19139]
11
+ def metadata_class
12
+ GeoCombine::Iso19139
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,33 @@
1
+ require 'geo_combine'
2
+
3
+ module Geoblacklight
4
+ module MetadataTransformer
5
+ ##
6
+ # Exceptions raised for the types of geospatial metadata
7
+ class TypeError < EncodingError; end
8
+ ##
9
+ # Exceptions raised when parsing geospatial metadata in the XML
10
+ class ParseError < EncodingError; end
11
+ ##
12
+ # Exception raised when the geospatial metadata content is empty
13
+ class EmptyMetadataError < ParseError; end
14
+ ##
15
+ # Exceptions raised when transforming the metadata into the HTML
16
+ class TransformError < EncodingError; end
17
+
18
+ ##
19
+ # Initialize a new MetadataTransformer instance
20
+ # @param [Geoblacklight::Metadata::Base] metadata string or File path to the raw metadata
21
+ # @return [Geoblacklight::MetadataTransformer::BaseTransformer]
22
+ def self.instance(metadata)
23
+ type = metadata.class.name.split('::').last
24
+ begin
25
+ klass = "Geoblacklight::MetadataTransformer::#{type.capitalize}".constantize
26
+ rescue
27
+ raise TypeError, "Metadata type #{type} is not supported"
28
+ end
29
+
30
+ klass.new(metadata)
31
+ end
32
+ end
33
+ end
@@ -8,6 +8,20 @@ module Geoblacklight
8
8
  @refs = parse_references.map { |ref| Reference.new(ref) }
9
9
  end
10
10
 
11
+ ##
12
+ # Return only those metadata references which are exposed within the configuration
13
+ # @return [Geoblacklight::Reference]
14
+ def shown_metadata_refs
15
+ @refs.select { |ref| Settings.METADATA_SHOWN.include?(ref.type.to_s) }
16
+ end
17
+
18
+ ##
19
+ # Return only metadata for shown metadata
20
+ # @return [Geoblacklight::Metadata::Base]
21
+ def shown_metadata
22
+ @shown_metadata ||= shown_metadata_refs.map { |ref| Geoblacklight::Metadata.instance(ref) }
23
+ end
24
+
11
25
  ##
12
26
  # Accessor for a document's file format
13
27
  # @return [String] file format for the document
@@ -1,3 +1,3 @@
1
1
  module Geoblacklight
2
- VERSION = '1.5.1'.freeze
2
+ VERSION = '1.6.0'.freeze
3
3
  end
@@ -21,7 +21,7 @@ module Geoblacklight
21
21
 
22
22
  def render_search_to_s_bbox(params)
23
23
  return ''.html_safe if params['bbox'].blank?
24
- render_search_to_s_element('Bounding box', render_filter_value(params['bbox']))
24
+ render_search_to_s_element(t('geoblacklight.bbox_label'), render_filter_value(params['bbox']))
25
25
  end
26
26
 
27
27
  def render_constraints_filters(localized_params = params)
@@ -30,7 +30,8 @@ module Geoblacklight
30
30
 
31
31
  if localized_params[:bbox]
32
32
  path = search_action_path(remove_spatial_filter_group(:bbox, localized_params))
33
- content << render_constraint_element('Bounding Box', localized_params[:bbox], remove: path)
33
+ content << render_constraint_element(t('geoblacklight.bbox_label'),
34
+ localized_params[:bbox], remove: path)
34
35
  end
35
36
 
36
37
  content
data/lib/geoblacklight.rb CHANGED
@@ -19,6 +19,13 @@ module Geoblacklight
19
19
  require 'geoblacklight/download/shapefile_download'
20
20
  require 'geoblacklight/download/hgl_download'
21
21
  require 'geoblacklight/metadata'
22
+ require 'geoblacklight/metadata/base'
23
+ require 'geoblacklight/metadata/fgdc'
24
+ require 'geoblacklight/metadata/iso19139'
25
+ require 'geoblacklight/metadata_transformer'
26
+ require 'geoblacklight/metadata_transformer/base'
27
+ require 'geoblacklight/metadata_transformer/fgdc'
28
+ require 'geoblacklight/metadata_transformer/iso19139'
22
29
  require 'geoblacklight/reference'
23
30
  require 'geoblacklight/references'
24
31
  require 'geoblacklight/routes'
@@ -43,7 +43,7 @@ feature 'Download layer' do
43
43
  end
44
44
  scenario 'clicking jpg download button should redirect to external image' do
45
45
  visit solr_document_path('princeton-02870w62c')
46
- expect(page).to have_css("a.btn.btn-default[href='http://libimages.princeton.edu/loris2/pudl0076%2Fmap_pownall%2F00000001.jp2/full/full/0/default.jpg']", text: 'Download JPG')
46
+ expect(page).to have_css("a.btn.btn-default[href='https://libimages.princeton.edu/loris/pudl0076/map_pownall/00000001.jp2/full/full/0/default.jpg']", text: 'Download JPG')
47
47
  end
48
48
  scenario 'options should be available under toggle' do
49
49
  visit solr_document_path('mit-us-ma-e25zcta5dct-2000')
@@ -86,6 +86,9 @@ feature 'Download layer' do
86
86
  fill_in('Email', with: 'foo@example.com')
87
87
  click_button('Request')
88
88
  end
89
- expect(page).to have_content('You should receive an email when your download is ready')
89
+ using_wait_time 45 do
90
+ expect(page).to have_css('.alert-success')
91
+ expect(page).to have_content('You should receive an email when your download is ready')
92
+ end
90
93
  end
91
94
  end
@@ -4,7 +4,7 @@ feature 'Layer inspection', js: true do
4
4
  scenario 'clicking map should trigger inspection' do
5
5
  visit solr_document_path('mit-us-ma-e25zcta5dct-2000')
6
6
  expect(page).to have_css('th', text: 'Attribute')
7
- find('#map').trigger('click')
7
+ find('#map').click
8
8
  expect(page).not_to have_css('td.default-text')
9
9
  end
10
10
  end
@@ -2,15 +2,26 @@ require 'spec_helper'
2
2
 
3
3
  feature 'Metadata tools' do
4
4
  feature 'when metadata references are available', js: :true do
5
- scenario 'shows up in tools' do
5
+ scenario 'shows up as HTML' do
6
+ visit solr_document_path 'columbia-columbia-landinfo-global-aet'
7
+ expect(page).to have_css 'li.metadata a', text: 'Metadata'
8
+ click_link 'Metadata'
9
+ using_wait_time 15 do
10
+ within '.metadata-view' do
11
+ expect(page).to have_css '.pill-metadata', text: 'FGDC'
12
+ expect(page).to have_css 'dt', text: 'Identification Information'
13
+ expect(page).to have_css 'dt', text: 'Metadata Reference Information'
14
+ end
15
+ end
16
+ end
17
+ scenario 'shows up as XML' do
6
18
  visit solr_document_path 'stanford-cg357zz0321'
7
19
  expect(page).to have_css 'li.metadata a', text: 'Metadata'
8
20
  click_link 'Metadata'
9
21
  using_wait_time 15 do
10
22
  within '.metadata-view' do
11
- expect(page).to have_css 'div.label', text: 'MODS'
12
- expect(page).to have_css 'div.CodeRay', count: 2
13
- expect(page).to have_css 'div.label', text: 'ISO 19139'
23
+ expect(page).to have_css '.pill-metadata', text: 'MODS'
24
+ expect(page).to have_css '.CodeRay'
14
25
  end
15
26
  end
16
27
  end
@@ -8,6 +8,6 @@ feature 'saved searches' do
8
8
  expect(page.current_url).to match(/bbox=/)
9
9
  end
10
10
  visit blacklight.search_history_path
11
- expect(page).to have_css 'td.query a', text: /Bounding box:/
11
+ expect(page).to have_css 'td.query a', text: /#{I18n.t('geoblacklight.bbox_label')}:/
12
12
  end
13
13
  end
@@ -34,14 +34,14 @@ feature 'Index view', js: true do
34
34
  # Needed to find an svg element on the page
35
35
  visit search_catalog_path(f: { Settings.FIELDS.PROVENANCE => ['Stanford'] })
36
36
  expect(Nokogiri::HTML.parse(page.body).css('path').length).to eq 0
37
- find('.documentHeader', match: :first).trigger(:mouseover)
37
+ find('.documentHeader', match: :first).hover
38
38
  expect(Nokogiri::HTML.parse(page.body).css('path').length).to eq 1
39
39
  end
40
40
 
41
41
  scenario 'click on a record area to expand collapse' do
42
42
  within('.documentHeader', match: :first) do
43
43
  expect(page).not_to have_css('.collapse')
44
- find('.status-icons').trigger('click')
44
+ find('.status-icons').click
45
45
  expect(page).to have_css('.collapse', visible: true)
46
46
  end
47
47
  end
@@ -26,7 +26,7 @@
26
26
  ],
27
27
  "dc_title_s": "Saint Petersburg Region, Russia, 1834 (Raster Image)",
28
28
  "dc_type_s": "Dataset",
29
- "dct_references_s": "{\"http://schema.org/DownloadAction\":\"http://hgl.harvard.edu:8080/HGL/HGLOpenDelivery\",\"http://www.opengis.net/def/serviceType/ogc/wcs\":\"http://hgl.harvard.edu:8080/geoserver/wcs\",\"http://www.opengis.net/def/serviceType/ogc/wms\":\"http://hgl.harvard.edu:8080/geoserver/wms\",\"http://www.opengis.net/cat/csw/csdgm\":\"https://raw.githubusercontent.com/OpenGeoMetadata/edu.harvard/master/217/121/227/77/fgdc.xml\"}",
29
+ "dct_references_s": "{\"http://schema.org/DownloadAction\":\"http://pelham.lib.harvard.edu:8080/HGL/HGLOpenDelivery\",\"http://www.opengis.net/def/serviceType/ogc/wcs\":\"http://pelham.lib.harvard.edu:8090/geoserver/wcs\",\"http://www.opengis.net/def/serviceType/ogc/wms\":\"http://pelham.lib.harvard.edu:8090/geoserver/wms\",\"http://www.opengis.net/cat/csw/csdgm\":\"https://raw.githubusercontent.com/OpenGeoMetadata/edu.harvard/master/217/121/227/77/fgdc.xml\"}",
30
30
  "dct_spatial_sm": [
31
31
  "Russia Saint Petersburg"
32
32
  ],
@@ -36,7 +36,7 @@
36
36
  "dct_issued_s": "2000",
37
37
  "dct_provenance_s": "Harvard",
38
38
  "layer_slug_s": "harvard-g7064-s2-1834-k3",
39
- "layer_id_s": "cite:SDE2.G7064_S2_1834_K3",
39
+ "layer_id_s": "cite:G7064_S2_1834_K3",
40
40
  "layer_geom_type_s": "Raster",
41
41
  "layer_modified_dt": "2014-05-27T18:09:36Z",
42
42
  "solr_geom": "ENVELOPE(30.013108, 30.875309, 60.041712, 59.669749)",
@@ -16,7 +16,7 @@
16
16
  "Rogers, Henry Darwin",
17
17
  "Pownall, Thomas"
18
18
  ],
19
- "dct_references_s": "{\"http://schema.org/url\":\"http://arks.princeton.edu/ark:/88435/02870w62c\",\"http://schema.org/thumbnailUrl\":\"http://libimages.princeton.edu/loris2/pudl0076%2Fmap_pownall%2F00000001.jp2/full/50,/0/default.jpg\",\"http://iiif.io/api/image\":\"http://libimages.princeton.edu/loris2/pudl0076%2Fmap_pownall%2F00000001.jp2/info.json\"}",
19
+ "dct_references_s": "{\"http://schema.org/url\":\"http://arks.princeton.edu/ark:/88435/02870w62c\",\"http://schema.org/thumbnailUrl\":\"https://libimages.princeton.edu/loris2/pudl0076%2Fmap_pownall%2F00000001.jp2/full/50,/0/default.jpg\",\"http://iiif.io/api/image\":\"https://libimages.princeton.edu/loris/pudl0076/map_pownall/00000001.jp2/info.json\"}",
20
20
  "dct_spatial_sm": [
21
21
  "New York (State)",
22
22
  "New Jersey",
@@ -155,4 +155,58 @@ describe GeoblacklightHelper, type: :helper do
155
155
  end
156
156
  end
157
157
  end
158
+
159
+ describe '#render_transformed_metadata' do
160
+ let(:metadata) { instance_double(Geoblacklight::Metadata::Base) }
161
+ context 'with valid XML data' do
162
+ before do
163
+ allow(metadata).to receive(:transform).and_return('<div>test</div>')
164
+ end
165
+
166
+ it 'renders the partial with metadata content' do
167
+ expect(helper).to receive(:render)
168
+ .with(partial: 'catalog/metadata/content', locals: { content: '<div>test</div>' })
169
+ helper.render_transformed_metadata(metadata)
170
+ end
171
+ end
172
+
173
+ context 'with valid XML data without an HTML transform' do
174
+ before do
175
+ allow(metadata).to receive(:transform).and_raise(Geoblacklight::MetadataTransformer::TransformError)
176
+ allow(metadata).to receive(:to_xml).and_return('<data></data>')
177
+ end
178
+
179
+ it 'renders the partial with metadata content' do
180
+ expect(helper).to receive(:render).with(partial: 'catalog/metadata/markup', locals: { content: '<data></data>' })
181
+ helper.render_transformed_metadata(metadata)
182
+ end
183
+ end
184
+
185
+ context 'without XML data' do
186
+ before do
187
+ allow(metadata).to receive(:transform).and_raise(Geoblacklight::MetadataTransformer::ParseError)
188
+ end
189
+
190
+ it 'renders the partial with metadata content' do
191
+ expect(helper).to receive(:render).with(partial: 'catalog/metadata/missing')
192
+ helper.render_transformed_metadata(metadata)
193
+ end
194
+ end
195
+ end
196
+
197
+ describe '#first_metadata?' do
198
+ let(:metadata) { instance_double(Geoblacklight::Metadata::Base) }
199
+ let(:references) { instance_double(Geoblacklight::References) }
200
+ let(:document) { instance_double(SolrDocument) }
201
+
202
+ before do
203
+ allow(document).to receive(:references).and_return(references)
204
+ allow(references).to receive(:shown_metadata).and_return([metadata])
205
+ allow(metadata).to receive(:type).and_return('fgdc')
206
+ end
207
+
208
+ it 'confirms that a metadata resource is the first item reference' do
209
+ expect(helper.first_metadata?(document, metadata)).to be true
210
+ end
211
+ end
158
212
  end
@@ -9,5 +9,9 @@ describe('GeoBlacklight', function() {
9
9
  it('History.js is defined', function() {
10
10
  expect(History).toBeDefined();
11
11
  });
12
+
13
+ it('MetadataDownloadButton is defined', function() {
14
+ expect(GeoBlacklight.MetadataDownloadButton).toBeDefined();
15
+ });
12
16
  });
13
17
  });
@@ -0,0 +1,14 @@
1
+ //= require geoblacklight
2
+
3
+ describe('MetadataDownloadButton', function() {
4
+ describe('initialize', function() {
5
+ fixture.set('<button id="foo" data-ref-endpoint="http://testdomain" data-ref-download="#bar">test element</button><a href="http://test2domain" id="bar">another test element</a>');
6
+
7
+ it('creates a new instance and sets the download button @href value', function() {
8
+ var button = new GeoBlacklight.MetadataDownloadButton('#foo');
9
+ expect(button.$el.attr('id')).toBe('foo');
10
+ expect(button.$download.attr('id')).toBe('bar');
11
+ expect(button.$download.attr('href')).toBe('http://testdomain');
12
+ });
13
+ });
14
+ });
@@ -0,0 +1,85 @@
1
+ require 'spec_helper'
2
+
3
+ describe Geoblacklight::Metadata::Base do
4
+ let(:connection) { instance_double(Faraday::Connection) }
5
+ let(:response) { instance_double(Faraday::Response) }
6
+ let(:opengeometadata) do
7
+ described_class.new(
8
+ Geoblacklight::Reference.new(
9
+ ['http://www.loc.gov/mods/v3', 'http://purl.stanford.edu/cg357zz0321.mods']
10
+ )
11
+ )
12
+ end
13
+
14
+ describe '#document' do
15
+ before do
16
+ allow(Faraday).to receive(:new).with(url: 'http://purl.stanford.edu/cg357zz0321.mods').and_return(connection)
17
+ end
18
+
19
+ context 'with valid XML data at an endpoint URL' do
20
+ before do
21
+ allow(response).to receive(:status).and_return(200)
22
+ allow(response).to receive(:body).and_return('<test>data</test>')
23
+ allow(connection).to receive(:get).and_return(response)
24
+ end
25
+
26
+ it 'returns an XML Document containing the payload from an endpoint url' do
27
+ expect(opengeometadata.document).to be_a Nokogiri::XML::Document
28
+ end
29
+ end
30
+
31
+ context 'when attempts to connect to an endpoint URL fail' do
32
+ subject { opengeometadata.document }
33
+
34
+ before do
35
+ allow(connection).to receive(:get).and_raise(Faraday::Error::ConnectionFailed, 'test connection failures')
36
+ end
37
+
38
+ it 'returns nil when a connection error' do
39
+ expect(subject).to be_a Nokogiri::XML::Document
40
+ expect(subject.children.empty?).to be true
41
+ end
42
+ end
43
+ end
44
+
45
+ describe '#blank?' do
46
+ before do
47
+ allow(Faraday).to receive(:new).with(url: 'http://purl.stanford.edu/cg357zz0321.mods').and_return(connection)
48
+ end
49
+
50
+ context 'with valid XML data at an endpoint URL' do
51
+ before do
52
+ allow(response).to receive(:status).and_return(200)
53
+ allow(response).to receive(:body).and_return('<test>data</test>')
54
+ allow(connection).to receive(:get).and_return(response)
55
+ end
56
+
57
+ it 'returns false' do
58
+ expect(opengeometadata.blank?).to be false
59
+ end
60
+ end
61
+
62
+ context 'when attempts to connect to an endpoint URL fail' do
63
+ before do
64
+ allow(connection).to receive(:get).and_raise(Faraday::Error::ConnectionFailed, 'test connection failures')
65
+ end
66
+
67
+ it 'returns true' do
68
+ expect(opengeometadata.blank?).to be true
69
+ end
70
+ end
71
+ end
72
+
73
+ describe '#endpoint' do
74
+ before do
75
+ allow(Faraday).to receive(:new).with(url: 'http://purl.stanford.edu/cg357zz0321.mods').and_return(connection)
76
+ allow(response).to receive(:status).and_return(200)
77
+ allow(response).to receive(:body).and_return('<test>data</test>')
78
+ allow(connection).to receive(:get).and_return(response)
79
+ end
80
+
81
+ it 'returns the URI' do
82
+ expect(opengeometadata.endpoint).to eq 'http://purl.stanford.edu/cg357zz0321.mods'
83
+ end
84
+ end
85
+ end
@@ -1,25 +1,33 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Geoblacklight::Metadata do
4
- let(:response) { double('response') }
5
- let(:get) { double('get') }
6
- let(:opengeometadata) do
7
- described_class.new(
8
- Geoblacklight::Reference.new(
9
- ['http://www.loc.gov/mods/v3', 'http://purl.stanford.edu/cg357zz0321.mods']
10
- )
11
- )
12
- end
13
- describe '#retrieve_metadata' do
14
- it 'returns response from an endpoint url' do
15
- expect(response).to receive(:get).and_return(get)
16
- expect(Faraday).to receive(:new).with(url: 'http://purl.stanford.edu/cg357zz0321.mods').and_return(response)
17
- opengeometadata.retrieve_metadata
4
+ describe '.instance' do
5
+ let(:reference) { instance_double(Geoblacklight::Reference) }
6
+ context 'with an FGDC metadata reference' do
7
+ before do
8
+ allow(reference).to receive(:type).and_return('fgdc')
9
+ end
10
+ it 'constructs an Geoblacklight::Metadata::Fgdc instance' do
11
+ expect(described_class.instance(reference)).to be_a Geoblacklight::Metadata::Fgdc
12
+ end
13
+ end
14
+
15
+ context 'with an ISO19139 metadata reference' do
16
+ before do
17
+ allow(reference).to receive(:type).and_return('iso19139')
18
+ end
19
+ it 'constructs an Geoblacklight::Metadata::Iso19139 instance' do
20
+ expect(described_class.instance(reference)).to be_a Geoblacklight::Metadata::Iso19139
21
+ end
18
22
  end
19
- it 'returns nil when a connection error' do
20
- expect(response).to receive(:get).and_return(Faraday::Error::ConnectionFailed)
21
- expect(Faraday).to receive(:new).with(url: 'http://purl.stanford.edu/cg357zz0321.mods').and_return(response)
22
- opengeometadata.retrieve_metadata
23
+
24
+ context 'with another metadata reference' do
25
+ before do
26
+ allow(reference).to receive(:type).and_return('unsupported')
27
+ end
28
+ it 'constructs an Geoblacklight::Metadata::Base instance' do
29
+ expect(described_class.instance(reference)).to be_a Geoblacklight::Metadata::Base
30
+ end
23
31
  end
24
32
  end
25
33
  end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe Geoblacklight::MetadataTransformer::Base do
4
+ describe '.new' do
5
+ it 'raises an error for empty XML' do
6
+ expect { described_class.new(nil) }.to raise_error Geoblacklight::MetadataTransformer::EmptyMetadataError
7
+ end
8
+ end
9
+
10
+ context 'with metadata types without XSL Stylesheets' do
11
+ let(:metadata) { instance_double(GeoCombine::Metadata) }
12
+ subject { described_class.new(metadata) }
13
+ describe '#transform' do
14
+ before do
15
+ allow(metadata).to receive(:to_html).and_raise(NoMethodError, 'undefined method `to_html\'')
16
+ end
17
+ it 'raises a transform error' do
18
+ expect { subject.transform }.to raise_error Geoblacklight::MetadataTransformer::TransformError, /undefined method `to_html'/
19
+ end
20
+ end
21
+ end
22
+
23
+ context 'with metadata types with XSL Stylesheets but invalid HTML' do
24
+ let(:metadata) { instance_double(GeoCombine::Metadata) }
25
+ subject { described_class.new(metadata) }
26
+ describe '#transform' do
27
+ before do
28
+ allow(metadata).to receive(:to_html).and_return('<invalid-html></invalid-html>')
29
+ end
30
+ it 'raises a transform error' do
31
+ expect { subject.transform }.to raise_error Geoblacklight::MetadataTransformer::TransformError, 'Failed to extract the <body> child elements from the transformed metadata'
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe Geoblacklight::MetadataTransformer::Fgdc do
4
+ let(:fgdc_html) { File.read(File.join(Rails.root, 'spec', 'fixtures', 'metadata', 'fgdc.html')) }
5
+ let(:metadata) { instance_double('Geoblacklight::Metadata::Fgdc') }
6
+ subject do
7
+ described_class.new(metadata)
8
+ end
9
+
10
+ describe '#transform' do
11
+ before do
12
+ allow(metadata).to receive(:blank?).and_return(false)
13
+ allow(metadata).to receive(:to_html).and_return(fgdc_html)
14
+ end
15
+
16
+ it 'transforms FGDC Documents in the XML into the HTML' do
17
+ transformed = Nokogiri::XML.fragment(subject.transform)
18
+ expect(transformed.at_xpath('.//h1').text.strip).to eq('Custom Link Sample')
19
+ expect(transformed.at_xpath('.//div/dl/dd/dl/dd/dl/dt').text).to eq('Originator')
20
+ expect(transformed.at_xpath('.//div/dl/dd/dl/dd/dl/dd').text.strip).to eq('Esri')
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe Geoblacklight::MetadataTransformer::Iso19139 do
4
+ let(:iso_html) { File.read(File.join(Rails.root, 'spec', 'fixtures', 'metadata', 'iso.html')) }
5
+ let(:metadata) { instance_double('Geoblacklight::Metadata::Iso19139') }
6
+ subject do
7
+ described_class.new(metadata)
8
+ end
9
+
10
+ describe '#transform' do
11
+ before do
12
+ expect(metadata).to receive(:blank?).and_return(false)
13
+ expect(metadata).to receive(:to_html).and_return(iso_html)
14
+ end
15
+
16
+ it 'transforms ISO19139 Documents in the XML into the HTML' do
17
+ transformed = Nokogiri::XML.fragment(subject.transform)
18
+ expect(transformed.at_xpath('.//h1').text.strip).to eq('Abandoned Mine Land Inventory Polygons: Pennsylvania, 2016')
19
+ expect(transformed.at_xpath('(.//div)[1]/dl/dd/dl/dd/dl/dt').text).to eq('Title')
20
+ expect(transformed.at_xpath('(.//div)[1]/dl/dd/dl/dd/dl/dd').text.strip).to eq('Abandoned Mine Land Inventory Polygons: Pennsylvania, 2016')
21
+ end
22
+ end
23
+ end