예제 #1
0
        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);
        }