package ofx import ( "testing" "github.com/stretchr/testify/assert" "github.com/mayswind/ezbookkeeping/pkg/core" "github.com/mayswind/ezbookkeeping/pkg/errs" ) func TestCreateNewOFXFileReader_OFX1(t *testing.T) { context := core.NewNullContext() reader, err := createNewOFXFileReader(context, []byte( "OFXHEADER:100\n"+ "DATA:OFXSGML\n"+ "VERSION:103\n"+ "SECURITY:NONE\n"+ "ENCODING:USASCII\n"+ "CHARSET:1252\n"+ "COMPRESSION:NONE\n"+ "OLDFILEUID:NONE\n"+ "NEWFILEUID:NONE\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "CNY\n"+ "\n"+ "123\n"+ "\n"+ "\n"+ "\n"+ "DEP\n"+ "20240901012345.000[+8:CST]\n"+ "123.45\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "")) assert.Nil(t, err) ofxFile, err := reader.read(context) assert.Nil(t, err) assert.NotNil(t, ofxFile) assert.NotNil(t, ofxFile.FileHeader) assert.Equal(t, ofxVersion1, ofxFile.FileHeader.OFXDeclarationVersion) assert.Equal(t, "103", ofxFile.FileHeader.OFXDataVersion) assert.Equal(t, "NONE", ofxFile.FileHeader.Security) assert.Equal(t, "NONE", ofxFile.FileHeader.OldFileUid) assert.Equal(t, "NONE", ofxFile.FileHeader.NewFileUid) assert.NotNil(t, ofxFile.BankMessageResponseV1) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse) assert.Equal(t, "CNY", ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.DefaultCurrency) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.AccountFrom) assert.Equal(t, "123", ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.AccountFrom.AccountId) assert.Equal(t, 1, len(ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions)) assert.Equal(t, ofxDepositTransaction, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions[0].TransactionType) assert.Equal(t, "20240901012345.000[+8:CST]", ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions[0].PostedDate) assert.Equal(t, "123.45", ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions[0].Amount) } func TestCreateNewOFXFileReader_OFX1WithoutBreakLine(t *testing.T) { context := core.NewNullContext() reader, err := createNewOFXFileReader(context, []byte( "OFXHEADER:100\n"+ "DATA:OFXSGML\n"+ "VERSION:103\n"+ "SECURITY:NONE\n"+ "ENCODING:USASCII\n"+ "CHARSET:1252\n"+ "COMPRESSION:NONE\n"+ "OLDFILEUID:NONE\n"+ "NEWFILEUID:NONE\n"+ "\n"+ ""+ ""+ ""+ ""+ "CNY"+ ""+ "123"+ ""+ ""+ ""+ "DEP"+ "20240901012345.000[+8:CST]"+ "123.45"+ ""+ ""+ ""+ ""+ ""+ "")) assert.Nil(t, err) ofxFile, err := reader.read(context) assert.Nil(t, err) assert.NotNil(t, ofxFile) assert.NotNil(t, ofxFile.FileHeader) assert.Equal(t, ofxVersion1, ofxFile.FileHeader.OFXDeclarationVersion) assert.Equal(t, "103", ofxFile.FileHeader.OFXDataVersion) assert.Equal(t, "NONE", ofxFile.FileHeader.Security) assert.Equal(t, "NONE", ofxFile.FileHeader.OldFileUid) assert.Equal(t, "NONE", ofxFile.FileHeader.NewFileUid) assert.NotNil(t, ofxFile.BankMessageResponseV1) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse) assert.Equal(t, "CNY", ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.DefaultCurrency) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.AccountFrom) assert.Equal(t, "123", ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.AccountFrom.AccountId) assert.Equal(t, 1, len(ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions)) assert.Equal(t, ofxDepositTransaction, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions[0].TransactionType) assert.Equal(t, "20240901012345.000[+8:CST]", ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions[0].PostedDate) assert.Equal(t, "123.45", ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions[0].Amount) } func TestCreateNewOFXFileReader_OFX1ParseBankAccountFrom(t *testing.T) { context := core.NewNullContext() reader, err := createNewOFXFileReader(context, []byte( "OFXHEADER:100\n"+ "DATA:OFXSGML\n"+ "VERSION:103\n"+ "SECURITY:NONE\n"+ "ENCODING:USASCII\n"+ "CHARSET:1252\n"+ "COMPRESSION:NONE\n"+ "OLDFILEUID:NONE\n"+ "NEWFILEUID:NONE\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "1234567890\n"+ "2345678901\n"+ "3456789012\n"+ "CHECKING\n"+ "4567890123\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "")) assert.Nil(t, err) ofxFile, err := reader.read(context) assert.Nil(t, err) assert.NotNil(t, ofxFile) assert.NotNil(t, ofxFile.BankMessageResponseV1) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.AccountFrom) account := ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.AccountFrom assert.Equal(t, "1234567890", account.BankId) assert.Equal(t, "2345678901", account.BranchId) assert.Equal(t, "3456789012", account.AccountId) assert.Equal(t, ofxCheckingAccount, account.AccountType) assert.Equal(t, "4567890123", account.AccountKey) } func TestCreateNewOFXFileReader_OFX1ParseCreditCardAccountFrom(t *testing.T) { context := core.NewNullContext() reader, err := createNewOFXFileReader(context, []byte( "OFXHEADER:100\n"+ "DATA:OFXSGML\n"+ "VERSION:103\n"+ "SECURITY:NONE\n"+ "ENCODING:USASCII\n"+ "CHARSET:1252\n"+ "COMPRESSION:NONE\n"+ "OLDFILEUID:NONE\n"+ "NEWFILEUID:NONE\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "3456789012\n"+ "4567890123\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "")) assert.Nil(t, err) ofxFile, err := reader.read(context) assert.Nil(t, err) assert.NotNil(t, ofxFile) assert.NotNil(t, ofxFile.CreditCardMessageResponseV1) assert.NotNil(t, ofxFile.CreditCardMessageResponseV1.StatementTransactionResponse) assert.NotNil(t, ofxFile.CreditCardMessageResponseV1.StatementTransactionResponse.StatementResponse) assert.NotNil(t, ofxFile.CreditCardMessageResponseV1.StatementTransactionResponse.StatementResponse.AccountFrom) account := ofxFile.CreditCardMessageResponseV1.StatementTransactionResponse.StatementResponse.AccountFrom assert.Equal(t, "3456789012", account.AccountId) assert.Equal(t, "4567890123", account.AccountKey) } func TestCreateNewOFXFileReader_OFX1ParseBankTransactionList(t *testing.T) { context := core.NewNullContext() reader, err := createNewOFXFileReader(context, []byte( "OFXHEADER:100\n"+ "DATA:OFXSGML\n"+ "VERSION:103\n"+ "SECURITY:NONE\n"+ "ENCODING:USASCII\n"+ "CHARSET:1252\n"+ "COMPRESSION:NONE\n"+ "OLDFILEUID:NONE\n"+ "NEWFILEUID:NONE\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "20240901012345.000[+8:CST]\n"+ "20240901235959.000[+8:CST]\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "")) assert.Nil(t, err) ofxFile, err := reader.read(context) assert.Nil(t, err) assert.NotNil(t, ofxFile) assert.NotNil(t, ofxFile.BankMessageResponseV1) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList) transactionList := ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList assert.Equal(t, "20240901012345.000[+8:CST]", transactionList.StartDate) assert.Equal(t, "20240901235959.000[+8:CST]", transactionList.EndDate) } func TestCreateNewOFXFileReader_OFX1ParseCreditTransactionList(t *testing.T) { context := core.NewNullContext() reader, err := createNewOFXFileReader(context, []byte( "OFXHEADER:100\n"+ "DATA:OFXSGML\n"+ "VERSION:103\n"+ "SECURITY:NONE\n"+ "ENCODING:USASCII\n"+ "CHARSET:1252\n"+ "COMPRESSION:NONE\n"+ "OLDFILEUID:NONE\n"+ "NEWFILEUID:NONE\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "20240901012345.000[+8:CST]\n"+ "20240901235959.000[+8:CST]\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "")) assert.Nil(t, err) ofxFile, err := reader.read(context) assert.Nil(t, err) assert.NotNil(t, ofxFile) assert.NotNil(t, ofxFile.CreditCardMessageResponseV1) assert.NotNil(t, ofxFile.CreditCardMessageResponseV1.StatementTransactionResponse) assert.NotNil(t, ofxFile.CreditCardMessageResponseV1.StatementTransactionResponse.StatementResponse) assert.NotNil(t, ofxFile.CreditCardMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList) transactionList := ofxFile.CreditCardMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList assert.Equal(t, "20240901012345.000[+8:CST]", transactionList.StartDate) assert.Equal(t, "20240901235959.000[+8:CST]", transactionList.EndDate) } func TestCreateNewOFXFileReader_OFX1ParseTransaction(t *testing.T) { context := core.NewNullContext() reader, err := createNewOFXFileReader(context, []byte( "OFXHEADER:100\n"+ "DATA:OFXSGML\n"+ "VERSION:103\n"+ "SECURITY:NONE\n"+ "ENCODING:USASCII\n"+ "CHARSET:1252\n"+ "COMPRESSION:NONE\n"+ "OLDFILEUID:NONE\n"+ "NEWFILEUID:NONE\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "123\n"+ "\n"+ "\n"+ "\n"+ "1234567890\n"+ "CASH\n"+ "20240901012345.000[+8:CST]\n"+ "123.45\n"+ "Test Name\n"+ "Some Text\n"+ "CNY\n"+ "USD\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "")) assert.Nil(t, err) ofxFile, err := reader.read(context) assert.Nil(t, err) assert.NotNil(t, ofxFile) assert.NotNil(t, ofxFile.BankMessageResponseV1) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList) assert.Equal(t, 1, len(ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions)) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions[0]) transaction := ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions[0] assert.Equal(t, "1234567890", transaction.TransactionId) assert.Equal(t, ofxCashWithdrawalTransaction, transaction.TransactionType) assert.Equal(t, "20240901012345.000[+8:CST]", transaction.PostedDate) assert.Equal(t, "123.45", transaction.Amount) assert.Equal(t, "Test Name", transaction.Name) assert.Equal(t, "Some Text", transaction.Memo) assert.Equal(t, "CNY", transaction.Currency) assert.Equal(t, "USD", transaction.OriginalCurrency) } func TestCreateNewOFXFileReader_OFX1ParseTransactionPayee(t *testing.T) { context := core.NewNullContext() reader, err := createNewOFXFileReader(context, []byte( "OFXHEADER:100\n"+ "DATA:OFXSGML\n"+ "VERSION:103\n"+ "SECURITY:NONE\n"+ "ENCODING:USASCII\n"+ "CHARSET:1252\n"+ "COMPRESSION:NONE\n"+ "OLDFILEUID:NONE\n"+ "NEWFILEUID:NONE\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "123\n"+ "\n"+ "\n"+ "\n"+ "DEP\n"+ "20240901012345.000[+8:CST]\n"+ "123.45\n"+ "\n"+ "Test Name\n"+ "Address 1\n"+ "Address 2\n"+ "Address 3\n"+ "City Name\n"+ "State Name\n"+ "10000000\n"+ "Country Name\n"+ "11111111111\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "")) assert.Nil(t, err) ofxFile, err := reader.read(context) assert.Nil(t, err) assert.NotNil(t, ofxFile) assert.NotNil(t, ofxFile.BankMessageResponseV1) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList) assert.Equal(t, 1, len(ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions)) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions[0]) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions[0].Payee) payee := ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions[0].Payee assert.Equal(t, "Test Name", payee.Name) assert.Equal(t, "Address 1", payee.Address1) assert.Equal(t, "Address 2", payee.Address2) assert.Equal(t, "Address 3", payee.Address3) assert.Equal(t, "City Name", payee.City) assert.Equal(t, "State Name", payee.State) assert.Equal(t, "10000000", payee.PostalCode) assert.Equal(t, "Country Name", payee.Country) assert.Equal(t, "11111111111", payee.Phone) } func TestCreateNewOFXFileReader_OFX1WithEndElement(t *testing.T) { context := core.NewNullContext() reader, err := createNewOFXFileReader(context, []byte( "OFXHEADER:100\n"+ "DATA:OFXSGML\n"+ "VERSION:103\n"+ "SECURITY:NONE\n"+ "ENCODING:USASCII\n"+ "CHARSET:1252\n"+ "COMPRESSION:NONE\n"+ "OLDFILEUID:NONE\n"+ "NEWFILEUID:NONE\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "CNY\n"+ "\n"+ "123\n"+ "\n"+ "\n"+ "\n"+ "DEP\n"+ "20240901012345.000[+8:CST]\n"+ "123.45\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "")) assert.Nil(t, err) ofxFile, err := reader.read(context) assert.Nil(t, err) assert.NotNil(t, ofxFile) assert.NotNil(t, ofxFile.FileHeader) assert.Equal(t, ofxVersion1, ofxFile.FileHeader.OFXDeclarationVersion) assert.Equal(t, "103", ofxFile.FileHeader.OFXDataVersion) assert.Equal(t, "NONE", ofxFile.FileHeader.Security) assert.Equal(t, "NONE", ofxFile.FileHeader.OldFileUid) assert.Equal(t, "NONE", ofxFile.FileHeader.NewFileUid) assert.NotNil(t, ofxFile.BankMessageResponseV1) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse) assert.Equal(t, "CNY", ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.DefaultCurrency) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.AccountFrom) assert.Equal(t, "123", ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.AccountFrom.AccountId) assert.Equal(t, 1, len(ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions)) assert.Equal(t, ofxDepositTransaction, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions[0].TransactionType) assert.Equal(t, "20240901012345.000[+8:CST]", ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions[0].PostedDate) assert.Equal(t, "123.45", ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions[0].Amount) } func TestCreateNewOFXFileReader_OFX1WithBlanklinesInHeader(t *testing.T) { context := core.NewNullContext() reader, err := createNewOFXFileReader(context, []byte( "\n"+ "\n"+ "OFXHEADER:100\n"+ "DATA:OFXSGML\n"+ "VERSION:103\n"+ "SECURITY:NONE\n"+ "ENCODING:USASCII\n"+ "CHARSET:1252\n"+ "COMPRESSION:NONE\n"+ "OLDFILEUID:NONE\n"+ "NEWFILEUID:NONE\n"+ "\n"+ ""+ ""+ ""+ ""+ "CNY"+ ""+ "123"+ ""+ ""+ ""+ "DEP"+ "20240901012345.000[+8:CST]"+ "123.45"+ ""+ ""+ ""+ ""+ ""+ "")) assert.Nil(t, err) ofxFile, err := reader.read(context) assert.Nil(t, err) assert.NotNil(t, ofxFile) assert.NotNil(t, ofxFile.FileHeader) assert.Equal(t, ofxVersion1, ofxFile.FileHeader.OFXDeclarationVersion) assert.Equal(t, "103", ofxFile.FileHeader.OFXDataVersion) assert.Equal(t, "NONE", ofxFile.FileHeader.Security) assert.Equal(t, "NONE", ofxFile.FileHeader.OldFileUid) assert.Equal(t, "NONE", ofxFile.FileHeader.NewFileUid) assert.NotNil(t, ofxFile.BankMessageResponseV1) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse) assert.Equal(t, "CNY", ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.DefaultCurrency) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.AccountFrom) assert.Equal(t, "123", ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.AccountFrom.AccountId) assert.Equal(t, 1, len(ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions)) assert.Equal(t, ofxDepositTransaction, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions[0].TransactionType) assert.Equal(t, "20240901012345.000[+8:CST]", ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions[0].PostedDate) assert.Equal(t, "123.45", ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions[0].Amount) } func TestCreateNewOFXFileReader_OFX1WithoutCharset(t *testing.T) { context := core.NewNullContext() reader, err := createNewOFXFileReader(context, []byte( "OFXHEADER:100\n"+ "DATA:OFXSGML\n"+ "VERSION:103\n"+ "SECURITY:NONE\n"+ "ENCODING:USASCII\n"+ "CHARSET:\n"+ "COMPRESSION:NONE\n"+ "OLDFILEUID:NONE\n"+ "NEWFILEUID:NONE\n"+ "FOO:BAR\n"+ "\n"+ "\n"+ "")) assert.Nil(t, err) ofxFile, err := reader.read(context) assert.NotNil(t, ofxFile) assert.NotNil(t, ofxFile.FileHeader) assert.Equal(t, ofxVersion1, ofxFile.FileHeader.OFXDeclarationVersion) assert.Equal(t, "103", ofxFile.FileHeader.OFXDataVersion) assert.Equal(t, "NONE", ofxFile.FileHeader.Security) assert.Equal(t, "NONE", ofxFile.FileHeader.OldFileUid) assert.Equal(t, "NONE", ofxFile.FileHeader.NewFileUid) } func TestCreateNewOFXFileReader_OFX1WithInvalidHeaderVersion(t *testing.T) { context := core.NewNullContext() _, err := createNewOFXFileReader(context, []byte( "OFXHEADER:200\n"+ "DATA:OFXSGML\n"+ "VERSION:103\n"+ "SECURITY:NONE\n"+ "ENCODING:USASCII\n"+ "CHARSET:1252\n"+ "COMPRESSION:NONE\n"+ "OLDFILEUID:NONE\n"+ "NEWFILEUID:NONE\n"+ "\n"+ "\n"+ "")) assert.EqualError(t, err, errs.ErrInvalidOFXFile.Message) } func TestCreateNewOFXFileReader_OFX1WithInvalidHeader(t *testing.T) { context := core.NewNullContext() _, err := createNewOFXFileReader(context, []byte( "OFXHEADER:100\n"+ "DATA:XML\n"+ "VERSION:103\n"+ "SECURITY:NONE\n"+ "ENCODING:USASCII\n"+ "CHARSET:1252\n"+ "COMPRESSION:NONE\n"+ "OLDFILEUID:NONE\n"+ "NEWFILEUID:NONE\n"+ "\n"+ "\n"+ "")) assert.EqualError(t, err, errs.ErrInvalidOFXFile.Message) } func TestCreateNewOFXFileReader_OFX1WithUnknownHeader(t *testing.T) { context := core.NewNullContext() reader, err := createNewOFXFileReader(context, []byte( "OFXHEADER:100\n"+ "DATA:OFXSGML\n"+ "VERSION:103\n"+ "SECURITY:NONE\n"+ "ENCODING:USASCII\n"+ "CHARSET:1252\n"+ "COMPRESSION:NONE\n"+ "OLDFILEUID:NONE\n"+ "NEWFILEUID:NONE\n"+ "FOO:BAR\n"+ "\n"+ "\n"+ "")) assert.Nil(t, err) ofxFile, err := reader.read(context) assert.NotNil(t, ofxFile) assert.NotNil(t, ofxFile.FileHeader) assert.Equal(t, ofxVersion1, ofxFile.FileHeader.OFXDeclarationVersion) assert.Equal(t, "103", ofxFile.FileHeader.OFXDataVersion) assert.Equal(t, "NONE", ofxFile.FileHeader.Security) assert.Equal(t, "NONE", ofxFile.FileHeader.OldFileUid) assert.Equal(t, "NONE", ofxFile.FileHeader.NewFileUid) } func TestCreateNewOFXFileReader_OFX2(t *testing.T) { context := core.NewNullContext() reader, err := createNewOFXFileReader(context, []byte( "\n"+ "\n"+ "\n"+ " \n"+ " \n"+ " \n"+ " CNY\n"+ " \n"+ " 123\n"+ " \n"+ " \n"+ " \n"+ " DEP\n"+ " 20240901012345.000[+8:CST]\n"+ " 123.45\n"+ " \n"+ " \n"+ " \n"+ " \n"+ " \n"+ "")) assert.Nil(t, err) ofxFile, err := reader.read(context) assert.Nil(t, err) assert.NotNil(t, ofxFile) assert.NotNil(t, ofxFile.FileHeader) assert.Equal(t, ofxVersion2, ofxFile.FileHeader.OFXDeclarationVersion) assert.Equal(t, "211", ofxFile.FileHeader.OFXDataVersion) assert.Equal(t, "NONE", ofxFile.FileHeader.Security) assert.Equal(t, "NONE", ofxFile.FileHeader.OldFileUid) assert.Equal(t, "NONE", ofxFile.FileHeader.NewFileUid) assert.NotNil(t, ofxFile.BankMessageResponseV1) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse) assert.Equal(t, "CNY", ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.DefaultCurrency) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.AccountFrom) assert.Equal(t, "123", ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.AccountFrom.AccountId) assert.Equal(t, 1, len(ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions)) assert.Equal(t, ofxDepositTransaction, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions[0].TransactionType) assert.Equal(t, "20240901012345.000[+8:CST]", ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions[0].PostedDate) assert.Equal(t, "123.45", ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions[0].Amount) } func TestCreateNewOFXFileReader_OFX2WithoutBreakLine(t *testing.T) { context := core.NewNullContext() reader, err := createNewOFXFileReader(context, []byte( ""+ ""+ ""+ " "+ " "+ " "+ " CNY"+ " "+ " 123"+ " "+ " "+ " "+ " DEP"+ " 20240901012345.000[+8:CST]"+ " 123.45"+ " "+ " "+ " "+ " "+ " "+ "")) assert.Nil(t, err) ofxFile, err := reader.read(context) assert.Nil(t, err) assert.NotNil(t, ofxFile) assert.NotNil(t, ofxFile.FileHeader) assert.Equal(t, ofxVersion2, ofxFile.FileHeader.OFXDeclarationVersion) assert.Equal(t, "211", ofxFile.FileHeader.OFXDataVersion) assert.Equal(t, "NONE", ofxFile.FileHeader.Security) assert.Equal(t, "NONE", ofxFile.FileHeader.OldFileUid) assert.Equal(t, "NONE", ofxFile.FileHeader.NewFileUid) assert.NotNil(t, ofxFile.BankMessageResponseV1) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse) assert.Equal(t, "CNY", ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.DefaultCurrency) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.AccountFrom) assert.Equal(t, "123", ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.AccountFrom.AccountId) assert.Equal(t, 1, len(ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions)) assert.Equal(t, ofxDepositTransaction, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions[0].TransactionType) assert.Equal(t, "20240901012345.000[+8:CST]", ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions[0].PostedDate) assert.Equal(t, "123.45", ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions[0].Amount) } func TestCreateNewOFXFileReader_OFX2WithoutOFXHeader(t *testing.T) { context := core.NewNullContext() _, err := createNewOFXFileReader(context, []byte( ""+ ""+ "")) assert.EqualError(t, err, errs.ErrInvalidOFXFile.Message) } func TestCreateNewOFXFileReader_OFX2WithInvalidHeaderVersion(t *testing.T) { context := core.NewNullContext() _, err := createNewOFXFileReader(context, []byte( ""+ ""+ ""+ "")) assert.EqualError(t, err, errs.ErrInvalidOFXFile.Message) } func TestCreateNewOFXFileReader_OFX2WithInvalidHeader(t *testing.T) { context := core.NewNullContext() _, err := createNewOFXFileReader(context, []byte( ""+ ""+ ""+ "")) assert.EqualError(t, err, errs.ErrInvalidOFXFile.Message) _, err = createNewOFXFileReader(context, []byte( ""+ ""+ ""+ "")) assert.EqualError(t, err, errs.ErrInvalidOFXFile.Message) _, err = createNewOFXFileReader(context, []byte( ""+ ""+ ""+ "")) assert.EqualError(t, err, errs.ErrInvalidOFXFile.Message) } func TestCreateNewOFXFileReader_OFX2WithUnknownHeader(t *testing.T) { context := core.NewNullContext() reader, err := createNewOFXFileReader(context, []byte( ""+ ""+ ""+ "")) assert.Nil(t, err) ofxFile, err := reader.read(context) assert.NotNil(t, ofxFile) assert.NotNil(t, ofxFile.FileHeader) assert.Equal(t, ofxVersion2, ofxFile.FileHeader.OFXDeclarationVersion) assert.Equal(t, "211", ofxFile.FileHeader.OFXDataVersion) assert.Equal(t, "NONE", ofxFile.FileHeader.Security) assert.Equal(t, "NONE", ofxFile.FileHeader.OldFileUid) assert.Equal(t, "NONE", ofxFile.FileHeader.NewFileUid) } func TestCreateNewOFXFileReader_OFX2WithSGML(t *testing.T) { context := core.NewNullContext() reader, err := createNewOFXFileReader(context, []byte( "\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "CNY\n"+ "\n"+ "123\n"+ "\n"+ "\n"+ "\n"+ "DEP\n"+ "20240901012345.000[+8:CST]\n"+ "123.45\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "\n"+ "")) assert.Nil(t, err) _, err = reader.read(context) assert.EqualError(t, err, errs.ErrInvalidOFXFile.Message) } func TestCreateNewOFXFileReader_OFX2WithoutAnyHeader(t *testing.T) { context := core.NewNullContext() reader, err := createNewOFXFileReader(context, []byte( "\n"+ " \n"+ " \n"+ " \n"+ " CNY\n"+ " \n"+ " 123\n"+ " \n"+ " \n"+ " \n"+ " DEP\n"+ " 20240901012345.000[+8:CST]\n"+ " 123.45\n"+ " \n"+ " \n"+ " \n"+ " \n"+ " \n"+ "")) assert.Nil(t, err) ofxFile, err := reader.read(context) assert.Nil(t, err) assert.NotNil(t, ofxFile) assert.Nil(t, ofxFile.FileHeader) assert.NotNil(t, ofxFile.BankMessageResponseV1) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse) assert.Equal(t, "CNY", ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.DefaultCurrency) assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.AccountFrom) assert.Equal(t, "123", ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.AccountFrom.AccountId) assert.Equal(t, 1, len(ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions)) assert.Equal(t, ofxDepositTransaction, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions[0].TransactionType) assert.Equal(t, "20240901012345.000[+8:CST]", ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions[0].PostedDate) assert.Equal(t, "123.45", ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions[0].Amount) }