public void AnOmocodeFiscalCodeWorks() { var checker = GetCfChecker(); var data = new CfDataToBeChecked("BNZVCN32S10E57PV", "Vincenzo", "Bonzi", new DateTime(1932, 11, 10), string.Empty); var results = checker.Check(data); Assert.That(results.Results, Is.Empty); }
public void MyFiscalCodeWithWrongDayGivesBirthDateError() { var checker = GetCfChecker(); var data = new CfDataToBeChecked("SPSMCL73T17L259D", "Marcello", "Esposito", new DateTime(1973, 12, 16), string.Empty); var results = checker.Check(data); Assert.That(results.Results.Count(r => r.Code == "CfBirthDateMismatch"), Is.EqualTo(1)); }
public void MyFiscalCodeWorks() { CfChecker checker = GetCfChecker(); var data = new CfDataToBeChecked("SPSMCL73T16L259D", "Marcello", "Esposito", new DateTime(1973, 12, 16), string.Empty); var results = checker.Check(data); Assert.That(results.Results, Is.Empty); }
public void MyFiscalCodeWithWrongChecksumGivesChecksumError() { var checker = GetCfChecker(); var data = new CfDataToBeChecked("SPSMCL73T16L259E", "Marcello", "Esposito", new DateTime(1973, 12, 16), string.Empty); var results = checker.Check(data); Assert.That(results.Results.Single().Code, Is.EqualTo("CfWrongChecksum")); }
public void SucceedsIfValidPinIsProvided() { var activeApplicationExistsByFiscalCode = new Mock <IActiveApplicationExistsByFiscalCode>(); activeApplicationExistsByFiscalCode.Setup(a => a.Exists(It.IsAny <string>())).Returns(true); var activeApplicationExistsByFiscalCodeAndPin = new Mock <IActiveApplicationExistsByFiscalCodeAndPin>(); activeApplicationExistsByFiscalCodeAndPin.Setup(a => a.Exists(It.IsAny <string>(), It.IsAny <string>())).Returns(true); var checker = new CfChecker(activeApplicationExistsByFiscalCode.Object, activeApplicationExistsByFiscalCodeAndPin.Object); var data = new CfDataToBeChecked("SPSMCL73T16L259D", "Marcello", "Esposito", new DateTime(1973, 12, 16), "12345"); var results = checker.Check(data); Assert.That(results.Results.All(a => a.Type == ResultType.Success), Is.True); }
public void GivesAnomalyIfUnmatchingPinIsProvided() { var activeApplicationExistsByFiscalCode = new Mock <IActiveApplicationExistsByFiscalCode>(); activeApplicationExistsByFiscalCode.Setup(a => a.Exists(It.IsAny <string>())).Returns(true); var activeApplicationExistsByFiscalCodeAndPin = new Mock <IActiveApplicationExistsByFiscalCodeAndPin>(); activeApplicationExistsByFiscalCodeAndPin.Setup(a => a.Exists(It.IsAny <string>(), It.IsAny <string>())).Returns(false); var checker = new CfChecker(activeApplicationExistsByFiscalCode.Object, activeApplicationExistsByFiscalCodeAndPin.Object); var data = new CfDataToBeChecked("SPSMCL73T16L259D", "Marcello", "Esposito", new DateTime(1973, 12, 16), "12345"); var results = checker.Check(data); Assert.That(results.Results.Single().Code, Is.EqualTo("PinIsInvalid")); }
public void GivesAnomalyIfCfExists() { var activeApplicationExistsByFiscalCode = new Mock <IActiveApplicationExistsByFiscalCode>(); activeApplicationExistsByFiscalCode.Setup(a => a.Exists(It.IsAny <string>())).Returns(true); var activeApplicationExistsByFiscalCodeAndPin = new Mock <IActiveApplicationExistsByFiscalCodeAndPin>(); activeApplicationExistsByFiscalCodeAndPin.Setup(a => a.Exists(It.IsAny <string>(), It.IsAny <string>())).Returns(true); var checker = new CfChecker(activeApplicationExistsByFiscalCode.Object, activeApplicationExistsByFiscalCodeAndPin.Object); var data = new CfDataToBeChecked("SPSMCL73T16L259D", "Marcello", "Esposito", new DateTime(1973, 12, 16), string.Empty); var results = checker.Check(data); Assert.That(results.Results.Single().Code, Is.EqualTo("AlreadyExistingCf")); }
public ApplicationSubmissionResult Submit(Application application) { log.Info($"Application submitted: { JsonConvert.SerializeObject(application) }"); string fiscalCode = application.FiscalCode; var dataToBeChecked = new CfDataToBeChecked( fiscalCode, application.FirstName, application.LastName, application.BirthDate, application.Pin); var checkResults = this.cfChecker.Check(dataToBeChecked); var anomalies = checkResults.Results .Where(r => r.Type != ResultType.Success) .Select(r => new Anomaly(r.Code, DateTime.UtcNow, r.Message)) .ToArray(); application.Anomalies = anomalies; application.SubmissionTime = DateTime.UtcNow; var sameFiscalCodeActiveApplications = this.getActiveApplicationsByFiscalCode.Get(fiscalCode).ToArray(); var pinIsEmpty = string.IsNullOrWhiteSpace(application.Pin); var pinIsValid = !pinIsEmpty && sameFiscalCodeActiveApplications.Any(a => a.Pin == application.Pin); var userMessages = new List <ResultMessage>(); if (pinIsEmpty) { application.Pin = this.pinBuilder.Build(); userMessages.Add(new ResultMessage( "storeOk", "La domanda di partecipazione è stata correttamente acquisita.", "Success")); log.Info("Application stored. Empty Pin."); } else if (!pinIsValid) { application.Pin = this.pinBuilder.Build(); userMessages.Add(new ResultMessage( "storeOk", "La domanda di partecipazione è stata correttamente acquisita.", "Success")); userMessages.Add(new ResultMessage( "newPin", "Annota il nuovo PIN, che potrai usare se desideri aggiornare la domanda.", "Warning")); log.Info("Application stored. Invalid Pin."); } else { userMessages.Add(new ResultMessage( "updateOk", "La domanda di partecipazione è stata correttamente aggiornata.", "Success")); userMessages.Add(new ResultMessage( "pinUnchanged", "Il PIN resta identico a quello già in tuo possesso.", "Success")); log.Info("Application updated. Correct Pin."); } userMessages.Add(new ResultMessage( "savePin", "Conserva il PIN in un posto sicuro. Ti servirà qualora volessi aggiornare la tua domanda.", "Success")); userMessages.Add(new ResultMessage( "howToSavePin", "Puoi fotografarlo con il tuo smartphone o stamparlo con il tasto in basso.", "Success")); this.storeApplication.Store(application); log.Debug("Application stored"); return(new ApplicationSubmissionResult(fiscalCode, application.Pin, userMessages.ToArray(), DateTime.UtcNow, true)); }
public ICfCheckOutcome Check(CfDataToBeChecked data) { var result = new CfCheckOutcome(); try { var p = new Person() { FirstName = data.FirstName, LastName = data.LastName, DateOfBirth = data.BirthDate, Gender = data.FiscalCode[9] > '3' ? Bogus.DataSets.Name.Gender.Female : Bogus.DataSets.Name.Gender.Male }; var fiscalCode = p.CodiceFiscale(); var expectedLastnamePart = fiscalCode.Substring(0, 3); var actualLastnamePart = data.FiscalCode.Substring(0, 3); if (!expectedLastnamePart.Equals(actualLastnamePart)) { result.AddResult(new CfLastNameMismatch()); } var expectedFirstnamePart = fiscalCode.Substring(3, 3); var actualFirstnamePart = data.FiscalCode.Substring(3, 3); if (!expectedFirstnamePart.Equals(actualFirstnamePart)) { result.AddResult(new CfFirstNameMismatch()); } var expectedDatePart = fiscalCode.Substring(6, 5); var actualDatePart = data.FiscalCode.Substring(6, 5); if (!expectedDatePart.Equals(actualDatePart)) { result.AddResult(new CfBirthDateMismatch()); } if (!FiscalCodeChecker.Checker.IsFormallyValid(data.FiscalCode)) { result.AddResult(new CfWrongChecksum()); } if (string.IsNullOrWhiteSpace(data.Pin)) { if (this.activeApplicationExistsByFiscalCode.Exists(data.FiscalCode)) { result.AddResult(new AlreadyExistingCf()); } } else { if (!this.activeApplicationExistsByFiscalCode.Exists(data.FiscalCode)) { result.AddResult(new UnexistingCf()); } else if (!this.activeApplicationExistsByFiscalCodeAndPin.Exists(data.FiscalCode, data.Pin)) { result.AddResult(new PinIsInvalid()); } } log.Debug($"Checking data: { JsonConvert.SerializeObject(data) } with result { JsonConvert.SerializeObject(result) }"); } catch (Exception) { log.Warn("An error occurred during validation."); result.AddResult(new CfException()); } return(result); }
public ICfCheckOutcome Post(CfDataToBeChecked data) { return(this.cfChecker.Check(data)); }