11import { describe , expect , it } from 'vitest' ;
22
3+ import { computeCheckDigit } from '../../parsers/check.ts' ;
34import parse from '../parse.ts' ;
45
56describe ( 'parse TD1' , ( ) => {
@@ -336,7 +337,7 @@ describe('parse TD1', () => {
336337 } ) ;
337338 } ) ;
338339
339- it ( 'parse document number' , ( ) => {
340+ it ( 'Document number field details ' , ( ) => {
340341 const MRZ = [
341342 'I<UTOD23145890<1233<<<<<<<<<<<' ,
342343 '7408122F1204159UTO<<<<<<<<<<<2' ,
@@ -351,7 +352,7 @@ describe('parse TD1', () => {
351352 documentNumber : result . fields . documentNumber ,
352353 } ) ;
353354
354- expect ( result . details . filter ( ( f ) => ! f . valid ) ) . toHaveLength ( 2 ) ;
355+ expect ( result . details . filter ( ( item ) => ! item . valid ) ) . toHaveLength ( 2 ) ;
355356
356357 const documentNumberDetails = result . details . find (
357358 ( d ) => d . field === 'documentNumber' ,
@@ -550,5 +551,112 @@ describe('parse TD1', () => {
550551 lastName : 'REINARTZ' ,
551552 firstName : 'ULRIKE KATIA E' ,
552553 } ) ;
554+
555+ const detailedCheckDigit = result . details . find (
556+ ( item ) => item . field === 'documentNumberCheckDigit' ,
557+ ) ;
558+ expect ( detailedCheckDigit ) . toMatchObject ( {
559+ valid : true ,
560+ start : 18 ,
561+ end : 19 ,
562+ value : '3' ,
563+ } ) ;
564+ } ) ;
565+ it ( 'Belgium ID BEL-BO-03003, with wrong document number check digit' , ( ) => {
566+ // source: https://www.consilium.europa.eu/prado/en/BEL-BO-03003/index.html
567+ // This Belgian ID has the document number check digit embedded in optional1
568+ const MRZ = [
569+ 'IDBEL000590240<6016<<<<<<<<<<<' ,
570+ '8512017F1311048BEL851201002007' ,
571+ 'REINARTZ<<ULRIKE<KATIA<E<<<<<<' ,
572+ ] ;
573+
574+ const result = parse ( MRZ ) ;
575+
576+ expect ( result ) . toMatchObject ( {
577+ format : 'TD1' ,
578+ valid : false ,
579+ documentNumber : result . fields . documentNumber ,
580+ } ) ;
581+
582+ const expectedCheckDigit = computeCheckDigit ( '000590240601' ) ;
583+
584+ const wrongFields = result . details . filter ( ( item ) => ! item . valid ) ;
585+ expect ( wrongFields ) . toHaveLength ( 2 ) ;
586+
587+ const documentNumberDetails = wrongFields . find (
588+ ( item ) => item . field === 'documentNumberCheckDigit' ,
589+ ) ;
590+
591+ expect ( documentNumberDetails ) . toStrictEqual ( {
592+ valid : false ,
593+ start : 18 ,
594+ end : 19 ,
595+ value : '6' ,
596+ field : 'documentNumberCheckDigit' ,
597+ label : 'Document number check digit' ,
598+ line : 0 ,
599+ ranges : [
600+ {
601+ line : 0 ,
602+ start : 14 ,
603+ end : 15 ,
604+ raw : '<' ,
605+ } ,
606+ {
607+ line : 0 ,
608+ start : 5 ,
609+ end : 14 ,
610+ raw : '000590240' ,
611+ } ,
612+ {
613+ line : 0 ,
614+ start : 15 ,
615+ end : 30 ,
616+ raw : '6016<<<<<<<<<<<' ,
617+ } ,
618+ ] ,
619+ autocorrect : [ ] ,
620+ error : `invalid check digit: 6. Must be ${ expectedCheckDigit } ` ,
621+ } ) ;
622+
623+ const compositeCheckDigitDetails = wrongFields . find (
624+ ( item ) => item . field === 'compositeCheckDigit' ,
625+ ) ;
626+
627+ expect ( compositeCheckDigitDetails ) . toBeDefined ( ) ;
628+ } ) ;
629+
630+ it ( 'Belgium ID BEL-BO-03003, with wrong birth date check digit' , ( ) => {
631+ // source: https://www.consilium.europa.eu/prado/en/BEL-BO-03003/index.html
632+ // The birthdate check digit was changed
633+ const MRZ = [
634+ 'IDBEL000590240<6013<<<<<<<<<<<' ,
635+ '8512018F1311048BEL851201002007' ,
636+ 'REINARTZ<<ULRIKE<KATIA<E<<<<<<' ,
637+ ] ;
638+
639+ const result = parse ( MRZ ) ;
640+
641+ expect ( result ) . toMatchObject ( {
642+ format : 'TD1' ,
643+ valid : false ,
644+ documentNumber : result . fields . documentNumber ,
645+ } ) ;
646+
647+ const wrongDetails = result . details . filter ( ( item ) => ! item . valid ) ;
648+ expect ( wrongDetails ) . toHaveLength ( 2 ) ;
649+
650+ const birthDateDetails = wrongDetails . find (
651+ ( item ) => item . field === 'birthDateCheckDigit' ,
652+ ) ;
653+
654+ expect ( birthDateDetails ) . toMatchObject ( {
655+ valid : false ,
656+ start : 6 ,
657+ end : 7 ,
658+ value : '8' ,
659+ error : `invalid check digit: 8. Must be 7` ,
660+ } ) ;
553661 } ) ;
554662} ) ;
0 commit comments