geoblacklight 1.5.1 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
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