public async Task EmptyStringPassedOk(string inputData)
        {
            var strategy = new CsvParsingStrategy();
            var results  = await strategy.ParseTransactionsAsync(new MemoryStream(Encoding.UTF8.GetBytes(inputData))) as CsvParsingResult;

            Assert.True(results.Success);
            Assert.Empty(results.Transactions);
        }
        public async Task InvalidStatusError(string inputData)
        {
            var strategy = new CsvParsingStrategy();
            var results  = await strategy.ParseTransactionsAsync(new MemoryStream(Encoding.UTF8.GetBytes(inputData))) as CsvParsingResult;

            Assert.False(results.Success);

            Assert.Equal($"Row 1 validation errors: CsvMappingError (ColumnIndex = 4, Value = Column 4 with Value 'SomeStatus' cannot be converted, UnmappedRow = Invoice0000001|1,000.00|ZZZ|20/02/2019 12:33:16|SomeStatus)", results.Error);
        }
        public async Task IdLengthFor51Fails(string inputData)
        {
            var strategy = new CsvParsingStrategy();
            var results  = await strategy.ParseTransactionsAsync(new MemoryStream(Encoding.UTF8.GetBytes(inputData))) as CsvParsingResult;

            Assert.False(results.Success);
            Assert.Equal($"Row 1 validation errors: Id field is over 50 characters\r\nRow 2 validation errors: Id field is over 50 characters", results.Error);

            _outputHelper.WriteLine(string.Join(Environment.NewLine, ((CsvParsingResult)results).CsvTransactions.Select(t => t.ToString())));
        }
        public async Task IdLengthFor50PassesOk(string inputData)
        {
            var strategy = new CsvParsingStrategy();
            var results  = await strategy.ParseTransactionsAsync(new MemoryStream(Encoding.UTF8.GetBytes(inputData))) as CsvParsingResult;

            Assert.True(results.Success);
            Assert.Single(results.Transactions);

            _outputHelper.WriteLine(string.Join(Environment.NewLine, results.Transactions.Select(t => t.ToString())));
        }
        public async Task InvalidCurrencyError(string inputData)
        {
            var strategy = new CsvParsingStrategy();
            var results  = await strategy.ParseTransactionsAsync(new MemoryStream(Encoding.UTF8.GetBytes(inputData))) as CsvParsingResult;

            Assert.False(results.Success);

            Assert.Equal($"Row 1 validation errors: Invalid currency code ZZZ", results.Error);

            _outputHelper.WriteLine(string.Join(Environment.NewLine, ((CsvParsingResult)results).CsvTransactions.Select(t => t.ToString())));
        }
        public async Task FieldDetailsReadOk(string inputData)
        {
            var strategy = new CsvParsingStrategy();
            var results  = await strategy.ParseTransactionsAsync(new MemoryStream(Encoding.UTF8.GetBytes(inputData))) as CsvParsingResult;

            Assert.True(results.Success);
            Assert.Single(results.Transactions);
            Assert.Equal("Invoice0000001", results.Transactions[0].Id);
            Assert.Equal(1000.00M, results.Transactions[0].Amount);
            Assert.Equal("USD", results.Transactions[0].CurrencyCode);
            Assert.Equal(new DateTime(2019, 02, 20, 00, 33, 16).ToUniversalTime(), results.Transactions[0].TransactionDateUtc);
            Assert.Equal(CurrencyTransactionStatus.A, results.Transactions[0].Status);

            _outputHelper.WriteLine(string.Join(Environment.NewLine, results.Transactions.Select(t => t.ToString())));
        }