<% id = "batch-names-#{idx}" %>
<% if name.nil? || name&.name.nil? %>
@@ -32,13 +33,14 @@
@@ -66,11 +68,12 @@
<% end %>
<%= modal_button(id, as_anchor: true) do %>Record details<% end %>
- <% if name.errors.any? %>
+ <% if name.errors.any? || placement.errors.any? %>
Issues detected in preliminary check:
- <% name.errors.full_messages.each do |error| %>
+ <% (name.errors.full_messages +
+ placement.errors.full_messages).each do |error| %>
- <%= error %>
<% end %>
@@ -166,4 +169,3 @@
Please note that any errors saved will have to be individually resolved.
This process may take up to a couple of minutes, please be patient.
-
diff --git a/test/fixtures/files/SCR_UploadBatch-Luteria-Incertae_sedis.xlsx b/test/fixtures/files/SCR_UploadBatch-Luteria-Incertae_sedis.xlsx
new file mode 100644
index 00000000..25682a22
Binary files /dev/null and b/test/fixtures/files/SCR_UploadBatch-Luteria-Incertae_sedis.xlsx differ
diff --git a/test/fixtures/files/SCR_UploadBatch-Nanoclepta.xlsx b/test/fixtures/files/SCR_UploadBatch-Nanoclepta.xlsx
new file mode 100644
index 00000000..49207a08
Binary files /dev/null and b/test/fixtures/files/SCR_UploadBatch-Nanoclepta.xlsx differ
diff --git a/test/fixtures/names.yml b/test/fixtures/names.yml
index 45acddfb..1b110973 100644
--- a/test/fixtures/names.yml
+++ b/test/fixtures/names.yml
@@ -34,6 +34,21 @@ bacillus_subtilis:
rank: species
status: 20 # ICNP
+nanobdellaceae:
+ name: Nanobdellaceae
+ rank: family
+ status: 15 # SeqCode
+
+nanoclepta_minutus:
+ name: Nanoclepta minutus
+ rank: species
+ status: 15 # SeqCode
+
+luteria_ianthellae:
+ name: Luteria ianthellae
+ rank: species
+ status: 15 # SeqCode
+
type_genome_with_locations:
name: Testimonas mappensis
rank: species
diff --git a/test/models/tutorial_test.rb b/test/models/tutorial_test.rb
index 175c27d2..77e84a9c 100644
--- a/test/models/tutorial_test.rb
+++ b/test/models/tutorial_test.rb
@@ -1,7 +1,125 @@
require 'test_helper'
class TutorialTest < ActiveSupport::TestCase
- # test "the truth" do
- # assert true
- # end
+ test 'batch parses a name' do
+ tutorial = upload_batch_spreadsheet('SCR_UploadBatch-Nanoclepta.xlsx')
+ name = tutorial.ephemeral_names.first
+ placement = name.placements.first
+
+ assert_equal 1, tutorial.step
+ assert_empty tutorial.value(:genomes)
+ assert_equal 1, tutorial.value(:names).size
+ assert_equal 'Nanoclepta', tutorial.value(:names).first['name']
+ assert_equal 'Nanobdellaceae', tutorial.value(:names).first['parent']
+ assert_nil name.parent
+ assert_nil name[:incertae_sedis]
+ assert_equal 'Nanobdellaceae', placement.parent.name
+ assert_nil placement.incertae_sedis
+ end
+
+ test 'batch parses an incertae sedis name' do
+ tutorial = upload_batch_spreadsheet(
+ 'SCR_UploadBatch-Luteria-Incertae_sedis.xlsx'
+ )
+ name = tutorial.ephemeral_names.first
+ placement = name.placements.first
+
+ assert_equal 1, tutorial.step
+ assert_empty tutorial.value(:genomes)
+ assert_equal 1, tutorial.value(:names).size
+ assert_equal 'Luteria', tutorial.value(:names).first['name']
+ assert_equal(
+ 'incertae sedis (Bacteria)', tutorial.value(:names).first['parent']
+ )
+ assert_nil name.parent
+ assert_nil name[:incertae_sedis]
+ assert_nil placement.parent
+ assert_equal 'incertae sedis (Bacteria)', placement.incertae_sedis
+ end
+
+ test 'batch creates a parent placement' do
+ tutorial = upload_batch_spreadsheet('SCR_UploadBatch-Nanoclepta.xlsx')
+ parent = names(:nanobdellaceae)
+
+ assert tutorial.batch_step_01({}, users(:contributor))
+
+ name = Name.find_by!(name: 'Nanoclepta')
+ placement = name.placement
+
+ assert_not_nil placement
+ assert_predicate placement, :preferred?
+ assert_equal parent, placement.parent
+ assert_equal parent, name.parent
+ assert_nil placement.incertae_sedis
+ end
+
+ test 'batch updates a claimable name with a preferred placement' do
+ parent = names(:nanobdellaceae)
+ name = Name.create!(
+ name: 'Nanoclepta', rank: 'genus', status: 5,
+ created_by: users(:contributor), parent: parent
+ )
+ placement = name.placement
+ tutorial = upload_batch_spreadsheet('SCR_UploadBatch-Nanoclepta.xlsx')
+
+ assert_no_difference('Placement.count') do
+ assert tutorial.batch_step_01({}, users(:contributor))
+ end
+
+ assert_equal placement, name.reload.placement
+ assert_equal parent, name.parent
+ end
+
+ test 'batch replaces a claimable name preferred placement' do
+ old_parent = Name.create!(
+ name: 'Nanoarchaeaceae', rank: 'family', status: 15
+ )
+ name = Name.create!(
+ name: 'Nanoclepta', rank: 'genus', status: 5,
+ created_by: users(:contributor), parent: old_parent
+ )
+ old_placement = name.placement
+ tutorial = upload_batch_spreadsheet('SCR_UploadBatch-Nanoclepta.xlsx')
+
+ assert_difference('Placement.count', 1) do
+ assert tutorial.batch_step_01({}, users(:contributor))
+ end
+
+ name = Name.find(name.id)
+ assert_equal names(:nanobdellaceae), name.placement.parent
+ assert_not old_placement.reload.preferred?
+ assert_includes name.alt_placements, old_placement
+ end
+
+ test 'batch creates an incertae sedis placement' do
+ tutorial = upload_batch_spreadsheet(
+ 'SCR_UploadBatch-Luteria-Incertae_sedis.xlsx'
+ )
+ explanation = tutorial.value(:names).first['description']
+
+ assert tutorial.batch_step_01({}, users(:contributor))
+
+ name = Name.find_by!(name: 'Luteria')
+ placement = name.placement
+
+ assert_not_nil placement
+ assert_predicate placement, :preferred?
+ assert_nil placement.parent
+ assert_nil name.parent
+ assert_equal 'incertae sedis (Bacteria)', placement.incertae_sedis
+ assert_equal explanation, placement.incertae_sedis_text.to_plain_text
+ assert_nil name[:incertae_sedis]
+ end
+
+ private
+
+ def upload_batch_spreadsheet(filename)
+ tutorial = Tutorial.create!(
+ pipeline: 'batch', user: users(:contributor), step: 0, ongoing: true
+ )
+ File.open(Rails.root.join('test/fixtures/files', filename)) do |file|
+ assert tutorial.batch_step_00({ file: file }, users(:contributor))
+ end
+ tutorial
+ end
end
diff --git a/test/system/tutorials_test.rb b/test/system/tutorials_test.rb
index a83f3c6c..cd521986 100644
--- a/test/system/tutorials_test.rb
+++ b/test/system/tutorials_test.rb
@@ -1,8 +1,102 @@
+# frozen_string_literal: true
+
require 'application_system_test_case'
class TutorialsTest < ApplicationSystemTestCase
+ include Warden::Test::Helpers
+
setup do
- @tutorial = tutorials(:one)
+ @user = users(:contributor)
+ @tutorial = Tutorial.create!(
+ pipeline: 'batch', user: @user, step: 0, ongoing: true
+ )
+
+ login_as(@user, scope: :user)
+ end
+
+ teardown { Warden.test_reset! }
+
+ test 'batch uploading a single genus' do
+ family = names(:nanobdellaceae)
+ type_species = names(:nanoclepta_minutus)
+ visit tutorial_url(@tutorial)
+
+ assert_text 'Step 0: Upload spreadsheet'
+
+ upload_batch_spreadsheet('SCR_UploadBatch-Nanoclepta.xlsx')
+ assert_batch_review(name: 'Nanoclepta', parent: 'Nanobdellaceae')
+ create_batch_entries
+
+ genus = Name.find_by!(name: 'Nanoclepta')
+ @tutorial.reload
+
+ assert_equal 'genus', genus.rank
+ assert_equal family, genus.parent
+ assert_equal type_species, genus.nomenclatural_type
+ assert_equal @tutorial, genus.tutorial
+ assert_equal ['Nanoclepta'], @tutorial.names.pluck(:name)
+
+ complete_batch_tutorial
+ end
+
+ test 'batch uploading a single incertae sedis genus' do
+ type_species = names(:luteria_ianthellae)
+ visit tutorial_url(@tutorial)
+
+ upload_batch_spreadsheet('SCR_UploadBatch-Luteria-Incertae_sedis.xlsx')
+ incertae_sedis = 'incertae sedis (Bacteria)'
+ assert_batch_review(name: 'Luteria', parent: incertae_sedis)
+
+ create_batch_entries
+
+ genus = Name.find_by!(name: 'Luteria')
+ @tutorial.reload
+
+ assert_equal 'genus', genus.rank
+ assert_nil genus.parent
+ assert_equal incertae_sedis, genus.incertae_sedis
+ assert_equal type_species, genus.nomenclatural_type
+ assert_equal @tutorial, genus.tutorial
+ assert_equal ['Luteria'], @tutorial.names.pluck(:name)
+
+ complete_batch_tutorial
+ end
+
+ private
+
+ def complete_batch_tutorial
+ click_button 'Continue'
+
+ assert_current_path new_register_path(tutorial: @tutorial)
+ assert_not @tutorial.reload.ongoing?
+ end
+
+ def upload_batch_spreadsheet(filename)
+ attach_file(
+ 'Batch spreadsheet',
+ Rails.root.join('test/fixtures/files', filename)
+ )
+ click_button 'Continue'
end
+ def assert_batch_review(name:, parent:)
+ assert_text 'Step 1: Review parsed data'
+ within '#batch-names-0-h' do
+ assert_text name
+ assert_text 'genus of'
+ assert_text parent
+ end
+ assert_no_selector '#batch-names-1-h'
+
+ assert_no_selector '#batch-genomes-0-h'
+ end
+
+ def create_batch_entries
+ assert_difference('Name.count', 1) do
+ assert_no_difference('Genome.count') do
+ click_button 'Continue'
+ assert_text 'Step 2: Validation list'
+ end
+ end
+ end
end