diff --git a/integration-tests/tests/specs/features/revise-sequence.spec.ts b/integration-tests/tests/specs/features/revise-sequence.spec.ts index 50aa369def..afe1572ce1 100644 --- a/integration-tests/tests/specs/features/revise-sequence.spec.ts +++ b/integration-tests/tests/specs/features/revise-sequence.spec.ts @@ -45,7 +45,7 @@ sequenceTest( await page.getByTestId('Add a segment_segment_file').setInputFiles({ name: 'update_S.txt', mimeType: 'text/plain', - buffer: Buffer.from('>S\n' + CCHF_S_SEGMENT_FULL_SEQUENCE), + buffer: Buffer.from('>S description\n' + CCHF_S_SEGMENT_FULL_SEQUENCE), }); await page.getByRole('button', { name: 'Submit' }).click(); @@ -100,7 +100,7 @@ groupTest.describe('Bulk sequence revision', () => { const revisionMetadata = createRevisionMetadataTsv(accessionsToRevise, baseSubmissionId); const revisedSequences = accessionsToRevise.map((accession, i) => ({ - id: `${baseSubmissionId}-${i}`, + id: `${baseSubmissionId}-${i} description`, sequence: EBOLA_SUDAN_SHORT_SEQUENCE + 'GGGGGG', })); const fastaContent = createFastaContent(revisedSequences); diff --git a/integration-tests/tests/test-data/cchfv_test_sequences.fasta b/integration-tests/tests/test-data/cchfv_test_sequences.fasta index 2406f4adf4..606166f744 100644 --- a/integration-tests/tests/test-data/cchfv_test_sequences.fasta +++ b/integration-tests/tests/test-data/cchfv_test_sequences.fasta @@ -1,4 +1,4 @@ ->test_NIHPAK-19_L +>test_NIHPAK-19_L description to be ignored CCACATTGACACAGANAGCTCCAGTAGTGGTTCTCTGTCCTTATTAAACCATGGACTTCTTAAGAAACCTTGACTGGACTCAGGTGATTGCTAGTCAGTATGTGACCAATCCCAGGTTTAATATCTCTGATTACTTCGAGATTGTTCGACAGCCTGGTGACGGGAACTGTTTCTACCACAGTATAGCTGAGTTAACCATGCCCAACAAAACAGATCACTCATACCATAACATCAAACATCTGACTGAGGTGGCAGCACGGAAGTATTATCAGGAGGAGCCGGAGGCTAAGCTCATTGGCCTGAGTCTGGAAGACTATCTTAAGAGGATGCTATCTGACAACGAATGGGGATCGACTCTTGAGGCATCTATGTTGGCTAAGGAAATGGGTATTACTATCATCATTTGGACTGTTGCAGCCAGTGACGAAGTGGAAGCAGGCATAAAGTTTGGTGATGGTGATGTGTTTACAGCCGTGAATCTTCTGCACTCCGGACAGACACACTTTGATGCCCTCAGAATACTGCCNCANTTTGAGGCTGACACAAGAGAGNCCTTNAGTCTGGTAGACAANNTNATAGCTGTGGACCANNTGACCTCNTCTTCAAGTGATGAANTGCAGGACTANGAAGANCTTGCTTTAGCACTTACNAGNGCGGAAGAACCATNTAGACGGTCTAGCNTGGATGAGGTNACCCTNTCTAAGAAACAAGCAGAGNTATTGAGGCAGAAGGCATCTCAGTTGTCNAAACTGGTTAATAAAAGTCAGAACATACCGACTAGAGTTGGCAGGGTTCTGGACTGTATGTTTAACTGCAAACTATGTGTTGAAATATCAGCTGACACTCTAATTCTGCGACCAGAATCTAAAGAAAGAATTGGTGAAGTTATGTCGTTGCGACAGCTAGGTCACAAATTGCTAACACGAGATAAACAAATTAAGCAGGAGTTCTCTAGAATGAAGCTCTATGTTACCAAAGATCTGCTTGANCATCTNGATGTTGGTGGGNTNTTNAGAGCAGCCTTCCCTGGAACAGGGATAGANAGACATATGCAGNTGNTACANTCTGAAATGATACTGGACATTTGTACNGTNTCACTTGGCGTCATGTTATCAACATTCTTATACGGCTCTAACAACAAAAACAAGAAAAAATTCATCACCAACTGCTTGCTTAGCACAGCCNTGTCTGGNAAGAAGGTGTACAAGGTTCTTGGTAACTTAGGNAATGAACTGTTNTATAANGCACCNAGAAAGGCCTTNGCAACCGTCTGTNGTGCNCTNTTTGGNAAACANNTAAACAAGCTTCAGAACTGCTTCAGGACTATAAGTCCTGTTAGCCTGCTTGCACTAAGAAACCTGGACTTTGACTGTCTTAGTGTGCAAGACTACAATGGTATGATAGAAAATATGTCCAAATTGGACAACACAGATGTTGAATTCAACCACAGAGAAATAGCCGATCTCAACCAGTTAACTTCTCGGCTTATCACATTGAGGAAAGAGAAAGACACTGATCTCCTCAAGCAATGGTTTCCTGAGGGTGATCTCACTCGTAGAAGCACCAGGAACGTTGCAAATGCAGAAGAATTTGTCATATCTGAATTCTTTAAGAGGAAAGACATTATGAAGTTTATCAGCACCTCAGGAAGAGCAATGAGTGCAGGCAAAATTGGTAATGTCCTTTCCTATGCACATAACCTTTATTTGAGCAAGTCTAGCCTAAACATGACTTCTGAAGATATTTCACAGCTTCTAATCGAGATTAAGAGGCTGTATGCTCTACAAGAAGATTCTGAAGTAGAGCCAATAGCCATAATTTGTGATGGCATTGAGAGCAACATGAAGCAGTTATTTGCTATATTNCCTCCNGACTGTGCAAGAGAGTGNGANGTTCTCTTTGATGACATAAGAAANTCTCCAACGCACAGTACAGCNTGGAAGCATGCCCTTCGATTAAAGGGNACNGCATATGAGGGTNTNTTTGCCAACTGNTATGGATGGCANTANATCCCGGAAGACATTAAACCAAGCTTGACCATGTTGATACAGACATTGTTCCCTGACAAATTTGAAGATTTTTTGGACCGAACTCAATTACATCCAGAGTTCAGAGATTTAACTCCTGACTTTTCGCTTACACAAAAGGTTCATTTCAAAAGGAATCAGATACCCAGTGTTGAAAACGTTCAGATCTCCATAGATGCATCATTGCCTGAATCTGTGGAGGCAGTGCCAGTGACAGAAAGGAAAATGTTCCCCCTACCTGAGACTCCATTAAGTGAGGTACATTCAATAGAGCGCATCATGGAAAATTTCACTCGCCTCATGCATGAAGGAAAGCCTTCAACCAAGAGAAAAGATGAAGATTCAACAGAACAGAACGGTCAGCAGAATACTGCTGAACATGAGAGTTCAAGCATCTTGACTTTTAAGGACTATGGAGAGAGGGGAATAGTTGAGGAGAATCACATGAGGTTCAGTGAAGAGGATCAGCTGGAAACNAGNCAGTTGTTGTTGGTAGAAGTTGGTTTTCAAACTGANATTGATGGGAAAATAAGAACAGACCANAAAAAATGGAAAGATATATTAAAGCTGTTNGAGTTACTNGGAATNAAGTGCTCATTCATTGCCTGTGCTGACTGNTCGNCTACACCNCCAGACAGATGGTGGATTACTGAGGACAGAGTACGAGTCTTAAAGAACTCAGTCAGCTTTCTCTTCAACAAACTCTCCAGGAACTCACCTACAGAGGTTACTGACATAGTTGTTGGGGCCATAAGTACTCAAAAGGTTAGAAGTTACTTAAANGCAGGGACTGCNACAAAAACCCCTGTGTCAACNAAAGANGTTCTAGAGACTTGGGAAAGAATGAAAGANCATATACTTAACAGGCCNACAGGTTTNACACTNCCNNCCAGTTTGGAGCAGGCAATGCGCAAAGGANTAGTCGAGGGNGTGGTNATCTCCAAGGNGGGCTCTGAATCNTGCATNNANATGTTNAAGGAAAANTTGGACCGAATAACTGATGAATTTGAGCGGACGAAATTTAAACATGAGCTTACNCAGAATGTTACTACTNGTGAAAAGATGCTGTTAAGTTGGTTAAGTGAAGACATAAAATCATCGAGATGTAGTGAGTGTCTTGCTAATATAAAGAAAACTGTTGATGAGACTGCCAACCTATCAGAGAAGATCGAACTGCTTGCTTATAATTTGCAACTTACTAGTCACTGTGGTAACTGTCACCCCAACGGTGTGAACATTAGCAACATATCAAATGTATGCAAGAGGTGTCCCAAGATAGAAGTGGTCAGTCATTGTGAGAACAAAGGTTTTGAGGATAGCAATGAATGCTTAACAGACTTAGACAGACTTGTTAGACTCACATTACCGGGAAAAACTGAGAAAGAGAGAAGAGTCAAGCGTAATGTAGAATATCTGATAAAATTGATGATGAGCATGTCAGGCATCGACTGTATAAAGTATCCTACAGGACAGCTTATTACTCATGGNAGNGTAAGTGCAAAGCANAATGATGGAANCNTGAAAGATAGGAGTGATGACGACCAAAGACTNGCTGAGAAGANAGATACTGTNAGNAAAGAGCTTTCNGAAACNAANNTNAAAGANTATTCANCNTATGCAAGAGGNGTAATCTCAAATTCGCTAAAAAACCTCTCGAAGCAAGGCAAATCAAAGTGNTCTGTGCCAAGATCTTGGCTTGAAAAGATACTGTTTGACTTAAAAGTGCCCACTAAAGACGAAGAAGTGCTGATAAACATCAGGAATTCACTGAAGGCTAGATCTGAGTATGTTAGAAACAANGACAAACTACTNATAAGATCCAANGAAGAACTCAAAAAATGTTTCGATGCGCAGTCTTTTAAATTGATGAAAAACAAACAACCTGTGCCTTTTCANGTTGANTGTATACTGTTTAAGGAAGTGGCAGCAGAGTGCATGAAAAGATATATTGGCACACCTTATGAAGGAATTATAGANACTTTAGTNTCNTTAATCAATGTGTTAACAAGATTCACTTGGTTTCAGGANGTAGTGCTNTATGGTAAGATATGTGANACCTTCTTAAGGTGNTGCACNGAATTCAATAGATCAGGGGTTAAGCTAGTNAAGGTAAGNCACTGTGANATTAACNTATCAGTCAAGCTGCCATCAAACAAAAANGAGAANATGTTATGTTGNNTATACAGTAGTAACATGGAGCTCTTACANGGACCTTTCTANTTGAACAGGAGGCAAGCTGTCCTTGGCTCATCATACCTTTACATNGTCATTACGCTNTACATACAAGTGCTGCAGCAGTACAGGTGTCTAGAAGTCATAAATAGCGTGAATGAGAAAACATTGCAGGACATTGAAAATCACTCTATGACTCTGCTAGAAGATGCATTCAAAGAACTTACTTCTGCGCTTGAGGGTAGATTTGAAGAATCTTACAAAGTACGAACTTCAAGGTGCAAAGCTAGCGGAAATTTCTTAAACAGAAGCAGTAGAGACCACTTTATAAGTATTGTTTCAGGCTTAAACCTGGTTTATGGCTTCCTCATGAAAGATAACTTATTGGCCAACTCTCAGCAACAAAACAAACAACTTCAAATGCTTCGTTTTGGTATGCTTGCAGGGCTTAGTAGGCTTGTCTGTCCTAATGAGTTGGGAAAAAAGTTTTCAACAAGTTGTAGAAGAATTGAAGATAACATTGCAAGACTTTACTTACAAACGTCTATATACTGNTCAGTTAGAGATGTGGAAGANAATATCAAGCACTGGAAGCANAGAGANNTGTGCCCTGAAGTGACNATTCCATGTTTTACAGTCTATGGNACCTTTNTNAACAGCGACAGACAGCTGATTTTTGACATTTACAATGTGCATATATACAATAANGANATGGACAACTTTGACGAAGGATGTATCAGCGTCCTGGAAGAAACAGCAGAAAGGCANATGCTTTGGGAGCTTGATCTGATGAATTCACTCTGTTCTGACGAAAAAAGAGATGCTAGAACCGCAAGACTACTTTTGGGCTGCCCAAACGTGAGAAAAGCTGCGAATAAAGAAGGGAAAAAGCTGTTAAAGTTAAACAGCGATACATCCACTGACACACAAAGCGTTGCTTCTGAAGTGTCAGACAGGAGATCCTNTAGCTCAAGCAAGAGTAGAATTCGTAGTATTTTTGGAAGATACAATTCTCANAAAAAACCATTTGAACTAAGGTCAGGCCTCGAAGTCTTCAATGACCCTTTCAATGATTATCAGCAAGCAATAACAGATATTTGTCAATTTTCTGAGTACACACCAAACAAAGAAAGCATTCTGAAGGATTGCCTTCAAATCATACGGAAAAACCCCAGCCACACAATGGGCTCTTTTGAGTTGATCCAAGCAGTCTCAGAGTTTGGCATGAGTAAGTTTCCTCCCGAGAATATAGACAAGGCAAGGAGGGATCCAAAGAACTGGGTCAGCATCTCTGAAGTAACAGAGACAACAAGTATAGTCGCATCGCCTAAAACTCACATGATGCTAAAGGACTGCTTTAAAATCATACTGGGCACTGAGAATAAAAAAATAGTTAAAATGCTTCGAGGGAAGCTAAAGAAACTTGGTGCTATCACTACAAACATAGAGATCGGAAAAAGGGATTGCCTNGATCTACTCAGCACGGTTGACGGTCTAACAGATCAACAAAAAGAAAACATCGTGAATGGGATTTTCGAACCTTCAAAGCTGTCCTTCTACCATTGGAAAGAATTAGTCAAGAAAAGCATAGATGAGGTTCTGCTTACTGAGGATGGAAATCTAATCTTCTGCTGGTTAAAAACAATCTCATCCTCAGTTAAAGGAAGCTTGAAGAAAAGACTCAAGTTTATGAATATACATGCTCCAGAACTGATGCCAGAAAACTGTCTCTTTTCCAGCGAGGAGTTTAATGAGTTGATTAAGTTGAAGAAACTTCTCCTCAACGAACAACAAGATGAACAGGAGTTGAAGCAAGATCTTTTAATATCTTCTTGGATTAAGTGTATAATGGCTTGTAAGGACTTTGCTAGTATCAATGACAAGGTTCAAAAATTTATTTATCATCTGTCTGAAGAGCTATATAACATAAGGCTGCAACATCTGGAACTATCAAAGCTTAAGCAGGAGCATCCAAGTGTCAGCTTCACTAAGGAGGAGGTTTTAATAAAGCGGCTGGAGAAGAATTTCCTTAAGCAACACAATCTAGAAATTATGGAAACAGTAAACCTTATATTCTTTGCTGCACTTTCAGCTCCTTGGTGTCTACACTATAAAGCACTAGAATCTTATTTGGTAAGACATCCAGAGATACTCGACTGTGGTTCTAAGGAGGATTGTAGGCTCACTCTACTTGATCTGTCAGTTTCTAAACTATTAGTTTGTTTGTATCGAAAAGATGATGAGGAACTAACAAACAGCTCAAGTTTGAAACTNGGGTTNTTAGTGAANTATGCTNTCACCNTATTTACATCNAATGGNGAGCCTTTCTCACTTAGTCTGAACGACGGGGGTTTGGACCTTGATTTACACAAAACCACTGACGAGAAGTTGCTACATCAAACAAAGATAGTTTTTGCTAAGATTGGTCTGTCCGGGAACGGTTATGACTTCATCTGGACCACTCAAATGATAGCAAATAGCAACTTTAATGTCTGCAAAAGATTGACNGGAAGGAGTACNGGGGAAAGGCTTCCNAGAAGTGTCAGGAGCAAGGTCATTTATGAAATGGTAAAACTGGTAGGAGAAACAGGCATGGCAATATTGCAACAGTTAGCTTTTGCACAGGCACTAAATTATGAACACCGNTTTTATGCAGTTTTAGCACCTAAAGCACAGCTAGGAGGAGCAAGAGATCTGTTAGTGCAGGAAACTGGCACTAAAGTCATGCATGCAACTACTGAAATGTTCAGTAGAAACCTCTTAAAGACAACATCAGANGACGGCCTTACAAACCCACATCTTAAAGAGNCAATCCTTAATGTGGGATTGGACTGTCTTACCAATATGCGAAACCTTGACGGAAAGCCCATAAGTGAAGGTAGCAACTTGGTTAACTTTTACAAGGTCATNTGTATTTCGGGTGACAATACCAAGTGGGGCCCAATACACTGCTGTTCATTCTTTTCAGGTATGATGCAGCAGGTTCTTAAAAATGTTCCAGATTGGTGTTCATTCTATAAACTAACATTTATTAAGAACTTGTGTAGGCAAGTAGAGATACCAGCAGGCAGTATTAAAAAGATCTTAAATGTTCTTAGATACAAACTNTGCAGCAAAGGAGGTGTAGAGCAGCACAGTGAAGAGGANNTNAGNAAGTTNNTGNTAGACAANTTGGACAGCTGGGATGGNAACGACACAGTNAAGTTNTTAGTCACAACNTATATAAGCAAGGGGCTCATGGCACTAAACAGNTACAACCATATGGGTCANGGCATTCACCATGCAACCTCNTCAGTGTTAACTTCTTTNGCTGCNGTNCTTTTCGANGANCTAGCANTNTTTTATCTNAAGAGNAGCTTACCNCAGACAACAGTACATGTTGAGCATGCNGGCAGNTCTGATGATTANGCAAAGTGTATAGTAGTAACTGGCATACTATCCAAAGAGCTTTACTCCCAGTATGATGAGACATTTTGGAAGCATGCCTGTAGACTTAAGAATTTCACAGCTGCTGTNCAAAGGTGTTGTCAAATGAAAGATAGTGCTAAAACCNTAGTTAGCGACTGTTTTCTTGAGTTTTACAGCGAGTTCATGATGGGCTACAGAGTGACNCCTGCTGTAATTAAATTNATGTTNACTGGACTGATAAATAGCTCTGTAACTTCTCCTCAGAGCTTGATGCAGGCATGCCAAGTTTCATCTCAACAGGCCATGTATAATAGTGTTCCCCTTGTNACCAACACCACCTTTACCTTACTNAGGCAACAGATTTTCTTTAATCATGTTGAAGACTTTATCAGAAGGTATGGCNTATTAACTCTNGGAACCTTATCTCCCTTTGGNAGGCTNTTTGTNCCGACCTANTCTGGATTNGTNAGCTCAGCGGTTGCTCTGGAAGATGCTGAAGTCATTGCNAGNGCAGCTCAAACACTTCATATGAACAGTGTGTCNATCCAGTCAAGTAGCTTGACTACATTAGACAGTTTAGGTCGTAGCAGGACAAGTTCCATAGTTGAAGATAGCAGCAGTGTAAGCGACACTACTGTTGCTTCTCATGATTCGGGATCATCATCATCAAGCTTCTCTTTTGAGCTCAATAGGCCTCTATCTGAAACTGAACTACAATTCATCAAAGCACTAAACAGCCTCAAATCAACCCAAGCTTGTGAGATAATTCAGAACAGGATTACAGGTCTTTATTGTAATAGCAATGAAGGACCCCTCGACAGACACAATGTTATTTACAGTAGCAGAATGGCAGATTCTTGTGACTGGCTAAAAGATGGTAAGAGAAGAGGGAATCTAGAACTNGCAAANAGAATCCANTCTGTACTNTGTGTTNTNATAGCNGGNTACTACAGATCATTTGGNGGGGAAGGGACTGANAAACAGGTAAANGCATCATTNAATAGGGANGACAATAAAATCATCGAAGATCCTATGATACAANTGATTCCGGAGAAACTGAGGAGNGAGTTGGANAGGTTAGGGGTTTCTAGAATGGAAGTCGATGANCTGATGCCAAGNATTAGCCCTGATGANACNTTAGCCCAACTTGTGGCAAAAAAACTAATNAGCCTCAATGTTTCGACAGAAGAATACTCNGCAGAGGTNTCTAGGCTCAANCAAACNCTAACNGCNCGNAATGTTTTGCACGGGTTNGCTGGAGGAATAAAAGANCTCTCGCTTCCTATATATACAATATTCATGAAGTCATACTTCTTCAAAGACAANGTNTTNNTGTCACTGACAGACAGNTGGTCNACCAAGCANAGCACGAACTACCGTGACAGCTGCGGTAAACAGTTGACTGGTAGGATAATCACNAAGTACACTCACTGGTTGGACACTTTNCTAAGCTGCTCTGTNTCCATTAANAGGCANACAACTGTNAAGGAGCCTTCCCTTTTTAATCCGAACATCAGGTGTGTCAACCTGATCACATTTGAAGACGGTTTGAGGGAACTTTCAGTGATACAGAGTCATCTCAAAGTTTTTGAGAACGAATTCACTAACTTAAACCTTCAGTTCTCTGACCCAAACAGACAGAAACTTAGGATAGTTGAATCTAGACCTGCAGAATCTGAGTTAGAGGCAAATCGTGCAGTGATTGTTAAGACTAAACTGTTTTCAGCAACCGAACAGGTCCGANTATCTAANAACCCTGCAGTTGTCATGGGTTATCTATTAGACGAGTCAGCAATTTCTGAAGTTAAACCTACCAAGGTTGATTTTTCGAATTTACTTAAAGATCGCTTCAAAATAATGCAATTTTTCCCTTCTGTGTTCACTTTGATCAAAATGCTAACAGATGAGTCGTCAGACTCAGAAAAGAATGGCCTTAGCCCAGATTTGCAACAAGTTGCAAGGTATTCTAACCATTTAACCTTGCTTAGTAGAATGATACAACAAGCAAAGCCAACTGTAACTGTTTTCTACATGCTAAAGGGTAACTTAATGAACACAGAACCGACAGTCGCTGAGCTTGTCAGTTACGGTATAAAGGAAGGTAGGTTCTATAGGCTTTCTGACACCGGAATTGATGCAAGTACATATTCTGTAAAATACTGGAAAATTCTCCACTGTATTTCTGCTATCGGATGCCTACCTCTGAGTCAAGCAGATAAGTCTTCACTACTCATGAGTTTCTTAAATTGGAGGGTGAACATGGACATTAGAACTTCTGACTGTCCATTGTCTAGCCATGAGGCAAGTATACTTAGTGAATTTGACGGACAAGTTATTGCTAATATACTTGCCAGTGAATTAAGTTCTGTAAAACGAGACTCTGAACGNGAAGGTCTAACTGATCTCCTTGATTACCTAAANTCACCNACTGAACTGTTNAAGAAGAAGCCNTANTTAGGAACAACCTGCAAGTTCANCACTTGGGGAGACTCAAANAGNTCTGGTAAGTTTACATACAGTAGCAGATCTGGNGAGTCAATTGGTATCTTCATTGCAGGGAAATTGCACATCCATCTTTCATCTGAGTCTGTTGCCCTNTTGTGTGAGACTGAAAGGCAAGTGCTCTCTTGGATGAGCAAAAGGAGGACTGAGGTGATAACTAAGGAACAACATCAATTGTTCCTGAGCCTCCTTCCACAATCTCATGAATGNTTACAAAAGCACAANGATGGCAGTGCACTGTCAGTNATACCTGATNGNAGCAANCCTCGNCTACTAAAATTTGTGCCTCTCAAGAAGGGGCTNGCAGTGGTGAAGATNAAAAAACAAATTTTGACAGTNAAGAANCAAGTNGTGTTTGATGCTGAAAGCGAGCCCAGNTTNCAATGGGGGCATGGCTGCTTGTCCATTGTTTATGACGAAACCGACACTCAGACCACATACCATGAAAACCTTTTGAAGGTGAAGCAGCTTGTTGACTGCTCTACCGACAGAAAGAAGCTTTTACCTCAGTCTGTGTTTTCTGATTCCAAAGTCGTCCTCTCAAGAATTAAGTTTAAAACGGAACTCCTTCTTAACTCATTGACGTTGCTCCACTGTTTCTTGAAACATGCCCCTAGTGATGCTATAATGGAAGTGGAGAGTAAAAGTAACCTACTACATAAGTACCTCAAATCAGGAGGTGTTAGGCAGCGGAATACTGAGGTNCTCTTNAGNGAAAAGTTGAANAAGGTNGTTATAAAGGANAACCTTGAGCAAGGNGTGGAAGAAGAGATTGANTTNTGCAACAACCTNACCAAGANTGTTTCNGAGAATCCGCTACCACTCAGCTGTTGGTCTGAAGTTCAAAGCTATATTGAAGACATAGGCTTCAACAATGTGCTTGTGAATATTGACAGAAACACTGTTAAAAGTGAACTTTTGTGGAAATTTACGTTAGACACCAATGTAAGTACCACAAGTACCATCAAGGATGTGAGGACACTGGTATCCTACGTTAGCACTGAAACGATCCCTAAATTTCTGCTTGCATTTCTTCTTTATGAAGAAGTGTTGATGAACTTAATTAACCAGTGCAAGGCAGTAAAGGAACTCATCAACAGCACAGGACTCTCAGATCTAGAATTAGAGAGCTTGCTCACTTTGTGTGCTTTTTATTTCCAAAATGAGTGCAGTAAGAGAGATGGACCTAGGTGTTCNTTCGCAGCACTGTTAAGCTTAGTTCATGAAGATTGGCAAANGNTAGGNAAAAACATCCTTGTTCGTGCAAACAATGAGCTGGGTGANGTGTCNCTNAAGGTNAANATTGTCCTGGTGCCNCTCAANGACATGTCCAAGCCNAANCCTGAGAGAGTNGTTATAGCCAGAAGGTCACTGAATCANGCTCTNTCCTTAATGTTTTTGGATGAAATGTCATTACCTGAGCTTAAATCCTTATCTGTTAATTGCAGAATGGGNAACTTTGAAGGGCAGGAGTGCTTTGAGTTCACNATTTTNAANGACAACAGCNCAAGGCTGGATTACAACAAANTAATTGACCACTGTGTGGACATGGAAAAAAAGAGGGACGCAGTTAGAGCAGTAGAAGATTTAGTTNTGATGTTGACAGGCAGGGCAGTCAAACCTAGCACTGTAACACCAGNTGCACANGAAGANGAGCAGTGTCAGGAGCAAATAAGNCTNGATGATCTAATGGCAAGTGACACAGTGACAGACCTNCCNGANAGGGAAGCAGAGGCCCTNAAAACAGGNAANCTTGGCTTTAACTGGGATTCAGATTGANCACNNTNTCTGTNTNAATNATTNATACCTNTCANTNTCNNNAGGGNAAGTAAGGCAATTTATACCATGCCATTTGTTGACATCTGAACTTTCAAATAAGTCAGCTGCTCTGCATCTCTTACCAATTCAATTGTTTCACTACAATGTTTTCAGCTACTGGTCAACCTTTAATATCCAACTACTCCACTCTCTTTGCTGCTCATGTC >test_NIHPAK-19_M GTGGATTGAGCATCTTAATTGCAGCATACTTGTCAACATCATGCATATATCATTGATGTATGCAGTTTTCTGCTTGCAGCTGTGCGGTCTAGGGAAAACTAACGGACTACACAATGGGACTGAACACAATAAGACACACGTTATGACAACGCCTGATGACAGTCAGAGCCCTGAACCGCCAGTGAGCACAGCCCTGCCTGTCACACCGGACCCTTCCACTGTCACACCTACAACACCAGCCAGCGGATTAGAAGGCTCAGGAGAGGTTCACACATCCTCTCCAATCACCACCAAGGGTTTGTCTCTGCCGGGGGCTACATCTGAGCTCCCTGCGACTACTAGCATAGTCACTTCAGGTGCAAGTGATGCCGATTCTAGCACACAGGCAGCCAGAGACACCCCTAAACCATCAGTCCGCACGAGTCTGCCCAACAGCCCTAGCACACCATCCACACCACAAGGCACACACCATCCCGTGAGGAGTCTGCTTTCAGTCACGAGCCCTAAGCCAGAAGAAACACCAACACCGTCAAAATCAAGCAAAGATAGCTCAGCAACCAACAGTCCTCACCCAGCCGCCAGCAGACCAACAACCCCTCCCACAACAGCCCAGAGACCCGCTGAAAACAACAGCCACAACACCACCGAACAGCTTGAGTCCTTAACACAATTAGCAACTTCAGGTTCAATGATCTCTCCAACACAGACAGTCCTCCCAAAGAGTGTTACTTCTATAGCCATTCAAGACATTCATCCCAGCCCAACAAATAGGTCTAAAAGAAACCTTGATATGGAAATAATCTTGACGTTATCTCAGGGTCTGAAAAAGTATTATGGCAAAATACTTAAGCTCCTGCATCTCACCTTAGAGGAAGACACTGAAGGCTTGTTAGAATGGTGCAAGAGAAATCTCGGTCTTGACTGTGATGACACCTTCTTTCAAAAAAGAATTGAAGAATTCTTTATAACTGGTGAGGGTCATTTCAATGAAGTTTTACAATTTAGAACACTAGGCACATTGAGCACTACAGAGTCAACGCATGCTGGATCACCAACAGTTGAACCCTTCAAATCCTACTTTGCTAAAGGTTTCCTTTCAATAGATTCAGGTTATTTCTCTGCCAAATGTTATTCAAGAACATCCAATTCAGGGCTCCAATTGATTAATGTTACCCGACATTCATCTAGGATAGCTGACACGCCTGGGCCCAAGATCACTAACCTAAAGACCATCAATTGCATAAACTTAAAAGCATCCGTCTTTAAAGAACATAGAGAGGTTGAAATCAATGTGCTTCTCCCTCAAGTTGCAGTCAACCTCTCAAACTGTCATGTTGCAATCAAATCACATGTCTGCGACTATTCTTTGGACACTGACGGGGCGATTAGGCTTCCTCATATTCATCATGAAGGTACTTTTATCCCAGGTACTTACAAAATAGTGATAGACCAAAAAAGTAAGCTGAATGACAGGTGCACCCTATTCACCAACTGTGTGATAAAAGGAAGAGAAGTTCGTAAAGGCCAGTCAGTCCTAAGGCAATATAAGACAGAAATTAGAATTGGCAGGGCATCAACTGGTTCTAGGAGATTGCTTTCCGAAGAATCTGGTGATGACTGCATATCAAGAACTCAGCTATTGAGGACAGAGACTGCAGAGGTCCATGGCGATAACNNNNNNNNNNCAGGTGATAAGATAACCATCTGTAATGGTTCAACTGTTGTAGATCAAAGACTGGGTAGTGAACTGGGGTGTTACACTATCAATAGAGTGAGGTCATTCAAGCTATGCGAAAACAGTGCCACAGGGAAGAGCTGTGAAATAGACAGTATCCCAGTTAAGTGTAGGCAGGGTTATTGCCTAAAAATCACTCAGGAAGGGAGGGGCCATGTGAAATTATCTAGAGGCTCAGAAGTTGTCTTGGATGTATGTGACTCAAGCTGTGAAGTGATGATACCTAAGGGCACTGGTGACATTCTAGTAGATTGTTCAGGTGGGCAGCAACATTTTTTAAAAGACAACCTGGTTGATCTAGGATGTCCCAAAATTCCATTATTGGGCAAAATGGCTATTTATATCTGCAGAATGTCGAATCACCCCAAAACAACCATGGCCTTCCTCTTTTGGTTCAGCTTTGGCTATGTGGTAACTTGTATACTTTGCAAGGCCATTTTTTTCTTATTAATAATTTTTGGAACACTAGGGAAAAGGTTCAAGCAGTACAGAGAGCTGAAACCCCAGACCTGCACCATTTGTGAGACAACACCTGTAAATGCAATAGATGCTGAAATGCATGATCTCAACTGCAGTTACAATATATGTCCCTATTGTGCGTCTAGACTGACTTCAGATGGGCTTGCTAGGCATGTAACACAATGCCCTAGACGGAAGGAGAAAGTGGAGGAAACCGAATTGTACCTGAATTTAGAGAGAATTCCTTGGGTTGTAAGAAAGCTATTACAGGTGTCAGAGTCCACTGGTACAGTATTAAAAAGGAGCAGTTGGCTAATTGTTCTACTTGTGCTGTTCACAGTTTCATTATCACCAGTTCAATCAGCACCCATTGGTCACGGGAGAACAATTGAAACATACCGGGTTAGGGAGGAATACACAAGTATTTGCCTCTTTGTACTAGGAAGTATCCTGTTTATGGTTTCTTGTCTAATGAAAGGACTAGTTGACAGTGTTGGCAACATCTTCTTTCCTGGGCTGTCCGTTTGTAAGACATGCTCTATAGGTAGCATTAATGGCTTTGAAATTGAGTCTCATAAGTGCTACTGTAGCTTGTTTTGTTGCCCTTATTGTAGGCACTGCTCTGCTGATAGAGAGATTCATCAGCTGCACTTGAGCATCTGCAAAAAAAGGAAGACAGGAAGTAATGTTATGCTAGCTGTTTGCAAACGCATGTGTTTCAGGGCAACTATGGAAGTGAGCAACAAAGCCCTATTTATCCGTAGCATTATCAACACCACTTTTGTTGTGTGCATACTGATACTAGCAGTCTGTGTTGTTAGCACCTCAGCAGTAGAAATGGAAAGCCTGCCAGCTGGGACCTGGGAAAGAGAAGAAGACCTAACAAATTTCTGCCATCAGGAATGCCAGGTCACGGAGACTGAGTGCCTCTGCCCTTATGAAGCTCTAGTGCTCAGAAGGCCCCTATTTCTAGATAGTATAGTCAAAGGCATGAAAAATCTGCTAAACTCAACAAGTCTAGAAACAAGCTTATCAATTGAAGCACCGTGGGGAGCAATTAATGTTCAGTCAACCTACAAACCAACTGTATCAACTGCAAACATAGCACTTAGTTGGAGCTCAGTGGAACACAGAGGCAATAAGGTTTTGGTCTCAGGCAGATCAGAATCAATTATGAAGCTGGAAGAAAGGACAGGAATCAGCTGGGATCTTGGCGTAGAAGATGCCTCTGAGTCTAAGCTACTTACAGTTTCAGTCATGGATTTGTCTCAGATGTACTCTCCTGTCTTCGAGTACTTATCAGGTGACAGACAAGTGGAAGAGTGGCCTAAAGCAACCTGTACAGGTGACTGCCCAGAAAGATGTGGCTGCACATCATCAACCTGCTTACACAAAGAGTGGCCCCATTCAAGGAATTGGAGATGTAATCCTACTTGGTGCTGGGGTGTGGGGACTGGCTGCACCTGTTGTGGTTTAGATGTGAAAGACCTTTTCACAGATTACATGTTCGTCAAGTGGAAAGTTGAGTACATTAAGACAGAGGCCATAGTATGTGTGGAACTAACCAGTCAAGAAAGACAGTGTAGCTTGATTGAGGCGGGCACAAGATTCAATTTAGGTTCTGTGACTATTACATTGTCAGAACCAAGGAACATTCAACAAAAGCTCCCTCCTGAAATAATCACACTGCACCCCAAGATTGAGGAAGGTTTTTTTGACCTAATGCATATACAAAAAGTGCTATCGGCAAGCACAGTGTGTAAGTTGCAGAGTTGCACACATGGTGTGCCAGGAGATCTGCAGGTCTACCACATCGGAAACCTATTAAAAGGGGACAGAGTAAATGGACACCTGATTCACAAAATTGAGCAACACCTCAACACCTCCTGGATGTCCTGGGATGGTTGCGACCTAGACTACTACTGTAACATGGGAGACTGGCCTTCCTGCACATATACCGGAGTCACTCAGCACAATCATGCTTCATTTGTAAACCTGCTCAACATTGAAACTGATTATACAAAAACCTTCCACTTTCACTCTAAAAGGGTTACTGCACATGGAGACACACCACAACTAGATCTGAAGGCAAGGCCAACCTATGGTGCAGGTGAGATCACCGTGCTGGTGGAAGTTGCTGACATGGAGTTACACACAAAGAAGATTGAAATATCAGGCTTAAAATTTGCAAGCCTAACTTGCACAGGTTGTTATGCTTGTAGTTCTGGCATCTCCTGTAAAGTTAGAATTCATGTGGATGAACCAGATGAACTTACAGTACATGTTAAAAGTGATGACCCAGATGTAGTTGCAGCTAGCTCAAGTCTCATGGCAAGGAAGCTTGAATTTGGAACAGACAGTACATTTAAAGCTTTCTCAGCCATGCCAAAAACTTCCCTATGTTTCTACATTGTGGAAAGAGAATACTGTAAGAGCTGCAGTAAAGAAGACACACAGAAATGTGTTAACACGAAACTCGAACAACCACAGAGCATTTTGATCGAACATAAGGGAACTATAATTGGAAAGCAAAACAATACTTGCACGGCTAAAGCGAGCTGCTGGTTAGAGTCAGTTAAGAGTTTTTTTTATGGTCTGAAGAATATGCTTGGTGGCATTTTTGGCAATGTTTTTATAGGCATTTTCACATTTCTTGCCCCCTTTATCNTNTTAATACTTTTCTTTATGTTTGGGTGGAGGGTCTTGTTTTGCTTCAAGTGTTGCAGAAGAACCAGAGGCCTATTCAAGTACAGGCACCTCAAAGACGATGAAGAAACTGGTTACAGAAAGATCATTGAAAGACTGAACAACAAAAAAGGAAAAAACAAGCTGCTTGATGGTGAAAGACTTGCTGACAGAAAGATTGCTGAACTGTTCTCTACAAAAACACACATTGGCTAGATCAACCGGAGGGGCCTGGGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTGCATCCCCACCATATTATCATCACAATATGCCACATCTAAGCTGATTCACTGTATCTGCAAACAGACTCTGTAATGCTTGAAACTGCCT diff --git a/website/src/components/Edit/SequencesForm.spec.tsx b/website/src/components/Edit/SequencesForm.spec.tsx index 3428287115..9633e392b0 100644 --- a/website/src/components/Edit/SequencesForm.spec.tsx +++ b/website/src/components/Edit/SequencesForm.spec.tsx @@ -29,7 +29,6 @@ function makeSubOrganismReferenceSchema(suborganisms: string[]): ReferenceGenome return result; } -/* eslint-disable @typescript-eslint/naming-convention -- this test has keys that expectedly contain spaces */ describe('SequencesForm', () => { beforeEach(() => { vi.spyOn(toast, 'error'); @@ -48,6 +47,7 @@ describe('SequencesForm', () => { }); test('GIVEN organism with 2 suborganisms with 1 segment each THEN allows at max 1 inputs', async () => { + const FASTAHEADER = 'FASTAHEADER'; let editableSequences = EditableSequences.fromSequenceNames( makeSubOrganismReferenceSchema(['suborg1', 'suborg2']), ); @@ -57,21 +57,22 @@ describe('SequencesForm', () => { ]); const firstKey = initialRows[0].key; { - editableSequences = editableSequences.update(firstKey, 'ATCG', 'Segment 1', 'subId_Segment1'); + editableSequences = editableSequences.update(firstKey, 'ATCG', 'Segment 1', FASTAHEADER); const fasta = editableSequences.getSequenceFasta(); expect(fasta).not.toBeUndefined(); const fastaText = await fasta!.text(); - expect.soft(fastaText).toBe('>subId_Segment1\nATCG'); - expect(editableSequences.getSequenceRecord()).deep.equals({ subId_Segment1: 'ATCG' }); + expect.soft(fastaText).toBe(`>${FASTAHEADER}\nATCG`); + expect(editableSequences.getSequenceRecord()).deep.equals({ [FASTAHEADER]: 'ATCG' }); const rows = editableSequences.rows; expect(rows).toEqual([ - { label: 'Segment 1', value: 'ATCG', initialValue: null, key: firstKey, fastaHeader: 'subId_Segment1' }, + { label: 'Segment 1', value: 'ATCG', initialValue: null, key: firstKey, fastaHeader: FASTAHEADER }, ]); } - expect(() => editableSequences.update('another key', 'GG', 'another key', 'subId_anotherkey')).toThrowError( - 'Maximum limit reached — you can add up to 1 sequence file(s) only.', - ); + + expect(() => + editableSequences.update('another key', 'GG', 'another key', 'FASTAHEADER_anotherkey'), + ).toThrowError('Maximum limit reached — you can add up to 1 sequence file(s) only.'); editableSequences = editableSequences.update(firstKey, null, null, null); expect(editableSequences.rows).toEqual([ { label: 'Add a segment', value: null, fastaHeader: null, initialValue: null, key: expect.any(String) }, @@ -79,12 +80,12 @@ describe('SequencesForm', () => { const rowsAfterDeletion = editableSequences.rows; const newFirstKey = rowsAfterDeletion[0].key; { - editableSequences = editableSequences.update(newFirstKey, 'ATCG', 'Segment 1', 'subId_Segment1'); + editableSequences = editableSequences.update(newFirstKey, 'ATCG', 'Segment 1', FASTAHEADER); const fasta = editableSequences.getSequenceFasta(); expect(fasta).not.toBeUndefined(); const fastaText = await fasta!.text(); - expect.soft(fastaText).toBe('>subId_Segment1\nATCG'); - expect(editableSequences.getSequenceRecord()).deep.equals({ subId_Segment1: 'ATCG' }); + expect.soft(fastaText).toBe(`>${FASTAHEADER}\nATCG`); + expect(editableSequences.getSequenceRecord()).deep.equals({ [FASTAHEADER]: 'ATCG' }); const rows = editableSequences.rows; expect(rows).toEqual([ @@ -93,13 +94,17 @@ describe('SequencesForm', () => { value: 'ATCG', initialValue: null, key: newFirstKey, - fastaHeader: 'subId_Segment1', + fastaHeader: FASTAHEADER, }, ]); + expect(editableSequences.getFastaIds()).toEqual(FASTAHEADER); } }); test('GIVEN organism with 2 segments THEN allows at max 2 inputs', async () => { + const FASTAHEADER_SEGMENT1 = 'FASTAHEADER'; + const FASTAHEADER_WITH_DESCRIPTION = FASTAHEADER_SEGMENT1 + ' description'; + const FASTAHEADER_SEGMENT2 = 'FASTAHEADER_SEGMENT2'; let editableSequences = EditableSequences.fromSequenceNames( makeReferenceGenomeLightweightSchema(['foo', 'bar']), ); @@ -112,42 +117,65 @@ describe('SequencesForm', () => { let secondKey; { - editableSequences = editableSequences.update(firstKey, 'ATCG', 'Segment 1', 'subId_Segment1'); + editableSequences = editableSequences.update(firstKey, 'ATCG', 'Segment 1', FASTAHEADER_WITH_DESCRIPTION); const fasta = editableSequences.getSequenceFasta(); expect(fasta).not.toBeUndefined(); const fastaText = await fasta!.text(); - expect.soft(fastaText).toBe('>subId_Segment1\nATCG'); - expect(editableSequences.getSequenceRecord()).deep.equals({ subId_Segment1: 'ATCG' }); + expect.soft(fastaText).toBe(`>${FASTAHEADER_WITH_DESCRIPTION}\nATCG`); + expect(editableSequences.getSequenceRecord()).deep.equals({ [FASTAHEADER_WITH_DESCRIPTION]: 'ATCG' }); const rows = editableSequences.rows; expect(rows).toEqual([ - { label: 'Segment 1', value: 'ATCG', initialValue: null, fastaHeader: 'subId_Segment1', key: firstKey }, + { + label: 'Segment 1', + value: 'ATCG', + initialValue: null, + fastaHeader: FASTAHEADER_WITH_DESCRIPTION, + key: firstKey, + }, { label: 'Add a segment', value: null, initialValue: null, fastaHeader: null, key: expect.any(String) }, ]); secondKey = rows[1].key; } { - editableSequences = editableSequences.update(secondKey, 'TT', 'Segment 2', 'subId_Segment2'); + editableSequences = editableSequences.update(secondKey, 'TT', 'Segment 2', FASTAHEADER_SEGMENT2); const fasta = editableSequences.getSequenceFasta(); expect(fasta).not.toBeUndefined(); const fastaText = await fasta!.text(); - expect.soft(fastaText).toBe('>subId_Segment1\nATCG\n>subId_Segment2\nTT'); - expect(editableSequences.getSequenceRecord()).deep.equals({ subId_Segment1: 'ATCG', subId_Segment2: 'TT' }); + expect.soft(fastaText).toBe(`>${FASTAHEADER_WITH_DESCRIPTION}\nATCG\n>${FASTAHEADER_SEGMENT2}\nTT`); + expect(editableSequences.getSequenceRecord()).deep.equals({ + [FASTAHEADER_WITH_DESCRIPTION]: 'ATCG', + [FASTAHEADER_SEGMENT2]: 'TT', + }); const rows = editableSequences.rows; expect(rows).deep.equals([ - { label: 'Segment 1', value: 'ATCG', initialValue: null, key: firstKey, fastaHeader: 'subId_Segment1' }, - { label: 'Segment 2', value: 'TT', initialValue: null, key: secondKey, fastaHeader: 'subId_Segment2' }, + { + label: 'Segment 1', + value: 'ATCG', + initialValue: null, + key: firstKey, + fastaHeader: FASTAHEADER_WITH_DESCRIPTION, + }, + { + label: 'Segment 2', + value: 'TT', + initialValue: null, + key: secondKey, + fastaHeader: FASTAHEADER_SEGMENT2, + }, ]); } expect(() => editableSequences.update('another key', 'GG', 'another key', 'anything')).toThrowError( 'Maximum limit reached — you can add up to 2 sequence file(s) only.', ); + expect(editableSequences.getFastaIds()).toEqual(`${FASTAHEADER_SEGMENT1} ${FASTAHEADER_SEGMENT2}`); }); test('GIVEN a multi-segmented organism THEN do not allow duplicate fasta headers', () => { + const FASTAHEADER = 'FASTAHEADER'; let editableSequences = EditableSequences.fromSequenceNames( makeReferenceGenomeLightweightSchema(['foo', 'bar']), ); @@ -158,23 +186,50 @@ describe('SequencesForm', () => { ]); const firstKey = initialRows[0].key; - editableSequences = editableSequences.update(firstKey, 'ATCG', 'Segment 1', 'subId_Segment'); + editableSequences = editableSequences.update(firstKey, 'ATCG', 'Segment 1', FASTAHEADER); const rowsAfterFirstUpdate = editableSequences.rows; const secondKey = rowsAfterFirstUpdate[1].key; - editableSequences = editableSequences.update(secondKey, 'TT', 'Segment 2', 'subId_Segment'); + editableSequences = editableSequences.update(secondKey, 'TT', 'Segment 2', 'FASTAHEADER description'); - const errorMessage = 'A sequence with the fastaHeader subId_Segment already exists.'; + const errorMessage = `A sequence with the fastaID ${FASTAHEADER} already exists.`; expect(toast.error).toHaveBeenCalledWith(expect.stringContaining(errorMessage)); // Expect that the second sequence was not added expect(editableSequences.rows).toEqual([ - { label: 'Segment 1', value: 'ATCG', initialValue: null, key: firstKey, fastaHeader: 'subId_Segment' }, + { label: 'Segment 1', value: 'ATCG', initialValue: null, key: firstKey, fastaHeader: FASTAHEADER }, + { label: 'Add a segment', value: null, initialValue: null, fastaHeader: null, key: expect.any(String) }, + ]); + expect(editableSequences.getFastaIds()).toEqual(FASTAHEADER); + }); + + test('GIVEN a single-segmented organism THEN only allows 1 input', async () => { + const FASTAHEADER = 'FASTAHEADER'; + let editableSequences = EditableSequences.fromSequenceNames(makeReferenceGenomeLightweightSchema(['foo'])); + + const initialRows = editableSequences.rows; + expect(initialRows).toEqual([ { label: 'Add a segment', value: null, initialValue: null, fastaHeader: null, key: expect.any(String) }, ]); + const key = initialRows[0].key; + + editableSequences = editableSequences.update(key, 'ATCG', key, FASTAHEADER); + const fasta = editableSequences.getSequenceFasta(); + expect(fasta).not.toBeUndefined(); + const fastaText = await fasta!.text(); + expect.soft(fastaText).toBe(`>${FASTAHEADER}\nATCG`); + + expect(editableSequences.getSequenceRecord()).deep.equals({ [FASTAHEADER]: 'ATCG' }); + + const rows = editableSequences.rows; + expect(rows).deep.equals([{ label: key, value: 'ATCG', initialValue: null, fastaHeader: FASTAHEADER, key }]); + + expect(() => editableSequences.update('another key', 'GG', 'another key', 'anything')).toThrowError( + 'Maximum limit reached — you can add up to 1 sequence file(s) only.', + ); }); - test('GIVEN a single-segmented organism THEN only allows 1 input and fasta header does not contain the segment name', async () => { + test('GIVEN an edit with an empty fasta header THEN use key as fasta header', async () => { let editableSequences = EditableSequences.fromSequenceNames(makeReferenceGenomeLightweightSchema(['foo'])); const initialRows = editableSequences.rows; @@ -183,16 +238,16 @@ describe('SequencesForm', () => { ]); const key = initialRows[0].key; - editableSequences = editableSequences.update(key, 'ATCG', key, 'subId'); + editableSequences = editableSequences.update(key, 'ATCG', 'subId', null); const fasta = editableSequences.getSequenceFasta(); expect(fasta).not.toBeUndefined(); const fastaText = await fasta!.text(); - expect.soft(fastaText).toBe('>subId\nATCG'); + expect.soft(fastaText).toBe(`>${key}\nATCG`); - expect(editableSequences.getSequenceRecord()).deep.equals({ subId: 'ATCG' }); + expect(editableSequences.getSequenceRecord()).deep.equals({ [key]: 'ATCG' }); const rows = editableSequences.rows; - expect(rows).deep.equals([{ label: key, value: 'ATCG', initialValue: null, fastaHeader: 'subId', key }]); + expect(rows).deep.equals([{ label: 'subId', value: 'ATCG', initialValue: null, fastaHeader: key, key }]); expect(() => editableSequences.update('another key', 'GG', 'another key', 'anything')).toThrowError( 'Maximum limit reached — you can add up to 1 sequence file(s) only.', @@ -216,20 +271,23 @@ describe('SequencesForm', () => { expect(editableSequences.rows).toEqual([ { label: 'Add a segment', value: null, initialValue: null, fastaHeader: null, key: expect.any(String) }, ]); + expect(editableSequences.getFastaIds()).toEqual(''); }); test('GIVEN initial data with an empty segment THEN the fasta does not contain the empty segment', async () => { + const FASTAHEADER = 'FASTAHEADER_label'; let editableSequences = EditableSequences.fromInitialData( defaultReviewData, makeReferenceGenomeLightweightSchema(['originalSequenceName', 'anotherSequenceName']), ); - editableSequences = editableSequences.update(editableSequences.rows[0].key, 'ATCG', 'label', 'subId_label'); + editableSequences = editableSequences.update(editableSequences.rows[0].key, 'ATCG', 'label', FASTAHEADER); const fasta = editableSequences.getSequenceFasta(); expect(fasta).not.toBeUndefined(); const fastaText = await fasta!.text(); - expect.soft(fastaText).toBe('>subId_label\nATCG'); + expect.soft(fastaText).toBe(`>${FASTAHEADER}\nATCG`); - expect(editableSequences.getSequenceRecord()).deep.equals({ subId_label: 'ATCG' }); + expect(editableSequences.getSequenceRecord()).deep.equals({ [FASTAHEADER]: 'ATCG' }); + expect(editableSequences.getFastaIds()).toEqual(FASTAHEADER); }); test('GIVEN initial segment data that is then deleted as an edit THEN the edit record does not contain the segment key but input field is kept', () => { @@ -264,5 +322,6 @@ describe('SequencesForm', () => { key: expect.any(String), }, ]); + expect(editableSequences.getFastaIds()).toEqual(''); }); }); diff --git a/website/src/components/Edit/SequencesForm.tsx b/website/src/components/Edit/SequencesForm.tsx index b981c4b3dc..2f5a9d63bc 100644 --- a/website/src/components/Edit/SequencesForm.tsx +++ b/website/src/components/Edit/SequencesForm.tsx @@ -22,6 +22,11 @@ function generateAndDownloadFastaFile(fastaHeader: string, sequenceData: string) URL.revokeObjectURL(url); } +function getFastaId(fastaHeader: string | null): string | null { + if (!fastaHeader) return null; + return fastaHeader.split(/\s+/)[0] ?? null; +} + type EditableSequenceFile = { key: string; label: string | null; @@ -136,8 +141,8 @@ export class EditableSequences { } fastaHeader ??= value == null ? null : key; // Ensure fastaHeader is never null if a sequence exists - if (this.editableSequenceFiles.some((seq) => seq.fastaHeader === fastaHeader)) { - toast.error(`A sequence with the fastaHeader ${fastaHeader} already exists.`); + if (this.editableSequenceFiles.some((seq) => getFastaId(seq.fastaHeader) === getFastaId(fastaHeader))) { + toast.error(`A sequence with the fastaID ${getFastaId(fastaHeader)} already exists.`); return new EditableSequences( this.editableSequenceFiles.filter((file) => file.value !== null), this.maxNumberOfRows, @@ -159,8 +164,13 @@ export class EditableSequences { } getFastaIds(): string { - const filledRows = this.rows.filter((row) => row.value !== null); - return filledRows.map((sequence) => sequence.fastaHeader).join(FASTA_IDS_SEPARATOR); + return this.rows + .flatMap((row) => { + if (row.value === null) return []; + const id = getFastaId(row.fastaHeader); + return id === null || id === '' ? [] : [id]; + }) + .join(FASTA_IDS_SEPARATOR); } getSequenceFasta(): File | undefined { diff --git a/website/src/components/Submission/FileUpload/fileProcessing.spec.ts b/website/src/components/Submission/FileUpload/fileProcessing.spec.ts index 96a5e0223a..5dc4e8784b 100644 --- a/website/src/components/Submission/FileUpload/fileProcessing.spec.ts +++ b/website/src/components/Submission/FileUpload/fileProcessing.spec.ts @@ -70,7 +70,9 @@ describe('fileProcessing', () => { }); test('Plain segment file content is extracted correctly', async () => { - const dummyFile = new File(['>fooid\nACTG\n\nACTG\nACTG\n'], 'example.fasta', { type: 'text/plain' }); + const dummyFile = new File(['>fooid description\nACTG\n\nACTG\nACTG\n'], 'example.fasta', { + type: 'text/plain', + }); const result = await PLAIN_SEGMENT_KIND.processRawFile(dummyFile); if (result.isErr()) { fail(`result was error: ${result._unsafeUnwrapErr().message}`); @@ -78,6 +80,6 @@ describe('fileProcessing', () => { const processedFile = result._unsafeUnwrap(); const processedText = await processedFile.text(); expect(processedText).toBe('ACTGACTGACTG'); - expect(processedFile.fastaHeader()).toBe('fooid'); + expect(processedFile.fastaHeader()).toBe('fooid description'); }); }); diff --git a/website/src/components/Submission/FileUpload/fileProcessing.ts b/website/src/components/Submission/FileUpload/fileProcessing.ts index b28ee15c48..f3c1000868 100644 --- a/website/src/components/Submission/FileUpload/fileProcessing.ts +++ b/website/src/components/Submission/FileUpload/fileProcessing.ts @@ -94,7 +94,11 @@ export const PLAIN_SEGMENT_KIND: FileKind = { new Error(`Found ${headerLines.length} headers in uploaded file, only a single header is allowed.`), ); } - const header = headerLines.length === 1 ? headerLines[0].substring(1).trim() : null; + let header: string | null = null; + if (headerLines.length === 1) { + const trimmed = headerLines[0].substring(1).trim(); + header = trimmed === '' ? null : trimmed; + } const segmentData = lines .filter((l) => !l.startsWith('>')) .map((l) => l.trim())