public MrzLine2 ParseMrzLine2FromString(string rawMrz) { MrzLine2 mrzLine2 = new MrzLine2(); try { //All characters need to be uppercase rawMrz = rawMrz.ToUpper(); mrzLine2.PassportNumber = PassportValidatorHelper.ParseForString(rawMrz, PassportNumberLookup.Index, PassportNumberLookup.Length); mrzLine2.CheckDigitPassportNumber = PassportValidatorHelper.ParseForString(rawMrz, PassportNumberCheckDigitLookup.Index, PassportNumberCheckDigitLookup.Length); mrzLine2.Nationality = (Nationality)PassportValidatorHelper.ParseForEnum(rawMrz, NationalityLookup.Index, NationalityLookup.Length, typeof(Nationality)); mrzLine2.DateOfBirth = PassportValidatorHelper.ParseForDateTime(rawMrz, DateofBirthLookup.Index, DateofBirthLookup.Length, DateMask); mrzLine2.CheckDigitDateOfBirth = PassportValidatorHelper.ParseForString(rawMrz, CheckDigitDateOfBirthLookup.Index, CheckDigitDateOfBirthLookup.Length); mrzLine2.Gender = (Gender)PassportValidatorHelper.ParseForEnum(rawMrz, GenderLookup.Index, GenderLookup.Length, typeof(Gender)); mrzLine2.DateOfExpiry = PassportValidatorHelper.ParseForDateTime(rawMrz, ExpiryDateLookup.Index, ExpiryDateLookup.Length, DateMask); mrzLine2.CheckDigitDateOfExpiry = PassportValidatorHelper.ParseForString(rawMrz, ExpiryCheckDigitLookup.Index, ExpiryCheckDigitLookup.Length); mrzLine2.PersonalNumber = PassportValidatorHelper.ParseForString(rawMrz, PersonalNumberLookup.Index, PersonalNumberLookup.Length); mrzLine2.CheckDigitPersonalNumber = PassportValidatorHelper.ParseForString(rawMrz, PersonalNumberCheckDigitLookup.Index, PersonalNumberCheckDigitLookup.Length); mrzLine2.CheckDigitOverall = PassportValidatorHelper.ParseForString(rawMrz, CompositeCheckDigitLookup.Index, CompositeCheckDigitLookup.Length); } catch (Exception) { //Throw the exception up the stack throw; } return(mrzLine2); }
public ValidationResults ValidateMrzAndBaseData(PassportBaseData baseData, MrzLine2 mrzLine2) { ValidationResults results = new ValidationResults(); //Check digits against what was passed into mrzline2 results.PassportNumberCheckDigit = CheckDigitHelper.CalculateCheckDigit(mrzLine2.PassportNumber) == mrzLine2.CheckDigitPassportNumber ? true : false; results.DateOfBirthCheckDigit = CheckDigitHelper.CalculateCheckDigit(mrzLine2.DateOfBirth.ToString("yyMMdd")) == mrzLine2.CheckDigitDateOfBirth ? true : false; results.PassportExpirationDateCheckDigit = CheckDigitHelper.CalculateCheckDigit(mrzLine2.DateOfExpiry.ToString("yyMMdd")) == mrzLine2.CheckDigitDateOfExpiry ? true : false; results.PersonalNumberCheckDigit = CheckDigitHelper.CalculateCheckDigit(mrzLine2.PersonalNumber) == mrzLine2.CheckDigitPersonalNumber ? true : false; //Composite check digit is all fields on line 2 minus nationality and gender string compositeCheckDigit = mrzLine2.PassportNumber + mrzLine2.CheckDigitPassportNumber + mrzLine2.DateOfBirth.ToString("yyMMdd") + mrzLine2.CheckDigitDateOfBirth + mrzLine2.DateOfExpiry.ToString("yyMMdd") + mrzLine2.CheckDigitDateOfExpiry + mrzLine2.PersonalNumber + mrzLine2.CheckDigitPersonalNumber; results.FinalCheckDigit = CheckDigitHelper.CalculateCheckDigit(compositeCheckDigit) == mrzLine2.CheckDigitOverall ? true : false; //Do a cross check between what the user entered vs what's on mrzline2 results.GenderCrossCheck = baseData.Gender == mrzLine2.Gender ? true : false; results.DateOfBirthCrossCheck = baseData.DateOfBirth.ToString(DateMask) == mrzLine2.DateOfBirth.ToString(DateMask) ? true : false; results.ExpirationDateCrossCheck = baseData.DateOfExpiry.ToString(DateMask) == mrzLine2.DateOfExpiry.ToString(DateMask) ? true : false; results.NationalityCrossCheck = baseData.Nationality == mrzLine2.Nationality ? true : false; results.PassportNumberCrossCheck = baseData.PassportNumber.ZeroFillerChars() == mrzLine2.PassportNumber ? true : false; return(results); }
public void Validate_Valid_Passport_Returns_Validated_Results() { var mockMrzParse = new Mock <IParseMrzLine2>(); var mockMrzValidator = new Mock <IMrzValidator>(); //We need to mock the IMapper, use the existing profile and pass this in var mockMapper = new MapperConfiguration(cfg => { cfg.AddProfile(new MappingProfile()); }); var mapper = mockMapper.CreateMapper(); PassportValidator controller = new PassportValidator(mockMrzParse.Object, mockMrzValidator.Object, mapper); PassportInput passportInput = new PassportInput() { PassportNumber = "112256503", Nationality = Nationality.GBR, DateOfBirth = new DateTime(1989, 02, 12), Gender = Gender.M, DateOfExpiry = new DateTime(2020, 10, 01), MrzLine2 = "1122565035GBR8902122M2010016<<<<<<<<<<<<<<04" }; MrzLine2 fakeMrzLine2 = new MrzLine2() { PassportNumber = "112256503", CheckDigitPassportNumber = "5", Nationality = Nationality.GBR, DateOfBirth = new DateTime(1989, 02, 12), CheckDigitDateOfBirth = "2", Gender = Gender.M, DateOfExpiry = new DateTime(2020, 10, 01), CheckDigitDateOfExpiry = "6", PersonalNumber = "", CheckDigitPersonalNumber = "0", CheckDigitOverall = "4" }; ValidationResults expectedValidationResults = new ValidationResults() { PassportNumberCheckDigit = true, DateOfBirthCheckDigit = true, PassportExpirationDateCheckDigit = true, PersonalNumberCheckDigit = true, FinalCheckDigit = true, GenderCrossCheck = true, DateOfBirthCrossCheck = true, ExpirationDateCrossCheck = true, NationalityCrossCheck = true, PassportNumberCrossCheck = true }; mockMrzParse.Setup(x => x.ParseMrzLine2FromString(It.IsAny <string>())).Returns(fakeMrzLine2); mockMrzValidator.Setup(x => x.ValidateMrzAndBaseData(It.IsAny <PassportBaseData>(), It.IsAny <MrzLine2>())).Returns(expectedValidationResults); ValidationResults returnedValidationResults = controller.Validate(passportInput).Value; Assert.Equal(expectedValidationResults, returnedValidationResults); }
public ActionResult <ValidationResults> Validate([FromBody] PassportInput input) { //Map view model onto model PassportBaseData baseData = _mapper.Map <PassportBaseData>(input); try { //Get the Mrzline2 string into a manageable object MrzLine2 mrzLine2 = _parsemrzLine2.ParseMrzLine2FromString(input.MrzLine2); //Check all data on the mrzline2 and whether what the user entered matches the mrzline2 return(_mrzValidator.ValidateMrzAndBaseData(baseData, mrzLine2)); } catch (Exception e) { //Always return a bad status code with the exception to the view return(BadRequest(e)); } }