public void TestInsertUploadTransaction_WhenTarnsactionValidXmlSourceAndNotDuplicate_ThenInsertToTransactionRepositoryAndCrateTransactionAndSaveAndCommitEachOneTime() { // Arrange var expectedTransactionDate = new DateTime(2020, 12, 10); var transactionStatus = TransactionMapperConstant.XmlSourceStatusMapper.FirstOrDefault(); var expectedAmount = 1200M; var expectedTransactionStatus = _transactionStatusCollection.FirstOrDefault(x => x.StatusCode == transactionStatus.Value); var expectedTransactionUploadModel = new TransactionUploadModel() { Amount = expectedAmount.ToString(), CurrencyCode = "THB", Source = UploadSourceEnum.Xml, Status = transactionStatus.Key, TransactionDate = expectedTransactionDate.ToString(TransactionConstant.UploadXmlDateFormat), TransactionId = "Invoice00000020" }; var uploadTransactions = new List <TransactionUploadModel>() { expectedTransactionUploadModel }; AutoMockContainer.Mock <IUnitOfWork>().Setup(x => x.BeginTransactionAsync()).Returns(Task.FromResult(0)); AutoMockContainer.Mock <IUnitOfWork>().Setup(x => x.SaveChangeAsync()).ReturnsAsync(It.IsAny <int>()); AutoMockContainer.Mock <IUnitOfWork>().Setup(x => x.CommitTransactionAsync()).Returns(Task.FromResult(0)); AutoMockContainer.Mock <ITransactionStatusRepository>() .Setup(x => x.GetAllTransactionStatus()).ReturnsAsync(_transactionStatusCollection); AutoMockContainer.Mock <ITransactionRepository>().Setup(x => x.IsDuplicateTransactionIdAsync(It.IsAny <string>())).ReturnsAsync(false); AutoMockContainer.Mock <ITransactionRepository>().Setup(x => x.InsertTransaction(It.IsAny <TransactionEntity>())) .Callback <TransactionEntity>((transactionEntity) => { // Assert Assert.AreEqual(expectedTransactionUploadModel.TransactionId, transactionEntity.Id); Assert.AreEqual(expectedTransactionUploadModel.CurrencyCode, transactionEntity.CurrencyCode); Assert.AreEqual(expectedAmount, transactionEntity.Amount); Assert.AreEqual(expectedTransactionStatus.Id, transactionEntity.StatusId); Assert.AreEqual(expectedTransactionDate, transactionEntity.TransactionDate); }); var transactionManager = AutoMockContainer.Create <TransactionManager>(); // Act transactionManager.InsertUploadTransaction(uploadTransactions, It.IsAny <string>()).Wait(); // Assert AutoMockContainer.Mock <ITransactionRepository>() .Verify(x => x.InsertTransaction(It.IsAny <TransactionEntity>()), Times.Exactly(uploadTransactions.Count), "Should invoke equal uploadTransactions items."); AutoMockContainer.Mock <IUnitOfWork>().Verify(x => x.BeginTransactionAsync(), Times.Once, "Should invoke BeginTransactionAsync Once time."); AutoMockContainer.Mock <IUnitOfWork>().Verify(x => x.SaveChangeAsync(), Times.Once, "Should invoke SaveChangeAsync Once time."); AutoMockContainer.Mock <IUnitOfWork>().Verify(x => x.CommitTransactionAsync(), Times.Once, "Should invoke CommitTransactionAsync Once time."); }
private DateTime MapDate(TransactionUploadModel transactionUploadModel) { var dateFormat = string.Empty; if (transactionUploadModel.Source == UploadSourceEnum.Csv) { dateFormat = TransactionConstant.UploadCsvDateFormat; } else if (transactionUploadModel.Source == UploadSourceEnum.Xml) { dateFormat = TransactionConstant.UploadXmlDateFormat; } return(GlobalHelper.GetDateTimeFromString(transactionUploadModel.TransactionDate, dateFormat)); }
private decimal MapAmount(TransactionUploadModel transactionUploadModel) { var value = default(decimal); if (transactionUploadModel.Source == UploadSourceEnum.Csv) { value = GlobalHelper.ParseDecimalNumber(transactionUploadModel.Amount); } else if (transactionUploadModel.Source == UploadSourceEnum.Xml) { value = decimal.Parse(transactionUploadModel.Amount); } return(value); }
private string GetTransactionStatusCode(TransactionUploadModel transactionUploadModel) { var result = string.Empty; if (transactionUploadModel.Source == UploadSourceEnum.Csv) { var transactionStatus = TransactionMapperConstant.CsvSourceStatusMapper.FirstOrDefault(x => string.Equals(x.Key, transactionUploadModel.Status, StringComparison.InvariantCultureIgnoreCase)); result = transactionStatus.Value; } else if (transactionUploadModel.Source == UploadSourceEnum.Xml) { var transactionStatus = TransactionMapperConstant.XmlSourceStatusMapper.FirstOrDefault(x => string.Equals(x.Key, transactionUploadModel.Status, StringComparison.InvariantCultureIgnoreCase)); result = transactionStatus.Value; } return(result); }
private async Task <List <string> > ValidateTransactionUploadModel(int recordNumber, TransactionUploadModel transactionUploadModel) { var errorMessages = new List <string>(); if (string.IsNullOrWhiteSpace(transactionUploadModel.TransactionId)) { errorMessages.Add($"Record({recordNumber}) TransactionId is required."); } var isDuplicatedTransactionId = await _transactionRepository.IsDuplicateTransactionIdAsync(transactionUploadModel.TransactionId); if (isDuplicatedTransactionId) { errorMessages.Add($"Record({recordNumber}) TransactionId has already existed."); } if (transactionUploadModel.TransactionId != null && transactionUploadModel.TransactionId.Length > 50) { errorMessages.Add($"Record({recordNumber}) TransactionId length over 50."); } if (string.IsNullOrWhiteSpace(transactionUploadModel.Amount)) { errorMessages.Add($"Record({recordNumber}) Amount is required."); } if (string.IsNullOrWhiteSpace(transactionUploadModel.CurrencyCode)) { errorMessages.Add($"Record({recordNumber}) CurrencyCode is required."); } if (!IsIsoCurrency(transactionUploadModel.CurrencyCode)) { errorMessages.Add($"Record({recordNumber}) CurrencyCode should ISO4217 format."); } if (string.IsNullOrWhiteSpace(transactionUploadModel.Status)) { errorMessages.Add($"Record({recordNumber}) Status is required."); } if (transactionUploadModel.Source == UploadSourceEnum.Csv) { if (!GlobalHelper.IsDecimalNumber(transactionUploadModel.Amount)) { errorMessages.Add($"Record({recordNumber}) Amount should be only decimal number."); } if (!GlobalHelper.IsCorrectDateTimeFormat(transactionUploadModel.TransactionDate, TransactionConstant.UploadCsvDateFormat)) { errorMessages.Add($"Record({recordNumber}) Invalid format date."); } if (!TransactionMapperConstant.CsvSourceStatusMapper.Any(x => string.Equals(x.Key, transactionUploadModel.Status, StringComparison.InvariantCultureIgnoreCase))) { errorMessages.Add($"Record({recordNumber}) Invalid status."); } } else if (transactionUploadModel.Source == UploadSourceEnum.Xml) { if (!GlobalHelper.IsDecimal(transactionUploadModel.Amount)) { errorMessages.Add($"Record({recordNumber}) Amount should be only decimal."); } if (!GlobalHelper.IsCorrectDateTimeFormat(transactionUploadModel.TransactionDate, TransactionConstant.UploadXmlDateFormat)) { errorMessages.Add($"Record({recordNumber}) Invalid format date."); } if (!TransactionMapperConstant.XmlSourceStatusMapper.Any(x => string.Equals(x.Key, transactionUploadModel.Status, StringComparison.InvariantCultureIgnoreCase))) { errorMessages.Add($"Record({recordNumber}) Invalid status."); } } return(errorMessages); }