Пример #1
0
        public IEnumerable <Transaction> ParseValidate(StreamReader reader)
        {
            CsvReader csv = new CsvReader(reader, CultureInfo.CurrentCulture);

            csv.Configuration.Delimiter         = ",";
            csv.Configuration.MissingFieldFound = null;

            var listTran = new List <CsvTransactionModel>();

            try
            {
                while (csv.Read())
                {
                    CsvTransactionModel record = csv.GetRecord <CsvTransactionModel>();
                    listTran.Add(record);
                }
                return(listTran.Select(x => new Transaction
                {
                    Amount = x.Amount,
                    TransactionIdentifier = x.TransactionId,
                    CurrencyCode = x.CurrencyCode,
                    TransactionDate = x.TransactionDate.ToDateTime(CsvParser.DateTimeFormat),
                    Status = CsvToTransactionStatus(x.Status)
                }));
            }
            catch (Exception ex)
            {
                throw new FileParseValidationException($"Csv file validation error: {ex.Message}");
            }
        }
Пример #2
0
        public static TransactionDTO GetDTO(this CsvTransactionModel csv)
        {
            TransactionDTO dto = new TransactionDTO(csv.Id,
                                                    csv.Amount,
                                                    csv.CurrencyCode,
                                                    csv.TransactionDate,
                                                    (TransactionDTOStatus)csv.Status);

            return(dto);
        }
Пример #3
0
        public void Validate_PerfectFile_Pass()
        {
            var csvTransaction = new CsvTransactionModel
            {
                TransactionId   = "Inv00001",
                TransactionDate = "20/02/2019 12:33:16",
                Amount          = "200.00",
                CurrencyCode    = "USD",
                Status          = "Finished"
            };

            List <string> result = csvValidator.Validate(csvTransaction);

            Assert.IsTrue(result.Count == 0);
        }
Пример #4
0
        public void Validate_CurrencyCodeIsNotCorrent_Fail()
        {
            var csvTransaction = new CsvTransactionModel
            {
                TransactionId   = "Inv00001",
                TransactionDate = "20/02/2019 12:33:16",
                Amount          = "200.00",
                CurrencyCode    = "AAA",
                Status          = "Finished"
            };

            List <string> result = csvValidator.Validate(csvTransaction);

            Assert.IsTrue(result.Count == 1);
            Assert.IsTrue(result[0].EndsWith("Currency Code is not correct"));
        }
Пример #5
0
        public void Validate_AmountValueIsNotANumber_Fail()
        {
            var csvTransaction = new CsvTransactionModel
            {
                TransactionId   = "Inv00001",
                TransactionDate = "20/02/2019 12:33:16",
                Amount          = "AAA",
                CurrencyCode    = "USD",
                Status          = "Finished"
            };

            List <string> result = csvValidator.Validate(csvTransaction);

            Assert.IsTrue(result.Count == 1);
            Assert.IsTrue(result[0].EndsWith("Amount should be decimal number"));
        }
Пример #6
0
        public void Validate_WrongTransactionDateFormat_Fail()
        {
            var csvTransaction = new CsvTransactionModel
            {
                TransactionId   = "Inv00001",
                TransactionDate = "2019/01/23 13:45:10",
                Amount          = "200.00",
                CurrencyCode    = "USD",
                Status          = "Finished"
            };

            List <string> result = csvValidator.Validate(csvTransaction);

            Assert.IsTrue(result.Count == 1);
            Assert.IsTrue(result[0].EndsWith("Transaction Date format is not correct"));
        }
Пример #7
0
        public void Validate_IDLengthTooLong_Fail()
        {
            var csvTransaction = new CsvTransactionModel
            {
                TransactionId   = "Inv0000128352374283751028337345734592485343945347537420348457320384273",
                TransactionDate = "20/02/2019 12:33:16",
                Amount          = "200.00",
                CurrencyCode    = "USD",
                Status          = "Finished"
            };

            List <string> result = csvValidator.Validate(csvTransaction);

            Assert.IsTrue(result.Count == 1);
            Assert.IsTrue(result[0].EndsWith("Transaction ID length should be less than 50"));
        }
Пример #8
0
        public static TransactionModel MapToModel(this CsvTransactionModel item)
        {
            var statusDictionary = new Dictionary <string, TransactionStatus>();

            statusDictionary.Add("Approved", TransactionStatus.Approved);
            statusDictionary.Add("Failed", TransactionStatus.Rejected);
            statusDictionary.Add("Finished", TransactionStatus.Done);

            return(new TransactionModel
            {
                TransactionId = item.TransactionId,
                Amount = decimal.Parse(item.Amount),
                CurrencyCode = item.CurrencyCode,
                TransactionDate = DateTime.ParseExact(item.TransactionDate, "dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture),
                Status = statusDictionary[item.Status]
            });
        }
Пример #9
0
        public void Validate_MultipleErrorsOccur_Fail()
        {
            var csvTransaction = new CsvTransactionModel
            {
                TransactionId   = "Inv00001",
                TransactionDate = "20/02/2019 12:33:16",
                Amount          = "AAA",
                CurrencyCode    = "AAA",
                Status          = "AAA"
            };

            List <string> result = csvValidator.Validate(csvTransaction);

            Assert.IsTrue(result.Count == 3);
            Assert.IsTrue(result[0].EndsWith("Amount should be decimal number"));
            Assert.IsTrue(result[1].EndsWith("Currency Code is not correct"));
            Assert.IsTrue(result[2].EndsWith("Transaction Status is not correct"));
        }
        public List <string> Validate(CsvTransactionModel transaction)
        {
            var    errorList         = new List <string>();
            string errorFormat       = "Transaction Id {0} : {1}";
            var    transactionStatus = new List <string> {
                "Approved", "Failed", "Finished"
            };

            string transactionId = transaction.TransactionId;

            if (transaction.TransactionId.Length > 50)
            {
                errorList.Add(string.Format(errorFormat, transactionId, "Transaction ID length should be less than 50"));
            }

            if (!decimal.TryParse(transaction.Amount, out _))
            {
                errorList.Add(string.Format(errorFormat, transactionId, "Amount should be decimal number"));
            }

            if (!CurrencyCodeHelper.IsCurrencyFormatCorrect(transaction.CurrencyCode))
            {
                errorList.Add(string.Format(errorFormat, transactionId, "Currency Code is not correct"));
            }

            if (!DateTime.TryParseExact(transaction.TransactionDate, "dd/MM/yyyy HH:mm:ss", null, DateTimeStyles.None, out _))
            {
                errorList.Add(string.Format(errorFormat, transactionId, "Transaction Date format is not correct"));
            }

            if (!transactionStatus.Contains(transaction.Status))
            {
                errorList.Add(string.Format(errorFormat, transactionId, "Transaction Status is not correct"));
            }

            return(errorList);
        }
Пример #11
0
        private IEnumerable <TransactionDTO> UploadFromCSV(StreamReader reader)
        {
            List <CsvTransactionModel> csvTransactions = new List <CsvTransactionModel>();

            using (TextReader tr = reader)
            {
                //Get header

                Dictionary <string, int> fieldIndexes = new Dictionary <string, int>();
                string header = "";
                if (tr.Peek() > 0)
                {
                    header = reader.ReadLine();
                    if (string.IsNullOrEmpty(header))
                    {
                        throw new InvalidCsvRecord("Csv file must contain header!");
                    }
                    else
                    {
                        List <string> fieldNames = header.Split('"')
                                                   .Select(f => f.Trim())
                                                   .Where(f => !string.IsNullOrWhiteSpace(f) && f != ",")
                                                   .ToList();

                        if (fieldNames.Count != 5)
                        {
                            throw new InvalidCsvRecord($"Csv header must contain 5 fields!");
                        }

                        var CsvTransactionModelProperties = typeof(CsvTransactionModel).GetProperties().Select(p => p.Name).ToList();
                        for (int i = 0; i < fieldNames.Count; i++)
                        {
                            if (CsvTransactionModelProperties.Contains(fieldNames[i]))
                            {
                                fieldIndexes.Add(fieldNames[i], i);
                            }
                            else
                            {
                                throw new InvalidCsvRecord($"Invalid csv header! Unknown field {fieldNames[i]}");
                            }
                        }
                    }
                }


                uint lineNumber = 2;
                while (tr.Peek() > 0)
                {
                    csvTransactions.Add(CsvTransactionModel.GetFromCsvRow(reader.ReadLine(), fieldIndexes, lineNumber));
                    lineNumber++;
                }
            }

            IEnumerable <TransactionDTO> transactions;

            if (csvTransactions != null && csvTransactions.Count > 0)
            {
                transactions = csvTransactions.Select(t => t.GetDTO()).ToList();
            }
            else
            {
                transactions = new List <TransactionDTO>();
            }

            return(transactions);
        }