Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add a new gis raster integration test #700

Merged
merged 1 commit into from Mar 6, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
9 changes: 5 additions & 4 deletions spec/features/gis_accessioning_spec.rb
Expand Up @@ -2,6 +2,7 @@

require 'druid-tools'

# Accession a vector based GIS object
# NOTE: this spec will be skipped unless run on staging, since there is no geoserver-qa
RSpec.describe 'Create and accession GIS item object', if: $sdr_env == 'stage' do
let(:start_url) { "#{Settings.argo_url}/registration" }
Expand Down Expand Up @@ -39,8 +40,8 @@

# Go to kurma server and copy test content to the druid folder so it can be accessioned
# Should this test data be deleted from the server,
# a zipped copy is available at spec/fixtures/gis_integration_test_data.zip
test_data_source_folder = File.join(Settings.gis.robots_content_root, 'integration_test_data')
# a zipped copy is available at spec/fixtures/gis_integration_test_data_vector.zip
test_data_source_folder = File.join(Settings.gis.robots_content_root, 'integration_test_data_vector')
test_data_destination_folder = File.join(DruidTools::Druid.new(druid, Settings.gis.robots_content_root).path, 'content')
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

new folder name for this existing test data to distinguish from raster based test data

copy_command = "ssh #{Settings.preassembly.username}@#{Settings.preassembly.host} " \
"\"mkdir -p #{test_data_destination_folder} " \
Expand Down Expand Up @@ -110,10 +111,10 @@
expect_link_on_purl_page(druid:,
text: 'View in EarthWorks',
href: "#{Settings.earthworks_url}/stanford-#{bare_druid}")
expect_text_on_purl_page(druid:, text: 'This point shapefile represents all air monitoring stations active in ' \
'California from 2001 until 2003')
expect(page).to have_no_text(object_label) # the original object label has been replaced
expect(page).to have_text('Air Monitoring Stations: California, 2001-2003') # with the new object label
expect(page).to have_text('This point shapefile represents all air monitoring stations active in ' \
'California from 2001 until 2003') # abstract
expect(page).to have_text('cartographic') # type of resource
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we don't need to use expect_text_on_purl_page method, since this just makes an unnecessary reload of the PURL page

expect(page).to have_text('Shapefile') # form
expect(page).to have_text('EPSG::3310') # form for native projection
Expand Down
164 changes: 164 additions & 0 deletions spec/features/preassembly_gis_raster_accessioning_spec.rb
@@ -0,0 +1,164 @@
# frozen_string_literal: true

# Use pre-assembly to accession a raster based GIS object
# Preassembly requires that files to be included in an object must be available on a mounted drive
# To this end, files have been placed on Settings.gis.robots_content_root
# NOTE: this spec will be skipped unless run on staging, since there is no geoserver-qa
RSpec.describe 'Create gis object via Pre-assembly', if: $sdr_env == 'stage' do
bare_druid = '' # used for HEREDOC preassembly manifest files (can't be memoized)
let(:start_url) { "#{Settings.argo_url}/registration" }
let(:project_name) { 'Integration Test - GIS via preassembly' }
let(:preassembly_bundle_dir) { Settings.preassembly.gis_bundle_directory } # where we will stage the content
let(:local_manifest_location) { 'tmp/manifest.csv' }
let(:remote_manifest_location) do
"#{Settings.preassembly.username}@#{Settings.preassembly.host}:#{preassembly_bundle_dir}"
end
let(:preassembly_project_name) { "IntegrationTest-preassembly-gis-#{random_noun}-#{random_alpha}" }
let(:source_id_random_word) { "#{random_noun}-#{random_alpha}" }
let(:source_id) { "geo-preassembly-integration-test:#{source_id_random_word}" }
let(:label_random_words) { random_phrase }
let(:object_label) { "gis preassembly raster integration test #{label_random_words}" }
let(:collection_name) { 'Integration Test Collection - GIS' }
let(:apo_name) { 'APO for GIS' }
let(:preassembly_manifest_csv) do
<<~CSV
druid,object
#{bare_druid},content
CSV
end

before do
authenticate!(start_url:,
expected_text: 'Register DOR Items')
end

after do
clear_downloads
FileUtils.rm_rf(bare_druid)
unless bare_druid.empty?
`ssh #{Settings.preassembly.username}@#{Settings.preassembly.host} rm -rf \
#{preassembly_bundle_dir}/content && rm -fr #{preassembly_bundle_dir}/manifest.csv`
end
end

scenario do
select apo_name, from: 'Admin Policy'
select collection_name, from: 'Collection'
select 'geo', from: 'Content Type'
fill_in 'Project Name', with: project_name
fill_in 'Source ID', with: source_id
fill_in 'Label', with: object_label

click_button 'Register'

# wait for object to be registered
expect(page).to have_text 'Items successfully registered.'

bare_druid = find('table a').text
druid = "druid:#{bare_druid}"
puts " *** preassembly gis accessioning druid: #{druid} ***" # useful for debugging

# Move gis test data to preassembly bundle directory
# Should this test data be deleted from the server,
# a zipped copy is available at spec/fixtures/gis_integration_test_data_raster.zip
test_data_source_folder = File.join(Settings.gis.robots_content_root, 'integration_test_data_raster')
test_data_destination_folder = File.join(Settings.preassembly.gis_bundle_directory, 'content')
copy_command = "ssh #{Settings.preassembly.username}@#{Settings.preassembly.host} " \
"\"mkdir -p #{test_data_destination_folder} " \
"&& cp #{test_data_source_folder}/* #{test_data_destination_folder}\""
`#{copy_command}`
unless $CHILD_STATUS.success?
raise("unable to copy #{test_data_source_folder} to #{test_data_destination_folder} - got #{$CHILD_STATUS.inspect}")
end

# create manifest.csv file and scp it to preassembly staging directory
File.write(local_manifest_location, preassembly_manifest_csv)
manifest_copy_command = "scp #{local_manifest_location} #{remote_manifest_location}"
`#{manifest_copy_command}`
unless $CHILD_STATUS.success?
raise("unable to scp #{local_manifest_location} to #{remote_manifest_location} - got #{$CHILD_STATUS.inspect}")
end

visit Settings.preassembly.url
expect(page).to have_css('h3', text: 'Complete the form below')

fill_in 'Project name', with: preassembly_project_name
select 'Pre Assembly Run', from: 'Job type'
select 'Geo', from: 'Content structure'
fill_in 'Staging location', with: preassembly_bundle_dir

click_link_or_button 'Submit'
expect(page).to have_text 'Success! Your job is queued. ' \
'A link to job output will be emailed to you upon completion.'

# go to job details page, download result
first('td > a').click
expect(page).to have_text preassembly_project_name

# wait for preassembly background job to finish
reload_page_until_timeout! do
page.has_link?('Download', wait: 1)
end

click_link_or_button 'Download'
wait_for_download
yaml = YAML.load_file(download)
expect(yaml[:status]).to eq 'success'

# ensure files are all there, per pre-assembly, organized into specified resources
visit "#{Settings.argo_url}/view/#{druid}"

# verify the gisAssemblyWF workflow completes
reload_page_until_timeout! do
page.has_selector?('#workflow-details-status-gisAssemblyWF', text: 'completed', wait: 1)
end
# verify the gisDeliveryWF workflow completes
reload_page_until_timeout! do
page.has_selector?('#workflow-details-status-gisDeliveryWF', text: 'completed', wait: 1)
end
# Wait for accessioningWF to finish
reload_page_until_timeout!(text: 'v1 Accessioned')

# look for expected files produced by GIS workflows
files = all('tr.file')
expect(files.size).to eq 7
expect(files[0].text).to match(%r{SC_Color_WGS.tif image/tiff 9.\d\d MB})
expect(files[1].text).to match(%r{SC_Color_WGS.tfw text/plain 8\d Bytes})
expect(files[2].text).to match(%r{SC_Color_WGS.tif.ovr application/octet-stream 4.\d\d MB})
expect(files[3].text).to match(%r{preview.jpg image/jpeg 6.\d\d KB})
expect(files[4].text).to match(%r{SC_Color_WGS.tif.xml application/xml 2\d.\d KB})
expect(files[5].text).to match(%r{SC_Color_WGS-iso19139.xml application/xml 2\d.\d KB})
expect(files[6].text).to match(%r{SC_Color_WGS-fgdc.xml application/xml 5.\d\d KB})

# verify that the content type is "geo"
expect(find_table_cell_following(header_text: 'Content type').text).to eq('geo')

# release to Earthworks
click_link_or_button 'Manage release'
select 'Earthworks', from: 'to'
click_link_or_button('Submit')
expect(page).to have_text('Release object job was successfully created.')

# pause for a couple seconds for release to happen
sleep 2

# This section confirms the object has been published to PURL
# wait for the PURL name to be published by checking for collection name and check for bits of expected metadata
expect_text_on_purl_page(druid:, text: collection_name)
expect_link_on_purl_page(druid:,
text: 'View in EarthWorks',
href: "#{Settings.earthworks_url}/stanford-#{bare_druid}")
expect(page).to have_no_text(object_label) # the original object label has been replaced
expect(page).to have_text('Proposed Southern Crossings of San Francisco Bay (Raster Image)') # with the new object label
expect(page).to have_text('This raster dataset is a georeferenced image') # abstract
expect(page).to have_text('cartographic') # type of resource
expect(page).to have_text('GeoTIFF') # form
expect(page).to have_text('Scale not given ; EPSG::4326') # map data
expect(page).to have_text('Geospatial data') # genre
expect(page).to have_text('Cartographic dataset') # genre

# click Earthworks link and verify it was released
click_link_or_button 'View in EarthWorks'
reload_page_until_timeout!(text: 'Proposed Southern Crossings of San Francisco Bay (Raster Image)')
end
end
@@ -1,7 +1,8 @@
# frozen_string_literal: true

# Use pre-assembly to accession a vector based GIS object
# Preassembly requires that files to be included in an object must be available on a mounted drive
# To this end, files have been placed on Settings.preassembly.host
# To this end, files have been placed on Settings.gis.robots_content_root
# NOTE: this spec will be skipped unless run on staging, since there is no geoserver-qa
RSpec.describe 'Create gis object via Pre-assembly', if: $sdr_env == 'stage' do
bare_druid = '' # used for HEREDOC preassembly manifest files (can't be memoized)
Expand All @@ -16,7 +17,7 @@
let(:source_id_random_word) { "#{random_noun}-#{random_alpha}" }
let(:source_id) { "geo-preassembly-integration-test:#{source_id_random_word}" }
let(:label_random_words) { random_phrase }
let(:object_label) { "gis preassembly integration test #{label_random_words}" }
let(:object_label) { "gis preassembly vector integration test #{label_random_words}" }
let(:collection_name) { 'Integration Test Collection - GIS' }
let(:apo_name) { 'APO for GIS' }
let(:preassembly_manifest_csv) do
Expand Down Expand Up @@ -59,8 +60,8 @@

# Move gis test data to preassembly bundle directory
# Should this test data be deleted from the server,
# a zipped copy is available at spec/fixtures/gis_integration_test_data.zip
test_data_source_folder = File.join(Settings.gis.robots_content_root, 'integration_test_data')
# a zipped copy is available at spec/fixtures/gis_integration_test_data_vector.zip
test_data_source_folder = File.join(Settings.gis.robots_content_root, 'integration_test_data_vector')
test_data_destination_folder = File.join(Settings.preassembly.gis_bundle_directory, 'content')
copy_command = "ssh #{Settings.preassembly.username}@#{Settings.preassembly.host} " \
"\"mkdir -p #{test_data_destination_folder} " \
Expand Down Expand Up @@ -149,10 +150,10 @@
expect_link_on_purl_page(druid:,
text: 'View in EarthWorks',
href: "#{Settings.earthworks_url}/stanford-#{bare_druid}")
expect_text_on_purl_page(druid:, text: 'This point shapefile represents all air monitoring stations active in ' \
'California from 2001 until 2003')
expect(page).to have_no_text(object_label) # the original object label has been replaced
expect(page).to have_text('Air Monitoring Stations: California, 2001-2003') # with the new object label
expect(page).to have_text('This point shapefile represents all air monitoring stations active in ' \
'California from 2001 until 2003') # abstract
expect(page).to have_text('cartographic') # type of resource
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we don't need to use expect_text_on_purl_page method, since this just makes an unnecessary reload of the PURL page

expect(page).to have_text('Shapefile') # form
expect(page).to have_text('Scale not given ; EPSG::3310') # map data
Expand Down
Binary file added spec/fixtures/gis_integration_test_raster.zip
Binary file not shown.