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}"); } }
public static TransactionDTO GetDTO(this CsvTransactionModel csv) { TransactionDTO dto = new TransactionDTO(csv.Id, csv.Amount, csv.CurrencyCode, csv.TransactionDate, (TransactionDTOStatus)csv.Status); return(dto); }
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); }
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")); }
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")); }
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")); }
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")); }
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] }); }
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); }
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); }