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/models/tutorial_test.rb b/test/models/tutorial_test.rb index 175c27d2..a8e88fce 100644 --- a/test/models/tutorial_test.rb +++ b/test/models/tutorial_test.rb @@ -1,7 +1,80 @@ require 'test_helper' class TutorialTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end + test 'batch parses a name from a spreadsheet' do + tutorial = upload_batch_spreadsheet('SCR_UploadBatch-Nanoclepta.xlsx') + + 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'] + end + + test 'batch parses an incertae sedis name from a spreadsheet' do + tutorial = upload_batch_spreadsheet( + 'SCR_UploadBatch-Luteria-Incertae_sedis.xlsx' + ) + + 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'] + ) + end + + test 'batch creates a parent placement' do + parent = Name.create!( + name: 'Nanobdellaceae', rank: 'family', status: 15 + ) + placement = create_batch_placement( + name: 'Nanoclepta', rank: 'genus', + description: 'A genus of ectosymbiotic archaea.', parent: parent.name + ) + + assert_equal parent, placement.parent + assert_nil placement.incertae_sedis + end + + test 'batch creates an incertae sedis placement' do + explanation = 'The genus cannot currently be assigned to a family.' + placement = create_batch_placement( + name: 'Luteria', rank: 'genus', description: explanation, + parent: 'incertae sedis (Bacteria)' + ) + + assert_nil placement.parent + assert_equal 'incertae sedis (Bacteria)', placement.incertae_sedis + assert_equal explanation, placement.incertae_sedis_text.to_plain_text + end + + private + + def create_batch_placement(name:, **attributes) + tutorial = Tutorial.create!( + pipeline: 'batch', user: users(:contributor), step: 1, + data: { + names: [attributes.merge(name: name)], genomes: [] + }.to_json + ) + + assert tutorial.batch_step_01({}, users(:contributor)) + + placement = Name.find_by!(name: name).placement + assert_not_nil placement + assert_predicate placement, :preferred? + placement + end + + 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..a590a000 100644 --- a/test/system/tutorials_test.rb +++ b/test/system/tutorials_test.rb @@ -1,8 +1,104 @@ +# 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 = Name.create!(name: 'Nanobdellaceae', rank: 'family', status: 15) + type_species = Name.create!( + name: 'Nanoclepta minutus', rank: 'species', status: 15 + ) + 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 = Name.create!( + name: 'Luteria ianthellae', rank: 'species', status: 15 + ) + visit tutorial_url(@tutorial) + + upload_batch_spreadsheet('SCR_UploadBatch-Luteria-Incertae_sedis.xlsx') + assert_batch_review(name: 'Luteria', parent: 'unknown') + create_batch_entries + + genus = Name.find_by!(name: 'Luteria') + @tutorial.reload + + assert_equal 'genus', genus.rank + assert_nil genus.parent + assert_equal 'incertae sedis (Bacteria)', 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