Example #1
0
        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);
        }
Example #2
0
        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));
        }
Example #3
0
        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);
        }
Example #4
0
        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"));
        }
Example #5
0
        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);
        }
Example #6
0
        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"));
        }
Example #7
0
        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"));
        }
Example #8
0
        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));
        }
Example #9
0
        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);
        }
Example #10
0
 public ICfCheckOutcome Post(CfDataToBeChecked data)
 {
     return(this.cfChecker.Check(data));
 }