mirror of
https://github.com/mayswind/ezbookkeeping.git
synced 2026-05-20 01:34:24 +08:00
read and check ofx 2.x file header
This commit is contained in:
@@ -1,17 +1,25 @@
|
|||||||
package ofx
|
package ofx
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"golang.org/x/net/html/charset"
|
"golang.org/x/net/html/charset"
|
||||||
|
|
||||||
"github.com/mayswind/ezbookkeeping/pkg/core"
|
"github.com/mayswind/ezbookkeeping/pkg/core"
|
||||||
"github.com/mayswind/ezbookkeeping/pkg/errs"
|
"github.com/mayswind/ezbookkeeping/pkg/errs"
|
||||||
|
"github.com/mayswind/ezbookkeeping/pkg/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var ofx2HeaderPattern = regexp.MustCompile("<\\?OFX( +[A-Z]+=\"[^=]*\")* *\\?>")
|
||||||
|
var ofx2HeaderAttributePattern = regexp.MustCompile(" +([A-Z]+)=\"([^=]*)\"")
|
||||||
|
|
||||||
// ofxFileReader defines the structure of open financial exchange (ofx) file reader
|
// ofxFileReader defines the structure of open financial exchange (ofx) file reader
|
||||||
type ofxFileReader struct {
|
type ofxFileReader struct {
|
||||||
|
fileHeader *ofxFileHeader
|
||||||
xmlDecoder *xml.Decoder
|
xmlDecoder *xml.Decoder
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -25,27 +33,97 @@ func (r *ofxFileReader) read(ctx core.Context) (*ofxFile, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
file.FileHeader = r.fileHeader
|
||||||
|
|
||||||
return file, nil
|
return file, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func createNewOFXFileReader(data []byte) (*ofxFileReader, error) {
|
func createNewOFXFileReader(ctx core.Context, data []byte) (*ofxFileReader, error) {
|
||||||
if len(data) > 5 && data[0] == 0x3C && data[1] == 0x3F && data[2] == 0x78 && data[3] == 0x6D && data[4] == 0x6C { // ofx 2.x starts with <?xml
|
if len(data) > 5 && string(data[0:5]) == "<?xml" { // ofx 2.x starts with <?xml
|
||||||
xmlDecoder := xml.NewDecoder(bytes.NewReader(data))
|
return createNewOFX2FileReader(ctx, data, true)
|
||||||
xmlDecoder.CharsetReader = charset.NewReaderLabel
|
} else if len(data) > 10 && string(data[0:10]) == "OFXHEADER:" { // ofx 1.x starts with OFXHEADER:
|
||||||
|
|
||||||
return &ofxFileReader{
|
|
||||||
xmlDecoder: xmlDecoder,
|
|
||||||
}, nil
|
|
||||||
} else if len(data) > 13 && string(data[0:13]) == "OFXHEADER:100" { // ofx 1.x starts with OFXHEADER:100
|
|
||||||
|
|
||||||
} else if len(data) > 5 && string(data[0:5]) == "<OFX>" { // no ofx header
|
} else if len(data) > 5 && string(data[0:5]) == "<OFX>" { // no ofx header
|
||||||
xmlDecoder := xml.NewDecoder(bytes.NewReader(data))
|
return createNewOFX2FileReader(ctx, data, false)
|
||||||
xmlDecoder.CharsetReader = charset.NewReaderLabel
|
|
||||||
|
|
||||||
return &ofxFileReader{
|
|
||||||
xmlDecoder: xmlDecoder,
|
|
||||||
}, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil, errs.ErrInvalidOFXFile
|
return nil, errs.ErrInvalidOFXFile
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func createNewOFX2FileReader(ctx core.Context, data []byte, withHeader bool) (*ofxFileReader, error) {
|
||||||
|
var fileHeader *ofxFileHeader = nil
|
||||||
|
var err error
|
||||||
|
|
||||||
|
if withHeader {
|
||||||
|
fileHeader, err = readOFX2FileHeader(ctx, data)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if fileHeader.OFXDeclarationVersion != ofxVersion2 {
|
||||||
|
log.Errorf(ctx, "[ofx_data_reader.createNewOFX2FileReader] cannot parse ofx 2.x file header, because declaration version is \"%s\"", fileHeader.OFXDeclarationVersion)
|
||||||
|
return nil, errs.ErrInvalidOFXFile
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
xmlDecoder := xml.NewDecoder(bytes.NewReader(data))
|
||||||
|
xmlDecoder.CharsetReader = charset.NewReaderLabel
|
||||||
|
|
||||||
|
return &ofxFileReader{
|
||||||
|
fileHeader: fileHeader,
|
||||||
|
xmlDecoder: xmlDecoder,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func readOFX2FileHeader(ctx core.Context, data []byte) (fileHeader *ofxFileHeader, err error) {
|
||||||
|
reader := bytes.NewReader(data)
|
||||||
|
scanner := bufio.NewScanner(reader)
|
||||||
|
fileHeader = &ofxFileHeader{}
|
||||||
|
headerLine := ""
|
||||||
|
|
||||||
|
for scanner.Scan() {
|
||||||
|
line := scanner.Text()
|
||||||
|
|
||||||
|
ofxHeaderStartIndex := strings.Index(line, "<?OFX ")
|
||||||
|
|
||||||
|
if ofxHeaderStartIndex >= 0 {
|
||||||
|
headerLine = ofx2HeaderPattern.FindString(line)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if headerLine == "" {
|
||||||
|
log.Errorf(ctx, "[ofx_data_reader.readOFX2FileHeader] cannot find ofx 2.x file header")
|
||||||
|
return nil, errs.ErrInvalidOFXFile
|
||||||
|
}
|
||||||
|
|
||||||
|
headerAttributes := ofx2HeaderAttributePattern.FindAllStringSubmatch(headerLine, -1)
|
||||||
|
|
||||||
|
for _, attributeItems := range headerAttributes {
|
||||||
|
if len(attributeItems) != 3 {
|
||||||
|
log.Warnf(ctx, "[ofx_data_reader.readOFX2FileHeader] cannot parse line in ofx 2.x file header, because item is \"%s\"", attributeItems)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
name := attributeItems[1]
|
||||||
|
value := attributeItems[2]
|
||||||
|
|
||||||
|
if name == "OFXHEADER" {
|
||||||
|
fileHeader.OFXDeclarationVersion = oFXDeclarationVersion(value)
|
||||||
|
} else if name == "VERSION" {
|
||||||
|
fileHeader.OFXDataVersion = value
|
||||||
|
} else if name == "SECURITY" {
|
||||||
|
fileHeader.Security = value
|
||||||
|
} else if name == "OLDFILEUID" {
|
||||||
|
fileHeader.OldFileUid = value
|
||||||
|
} else if name == "NEWFILEUID" {
|
||||||
|
fileHeader.NewFileUid = value
|
||||||
|
} else {
|
||||||
|
log.Warnf(ctx, "[ofx_data_reader.readOFX2FileHeader] cannot parse unknown header line in ofx 2.x file header, because item is \"%s\"", attributeItems)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return fileHeader, nil
|
||||||
|
}
|
||||||
|
|||||||
@@ -6,31 +6,32 @@ import (
|
|||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
|
||||||
"github.com/mayswind/ezbookkeeping/pkg/core"
|
"github.com/mayswind/ezbookkeeping/pkg/core"
|
||||||
|
"github.com/mayswind/ezbookkeeping/pkg/errs"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestCreateNewOFXFileReader_OFX2(t *testing.T) {
|
func TestCreateNewOFXFileReader_OFX2(t *testing.T) {
|
||||||
context := core.NewNullContext()
|
context := core.NewNullContext()
|
||||||
reader, err := createNewOFXFileReader([]byte(
|
reader, err := createNewOFXFileReader(context, []byte(
|
||||||
"<?xml version=\"1.0\" encoding=\"US-ASCII\"?>" +
|
"<?xml version=\"1.0\" encoding=\"US-ASCII\"?>\n"+
|
||||||
"<?OFX OFXHEADER=\"200\" VERSION=\"211\" SECURITY=\"NONE\" OLDFILEUID=\"NONE\" NEWFILEUID=\"NONE\"?>" +
|
"<?OFX OFXHEADER=\"200\" VERSION=\"211\" SECURITY=\"NONE\" OLDFILEUID=\"NONE\" NEWFILEUID=\"NONE\"?>\n"+
|
||||||
"<OFX>" +
|
"<OFX>\n"+
|
||||||
" <BANKMSGSRSV1>" +
|
" <BANKMSGSRSV1>\n"+
|
||||||
" <STMTTRNRS>" +
|
" <STMTTRNRS>\n"+
|
||||||
" <STMTRS>" +
|
" <STMTRS>\n"+
|
||||||
" <CURDEF>CNY</CURDEF>" +
|
" <CURDEF>CNY</CURDEF>\n"+
|
||||||
" <BANKACCTFROM>" +
|
" <BANKACCTFROM>\n"+
|
||||||
" <ACCTID>123</ACCTID>" +
|
" <ACCTID>123</ACCTID>\n"+
|
||||||
" </BANKACCTFROM>" +
|
" </BANKACCTFROM>\n"+
|
||||||
" <BANKTRANLIST>" +
|
" <BANKTRANLIST>\n"+
|
||||||
" <STMTTRN>" +
|
" <STMTTRN>\n"+
|
||||||
" <TRNTYPE>DEP</TRNTYPE>" +
|
" <TRNTYPE>DEP</TRNTYPE>\n"+
|
||||||
" <DTPOSTED>20240901012345.000[+8:CST]</DTPOSTED>" +
|
" <DTPOSTED>20240901012345.000[+8:CST]</DTPOSTED>\n"+
|
||||||
" <TRNAMT>123.45</TRNAMT>" +
|
" <TRNAMT>123.45</TRNAMT>\n"+
|
||||||
" </STMTTRN>" +
|
" </STMTTRN>\n"+
|
||||||
" </BANKTRANLIST>" +
|
" </BANKTRANLIST>\n"+
|
||||||
" </STMTRS>" +
|
" </STMTRS>\n"+
|
||||||
" </STMTTRNRS>" +
|
" </STMTTRNRS>\n"+
|
||||||
" </BANKMSGSRSV1>" +
|
" </BANKMSGSRSV1>\n"+
|
||||||
"</OFX>"))
|
"</OFX>"))
|
||||||
|
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -38,6 +39,14 @@ func TestCreateNewOFXFileReader_OFX2(t *testing.T) {
|
|||||||
ofxFile, err := reader.read(context)
|
ofxFile, err := reader.read(context)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.NotNil(t, ofxFile)
|
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)
|
||||||
assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse)
|
assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse)
|
||||||
assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse)
|
assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse)
|
||||||
@@ -53,27 +62,124 @@ func TestCreateNewOFXFileReader_OFX2(t *testing.T) {
|
|||||||
assert.Equal(t, "123.45", ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse.TransactionList.StatementTransactions[0].Amount)
|
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(
|
||||||
|
"<?xml version=\"1.0\" encoding=\"US-ASCII\"?>"+
|
||||||
|
"<?OFX OFXHEADER=\"200\" VERSION=\"211\" SECURITY=\"NONE\" OLDFILEUID=\"NONE\" NEWFILEUID=\"NONE\"?>"+
|
||||||
|
"<OFX>"+
|
||||||
|
" <BANKMSGSRSV1>"+
|
||||||
|
" <STMTTRNRS>"+
|
||||||
|
" <STMTRS>"+
|
||||||
|
" <CURDEF>CNY</CURDEF>"+
|
||||||
|
" <BANKACCTFROM>"+
|
||||||
|
" <ACCTID>123</ACCTID>"+
|
||||||
|
" </BANKACCTFROM>"+
|
||||||
|
" <BANKTRANLIST>"+
|
||||||
|
" <STMTTRN>"+
|
||||||
|
" <TRNTYPE>DEP</TRNTYPE>"+
|
||||||
|
" <DTPOSTED>20240901012345.000[+8:CST]</DTPOSTED>"+
|
||||||
|
" <TRNAMT>123.45</TRNAMT>"+
|
||||||
|
" </STMTTRN>"+
|
||||||
|
" </BANKTRANLIST>"+
|
||||||
|
" </STMTRS>"+
|
||||||
|
" </STMTTRNRS>"+
|
||||||
|
" </BANKMSGSRSV1>"+
|
||||||
|
"</OFX>"))
|
||||||
|
|
||||||
|
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(
|
||||||
|
"<?xml version=\"1.0\" encoding=\"US-ASCII\"?>"+
|
||||||
|
"<OFX>"+
|
||||||
|
"</OFX>"))
|
||||||
|
|
||||||
|
assert.EqualError(t, err, errs.ErrInvalidOFXFile.Message)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCreateNewOFXFileReader_OFX2WithInvalidHeaderVersion(t *testing.T) {
|
||||||
|
context := core.NewNullContext()
|
||||||
|
_, err := createNewOFXFileReader(context, []byte(
|
||||||
|
"<?xml version=\"1.0\" encoding=\"US-ASCII\"?>"+
|
||||||
|
"<?OFX OFXHEADER=\"100\" VERSION=\"211\" SECURITY=\"NONE\" OLDFILEUID=\"NONE\" NEWFILEUID=\"NONE\"?>"+
|
||||||
|
"<OFX>"+
|
||||||
|
"</OFX>"))
|
||||||
|
|
||||||
|
assert.EqualError(t, err, errs.ErrInvalidOFXFile.Message)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCreateNewOFXFileReader_OFX2WithInvalidHeader(t *testing.T) {
|
||||||
|
context := core.NewNullContext()
|
||||||
|
_, err := createNewOFXFileReader(context, []byte(
|
||||||
|
"<?xml version=\"1.0\" encoding=\"US-ASCII\"?>"+
|
||||||
|
"<?OFX?>"+
|
||||||
|
"<OFX>"+
|
||||||
|
"</OFX>"))
|
||||||
|
|
||||||
|
_, err = createNewOFXFileReader(context, []byte(
|
||||||
|
"<?xml version=\"1.0\" encoding=\"US-ASCII\"?>"+
|
||||||
|
"<?OFX OFXHEADER=100?>"+
|
||||||
|
"<OFX>"+
|
||||||
|
"</OFX>"))
|
||||||
|
|
||||||
|
assert.EqualError(t, err, errs.ErrInvalidOFXFile.Message)
|
||||||
|
_, err = createNewOFXFileReader(context, []byte(
|
||||||
|
"<?xml version=\"1.0\" encoding=\"US-ASCII\"?>"+
|
||||||
|
"<?OFX OFXHEADER=\"100\" VERSION=\"211\" SECURITY=\"NONE\" OLDFILEUID=\"NONE\" NEWFILEUID=\"NONE\" test=\"\"?>"+
|
||||||
|
"<OFX>"+
|
||||||
|
"</OFX>"))
|
||||||
|
assert.EqualError(t, err, errs.ErrInvalidOFXFile.Message)
|
||||||
|
}
|
||||||
|
|
||||||
func TestCreateNewOFXFileReader_OFX2WithoutAnyHeader(t *testing.T) {
|
func TestCreateNewOFXFileReader_OFX2WithoutAnyHeader(t *testing.T) {
|
||||||
context := core.NewNullContext()
|
context := core.NewNullContext()
|
||||||
reader, err := createNewOFXFileReader([]byte(
|
reader, err := createNewOFXFileReader(context, []byte(
|
||||||
"<OFX>" +
|
"<OFX>\n"+
|
||||||
" <BANKMSGSRSV1>" +
|
" <BANKMSGSRSV1>\n"+
|
||||||
" <STMTTRNRS>" +
|
" <STMTTRNRS>\n"+
|
||||||
" <STMTRS>" +
|
" <STMTRS>\n"+
|
||||||
" <CURDEF>CNY</CURDEF>" +
|
" <CURDEF>CNY</CURDEF>\n"+
|
||||||
" <BANKACCTFROM>" +
|
" <BANKACCTFROM>\n"+
|
||||||
" <ACCTID>123</ACCTID>" +
|
" <ACCTID>123</ACCTID>\n"+
|
||||||
" </BANKACCTFROM>" +
|
" </BANKACCTFROM>\n"+
|
||||||
" <BANKTRANLIST>" +
|
" <BANKTRANLIST>\n"+
|
||||||
" <STMTTRN>" +
|
" <STMTTRN>\n"+
|
||||||
" <TRNTYPE>DEP</TRNTYPE>" +
|
" <TRNTYPE>DEP</TRNTYPE>\n"+
|
||||||
" <DTPOSTED>20240901012345.000[+8:CST]</DTPOSTED>" +
|
" <DTPOSTED>20240901012345.000[+8:CST]</DTPOSTED>\n"+
|
||||||
" <TRNAMT>123.45</TRNAMT>" +
|
" <TRNAMT>123.45</TRNAMT>\n"+
|
||||||
" </STMTTRN>" +
|
" </STMTTRN>\n"+
|
||||||
" </BANKTRANLIST>" +
|
" </BANKTRANLIST>\n"+
|
||||||
" </STMTRS>" +
|
" </STMTRS>\n"+
|
||||||
" </STMTTRNRS>" +
|
" </STMTTRNRS>\n"+
|
||||||
" </BANKMSGSRSV1>" +
|
" </BANKMSGSRSV1>\n"+
|
||||||
"</OFX>"))
|
"</OFX>"))
|
||||||
|
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -81,6 +187,8 @@ func TestCreateNewOFXFileReader_OFX2WithoutAnyHeader(t *testing.T) {
|
|||||||
ofxFile, err := reader.read(context)
|
ofxFile, err := reader.read(context)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.NotNil(t, ofxFile)
|
assert.NotNil(t, ofxFile)
|
||||||
|
assert.Nil(t, ofxFile.FileHeader)
|
||||||
|
|
||||||
assert.NotNil(t, ofxFile.BankMessageResponseV1)
|
assert.NotNil(t, ofxFile.BankMessageResponseV1)
|
||||||
assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse)
|
assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse)
|
||||||
assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse)
|
assert.NotNil(t, ofxFile.BankMessageResponseV1.StatementTransactionResponse.StatementResponse)
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ var (
|
|||||||
|
|
||||||
// ParseImportedData returns the imported data by parsing the open financial exchange (ofx) file transaction data
|
// ParseImportedData returns the imported data by parsing the open financial exchange (ofx) file transaction data
|
||||||
func (c *ofxTransactionDataImporter) ParseImportedData(ctx core.Context, user *models.User, data []byte, defaultTimezoneOffset int16, accountMap map[string]*models.Account, expenseCategoryMap map[string]*models.TransactionCategory, incomeCategoryMap map[string]*models.TransactionCategory, transferCategoryMap map[string]*models.TransactionCategory, tagMap map[string]*models.TransactionTag) (models.ImportedTransactionSlice, []*models.Account, []*models.TransactionCategory, []*models.TransactionCategory, []*models.TransactionCategory, []*models.TransactionTag, error) {
|
func (c *ofxTransactionDataImporter) ParseImportedData(ctx core.Context, user *models.User, data []byte, defaultTimezoneOffset int16, accountMap map[string]*models.Account, expenseCategoryMap map[string]*models.TransactionCategory, incomeCategoryMap map[string]*models.TransactionCategory, transferCategoryMap map[string]*models.TransactionCategory, tagMap map[string]*models.TransactionTag) (models.ImportedTransactionSlice, []*models.Account, []*models.TransactionCategory, []*models.TransactionCategory, []*models.TransactionCategory, []*models.TransactionTag, error) {
|
||||||
ofxDataReader, err := createNewOFXFileReader(data)
|
ofxDataReader, err := createNewOFXFileReader(ctx, data)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, nil, nil, nil, err
|
return nil, nil, nil, nil, nil, nil, err
|
||||||
|
|||||||
@@ -21,61 +21,61 @@ func TestOFXTransactionDataFileParseImportedData_MinimumValidData(t *testing.T)
|
|||||||
}
|
}
|
||||||
|
|
||||||
allNewTransactions, allNewAccounts, allNewSubExpenseCategories, allNewSubIncomeCategories, allNewSubTransferCategories, allNewTags, err := converter.ParseImportedData(context, user, []byte(
|
allNewTransactions, allNewAccounts, allNewSubExpenseCategories, allNewSubIncomeCategories, allNewSubTransferCategories, allNewTags, err := converter.ParseImportedData(context, user, []byte(
|
||||||
"<OFX>"+
|
"<OFX>\n"+
|
||||||
" <BANKMSGSRSV1>"+
|
" <BANKMSGSRSV1>\n"+
|
||||||
" <STMTTRNRS>"+
|
" <STMTTRNRS>\n"+
|
||||||
" <STMTRS>"+
|
" <STMTRS>\n"+
|
||||||
" <CURDEF>CNY</CURDEF>"+
|
" <CURDEF>CNY</CURDEF>\n"+
|
||||||
" <BANKACCTFROM>"+
|
" <BANKACCTFROM>\n"+
|
||||||
" <ACCTID>123</ACCTID>"+
|
" <ACCTID>123</ACCTID>\n"+
|
||||||
" </BANKACCTFROM>"+
|
" </BANKACCTFROM>\n"+
|
||||||
" <BANKTRANLIST>"+
|
" <BANKTRANLIST>\n"+
|
||||||
" <STMTTRN>"+
|
" <STMTTRN>\n"+
|
||||||
" <TRNTYPE>DEP</TRNTYPE>"+
|
" <TRNTYPE>DEP</TRNTYPE>\n"+
|
||||||
" <DTPOSTED>20240901012345.000[+8:CST]</DTPOSTED>"+
|
" <DTPOSTED>20240901012345.000[+8:CST]</DTPOSTED>\n"+
|
||||||
" <TRNAMT>123.45</TRNAMT>"+
|
" <TRNAMT>123.45</TRNAMT>\n"+
|
||||||
" </STMTTRN>"+
|
" </STMTTRN>\n"+
|
||||||
" <STMTTRN>"+
|
" <STMTTRN>\n"+
|
||||||
" <TRNTYPE>CHECK</TRNTYPE>"+
|
" <TRNTYPE>CHECK</TRNTYPE>\n"+
|
||||||
" <DTPOSTED>20240901123456.000[+8:CST]</DTPOSTED>"+
|
" <DTPOSTED>20240901123456.000[+8:CST]</DTPOSTED>\n"+
|
||||||
" <TRNAMT>-0.12</TRNAMT>"+
|
" <TRNAMT>-0.12</TRNAMT>\n"+
|
||||||
" </STMTTRN>"+
|
" </STMTTRN>\n"+
|
||||||
" <STMTTRN>"+
|
" <STMTTRN>\n"+
|
||||||
" <TRNTYPE>XFER</TRNTYPE>"+
|
" <TRNTYPE>XFER</TRNTYPE>\n"+
|
||||||
" <DTPOSTED>20240901225959.000[+8:CST]</DTPOSTED>"+
|
" <DTPOSTED>20240901225959.000[+8:CST]</DTPOSTED>\n"+
|
||||||
" <TRNAMT>-1.00</TRNAMT>"+
|
" <TRNAMT>-1.00</TRNAMT>\n"+
|
||||||
" </STMTTRN>"+
|
" </STMTTRN>\n"+
|
||||||
" <STMTTRN>"+
|
" <STMTTRN>\n"+
|
||||||
" <TRNTYPE>XFER</TRNTYPE>"+
|
" <TRNTYPE>XFER</TRNTYPE>\n"+
|
||||||
" <DTPOSTED>20240901235959.000[+8:CST]</DTPOSTED>"+
|
" <DTPOSTED>20240901235959.000[+8:CST]</DTPOSTED>\n"+
|
||||||
" <TRNAMT>2.00</TRNAMT>"+
|
" <TRNAMT>2.00</TRNAMT>\n"+
|
||||||
" </STMTTRN>"+
|
" </STMTTRN>\n"+
|
||||||
" </BANKTRANLIST>"+
|
" </BANKTRANLIST>\n"+
|
||||||
" </STMTRS>"+
|
" </STMTRS>\n"+
|
||||||
" </STMTTRNRS>"+
|
" </STMTTRNRS>\n"+
|
||||||
" </BANKMSGSRSV1>"+
|
" </BANKMSGSRSV1>\n"+
|
||||||
" <CREDITCARDMSGSRSV1>"+
|
" <CREDITCARDMSGSRSV1>\n"+
|
||||||
" <CCSTMTTRNRS>"+
|
" <CCSTMTTRNRS>\n"+
|
||||||
" <CCSTMTRS>"+
|
" <CCSTMTRS>\n"+
|
||||||
" <CURDEF>USD</CURDEF>"+
|
" <CURDEF>USD</CURDEF>\n"+
|
||||||
" <CCACCTFROM>"+
|
" <CCACCTFROM>\n"+
|
||||||
" <ACCTID>456</ACCTID>"+
|
" <ACCTID>456</ACCTID>\n"+
|
||||||
" </CCACCTFROM>"+
|
" </CCACCTFROM>\n"+
|
||||||
" <BANKTRANLIST>"+
|
" <BANKTRANLIST>\n"+
|
||||||
" <STMTTRN>"+
|
" <STMTTRN>\n"+
|
||||||
" <TRNTYPE>ATM</TRNTYPE>"+
|
" <TRNTYPE>ATM</TRNTYPE>\n"+
|
||||||
" <DTPOSTED>20240902012345.000[+8:CST]</DTPOSTED>"+
|
" <DTPOSTED>20240902012345.000[+8:CST]</DTPOSTED>\n"+
|
||||||
" <TRNAMT>1.23</TRNAMT>"+
|
" <TRNAMT>1.23</TRNAMT>\n"+
|
||||||
" </STMTTRN>"+
|
" </STMTTRN>\n"+
|
||||||
" <STMTTRN>"+
|
" <STMTTRN>\n"+
|
||||||
" <TRNTYPE>POS</TRNTYPE>"+
|
" <TRNTYPE>POS</TRNTYPE>\n"+
|
||||||
" <DTPOSTED>20240902123456.000[+8:CST]</DTPOSTED>"+
|
" <DTPOSTED>20240902123456.000[+8:CST]</DTPOSTED>\n"+
|
||||||
" <TRNAMT>-0.01</TRNAMT>"+
|
" <TRNAMT>-0.01</TRNAMT>\n"+
|
||||||
" </STMTTRN>"+
|
" </STMTTRN>\n"+
|
||||||
" </BANKTRANLIST>"+
|
" </BANKTRANLIST>\n"+
|
||||||
" </CCSTMTRS>"+
|
" </CCSTMTRS>\n"+
|
||||||
" </CCSTMTTRNRS>"+
|
" </CCSTMTTRNRS>\n"+
|
||||||
" </CREDITCARDMSGSRSV1>"+
|
" </CREDITCARDMSGSRSV1>\n"+
|
||||||
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
||||||
|
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -167,47 +167,47 @@ func TestOFXTransactionDataFileParseImportedData_ParseAccountTo(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
allNewTransactions, allNewAccounts, _, _, _, _, err := converter.ParseImportedData(context, user, []byte(
|
allNewTransactions, allNewAccounts, _, _, _, _, err := converter.ParseImportedData(context, user, []byte(
|
||||||
"<OFX>"+
|
"<OFX>\n"+
|
||||||
" <BANKMSGSRSV1>"+
|
" <BANKMSGSRSV1>\n"+
|
||||||
" <STMTTRNRS>"+
|
" <STMTTRNRS>\n"+
|
||||||
" <STMTRS>"+
|
" <STMTRS>\n"+
|
||||||
" <CURDEF>CNY</CURDEF>"+
|
" <CURDEF>CNY</CURDEF>\n"+
|
||||||
" <BANKACCTFROM>"+
|
" <BANKACCTFROM>\n"+
|
||||||
" <ACCTID>123</ACCTID>"+
|
" <ACCTID>123</ACCTID>\n"+
|
||||||
" </BANKACCTFROM>"+
|
" </BANKACCTFROM>\n"+
|
||||||
" <BANKTRANLIST>"+
|
" <BANKTRANLIST>\n"+
|
||||||
" <STMTTRN>"+
|
" <STMTTRN>\n"+
|
||||||
" <TRNTYPE>XFER</TRNTYPE>"+
|
" <TRNTYPE>XFER</TRNTYPE>\n"+
|
||||||
" <DTPOSTED>20240901012345.000[+8:CST]</DTPOSTED>"+
|
" <DTPOSTED>20240901012345.000[+8:CST]</DTPOSTED>\n"+
|
||||||
" <TRNAMT>-123.45</TRNAMT>"+
|
" <TRNAMT>-123.45</TRNAMT>\n"+
|
||||||
" <BANKACCTTO>"+
|
" <BANKACCTTO>\n"+
|
||||||
" <ACCTID>456</ACCTID>"+
|
" <ACCTID>456</ACCTID>\n"+
|
||||||
" </BANKACCTTO>"+
|
" </BANKACCTTO>\n"+
|
||||||
" </STMTTRN>"+
|
" </STMTTRN>\n"+
|
||||||
" </BANKTRANLIST>"+
|
" </BANKTRANLIST>\n"+
|
||||||
" </STMTRS>"+
|
" </STMTRS>\n"+
|
||||||
" </STMTTRNRS>"+
|
" </STMTTRNRS>\n"+
|
||||||
" </BANKMSGSRSV1>"+
|
" </BANKMSGSRSV1>\n"+
|
||||||
" <CREDITCARDMSGSRSV1>"+
|
" <CREDITCARDMSGSRSV1>\n"+
|
||||||
" <CCSTMTTRNRS>"+
|
" <CCSTMTTRNRS>\n"+
|
||||||
" <CCSTMTRS>"+
|
" <CCSTMTRS>\n"+
|
||||||
" <CURDEF>CNY</CURDEF>"+
|
" <CURDEF>CNY</CURDEF>\n"+
|
||||||
" <CCACCTFROM>"+
|
" <CCACCTFROM>\n"+
|
||||||
" <ACCTID>456</ACCTID>"+
|
" <ACCTID>456</ACCTID>\n"+
|
||||||
" </CCACCTFROM>"+
|
" </CCACCTFROM>\n"+
|
||||||
" <BANKTRANLIST>"+
|
" <BANKTRANLIST>\n"+
|
||||||
" <STMTTRN>"+
|
" <STMTTRN>\n"+
|
||||||
" <TRNTYPE>XFER</TRNTYPE>"+
|
" <TRNTYPE>XFER</TRNTYPE>\n"+
|
||||||
" <DTPOSTED>20240902012345.000[+8:CST]</DTPOSTED>"+
|
" <DTPOSTED>20240902012345.000[+8:CST]</DTPOSTED>\n"+
|
||||||
" <TRNAMT>-1.23</TRNAMT>"+
|
" <TRNAMT>-1.23</TRNAMT>\n"+
|
||||||
" <CCACCTTO>"+
|
" <CCACCTTO>\n"+
|
||||||
" <ACCTID>789</ACCTID>"+
|
" <ACCTID>789</ACCTID>\n"+
|
||||||
" </CCACCTTO>"+
|
" </CCACCTTO>\n"+
|
||||||
" </STMTTRN>"+
|
" </STMTTRN>\n"+
|
||||||
" </BANKTRANLIST>"+
|
" </BANKTRANLIST>\n"+
|
||||||
" </CCSTMTRS>"+
|
" </CCSTMTRS>\n"+
|
||||||
" </CCSTMTTRNRS>"+
|
" </CCSTMTTRNRS>\n"+
|
||||||
" </CREDITCARDMSGSRSV1>"+
|
" </CREDITCARDMSGSRSV1>\n"+
|
||||||
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
||||||
|
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -250,49 +250,49 @@ func TestOFXTransactionDataFileParseImportedData_ParseValidTransactionTime(t *te
|
|||||||
}
|
}
|
||||||
|
|
||||||
allNewTransactions, _, _, _, _, _, err := converter.ParseImportedData(context, user, []byte(
|
allNewTransactions, _, _, _, _, _, err := converter.ParseImportedData(context, user, []byte(
|
||||||
"<OFX>"+
|
"<OFX>\n"+
|
||||||
" <BANKMSGSRSV1>"+
|
" <BANKMSGSRSV1>\n"+
|
||||||
" <STMTTRNRS>"+
|
" <STMTTRNRS>\n"+
|
||||||
" <STMTRS>"+
|
" <STMTRS>\n"+
|
||||||
" <CURDEF>CNY</CURDEF>"+
|
" <CURDEF>CNY</CURDEF>\n"+
|
||||||
" <BANKACCTFROM>"+
|
" <BANKACCTFROM>\n"+
|
||||||
" <ACCTID>123</ACCTID>"+
|
" <ACCTID>123</ACCTID>\n"+
|
||||||
" </BANKACCTFROM>"+
|
" </BANKACCTFROM>\n"+
|
||||||
" <BANKTRANLIST>"+
|
" <BANKTRANLIST>\n"+
|
||||||
" <STMTTRN>"+
|
" <STMTTRN>\n"+
|
||||||
" <TRNTYPE>DEP</TRNTYPE>"+
|
" <TRNTYPE>DEP</TRNTYPE>\n"+
|
||||||
" <DTPOSTED>20240901</DTPOSTED>"+
|
" <DTPOSTED>20240901</DTPOSTED>\n"+
|
||||||
" <TRNAMT>123.45</TRNAMT>"+
|
" <TRNAMT>123.45</TRNAMT>\n"+
|
||||||
" </STMTTRN>"+
|
" </STMTTRN>\n"+
|
||||||
" <STMTTRN>"+
|
" <STMTTRN>\n"+
|
||||||
" <TRNTYPE>DEP</TRNTYPE>"+
|
" <TRNTYPE>DEP</TRNTYPE>\n"+
|
||||||
" <DTPOSTED>20240901123456</DTPOSTED>"+
|
" <DTPOSTED>20240901123456</DTPOSTED>\n"+
|
||||||
" <TRNAMT>123.45</TRNAMT>"+
|
" <TRNAMT>123.45</TRNAMT>\n"+
|
||||||
" </STMTTRN>"+
|
" </STMTTRN>\n"+
|
||||||
" <STMTTRN>"+
|
" <STMTTRN>\n"+
|
||||||
" <TRNTYPE>DEP</TRNTYPE>"+
|
" <TRNTYPE>DEP</TRNTYPE>\n"+
|
||||||
" <DTPOSTED>20240901123456.789</DTPOSTED>"+
|
" <DTPOSTED>20240901123456.789</DTPOSTED>\n"+
|
||||||
" <TRNAMT>123.45</TRNAMT>"+
|
" <TRNAMT>123.45</TRNAMT>\n"+
|
||||||
" </STMTTRN>"+
|
" </STMTTRN>\n"+
|
||||||
" <STMTTRN>"+
|
" <STMTTRN>\n"+
|
||||||
" <TRNTYPE>DEP</TRNTYPE>"+
|
" <TRNTYPE>DEP</TRNTYPE>\n"+
|
||||||
" <DTPOSTED>20240901125959.000[-3]</DTPOSTED>"+
|
" <DTPOSTED>20240901125959.000[-3]</DTPOSTED>\n"+
|
||||||
" <TRNAMT>123.45</TRNAMT>"+
|
" <TRNAMT>123.45</TRNAMT>\n"+
|
||||||
" </STMTTRN>"+
|
" </STMTTRN>\n"+
|
||||||
" <STMTTRN>"+
|
" <STMTTRN>\n"+
|
||||||
" <TRNTYPE>DEP</TRNTYPE>"+
|
" <TRNTYPE>DEP</TRNTYPE>\n"+
|
||||||
" <DTPOSTED>20240901122959.000[-3.5]</DTPOSTED>"+
|
" <DTPOSTED>20240901122959.000[-3.5]</DTPOSTED>\n"+
|
||||||
" <TRNAMT>123.45</TRNAMT>"+
|
" <TRNAMT>123.45</TRNAMT>\n"+
|
||||||
" </STMTTRN>"+
|
" </STMTTRN>\n"+
|
||||||
" <STMTTRN>"+
|
" <STMTTRN>\n"+
|
||||||
" <TRNTYPE>DEP</TRNTYPE>"+
|
" <TRNTYPE>DEP</TRNTYPE>\n"+
|
||||||
" <DTPOSTED>20240902030405.000[0]</DTPOSTED>"+
|
" <DTPOSTED>20240902030405.000[0]</DTPOSTED>\n"+
|
||||||
" <TRNAMT>123.45</TRNAMT>"+
|
" <TRNAMT>123.45</TRNAMT>\n"+
|
||||||
" </STMTTRN>"+
|
" </STMTTRN>\n"+
|
||||||
" </BANKTRANLIST>"+
|
" </BANKTRANLIST>\n"+
|
||||||
" </STMTRS>"+
|
" </STMTRS>\n"+
|
||||||
" </STMTTRNRS>"+
|
" </STMTTRNRS>\n"+
|
||||||
" </BANKMSGSRSV1>"+
|
" </BANKMSGSRSV1>\n"+
|
||||||
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
||||||
|
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -317,90 +317,90 @@ func TestOFXTransactionDataFileParseImportedData_ParseInvalidTransactionTime(t *
|
|||||||
}
|
}
|
||||||
|
|
||||||
_, _, _, _, _, _, err := converter.ParseImportedData(context, user, []byte(
|
_, _, _, _, _, _, err := converter.ParseImportedData(context, user, []byte(
|
||||||
"<OFX>"+
|
"<OFX>\n"+
|
||||||
" <BANKMSGSRSV1>"+
|
" <BANKMSGSRSV1>\n"+
|
||||||
" <STMTTRNRS>"+
|
" <STMTTRNRS>\n"+
|
||||||
" <STMTRS>"+
|
" <STMTRS>\n"+
|
||||||
" <CURDEF>CNY</CURDEF>"+
|
" <CURDEF>CNY</CURDEF>\n"+
|
||||||
" <BANKACCTFROM>"+
|
" <BANKACCTFROM>\n"+
|
||||||
" <ACCTID>123</ACCTID>"+
|
" <ACCTID>123</ACCTID>\n"+
|
||||||
" </BANKACCTFROM>"+
|
" </BANKACCTFROM>\n"+
|
||||||
" <BANKTRANLIST>"+
|
" <BANKTRANLIST>\n"+
|
||||||
" <STMTTRN>"+
|
" <STMTTRN>\n"+
|
||||||
" <TRNTYPE>DEP</TRNTYPE>"+
|
" <TRNTYPE>DEP</TRNTYPE>\n"+
|
||||||
" <DTPOSTED>2024</DTPOSTED>"+
|
" <DTPOSTED>2024</DTPOSTED>\n"+
|
||||||
" <TRNAMT>123.45</TRNAMT>"+
|
" <TRNAMT>123.45</TRNAMT>\n"+
|
||||||
" </STMTTRN>"+
|
" </STMTTRN>\n"+
|
||||||
" </BANKTRANLIST>"+
|
" </BANKTRANLIST>\n"+
|
||||||
" </STMTRS>"+
|
" </STMTRS>\n"+
|
||||||
" </STMTTRNRS>"+
|
" </STMTTRNRS>\n"+
|
||||||
" </BANKMSGSRSV1>"+
|
" </BANKMSGSRSV1>\n"+
|
||||||
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
||||||
assert.EqualError(t, err, errs.ErrTransactionTimeInvalid.Message)
|
assert.EqualError(t, err, errs.ErrTransactionTimeInvalid.Message)
|
||||||
|
|
||||||
_, _, _, _, _, _, err = converter.ParseImportedData(context, user, []byte(
|
_, _, _, _, _, _, err = converter.ParseImportedData(context, user, []byte(
|
||||||
"<OFX>"+
|
"<OFX>\n"+
|
||||||
" <BANKMSGSRSV1>"+
|
" <BANKMSGSRSV1>\n"+
|
||||||
" <STMTTRNRS>"+
|
" <STMTTRNRS>\n"+
|
||||||
" <STMTRS>"+
|
" <STMTRS>\n"+
|
||||||
" <CURDEF>CNY</CURDEF>"+
|
" <CURDEF>CNY</CURDEF>\n"+
|
||||||
" <BANKACCTFROM>"+
|
" <BANKACCTFROM>\n"+
|
||||||
" <ACCTID>123</ACCTID>"+
|
" <ACCTID>123</ACCTID>\n"+
|
||||||
" </BANKACCTFROM>"+
|
" </BANKACCTFROM>\n"+
|
||||||
" <BANKTRANLIST>"+
|
" <BANKTRANLIST>\n"+
|
||||||
" <STMTTRN>"+
|
" <STMTTRN>\n"+
|
||||||
" <TRNTYPE>DEP</TRNTYPE>"+
|
" <TRNTYPE>DEP</TRNTYPE>\n"+
|
||||||
" <DTPOSTED>2024-09-01</DTPOSTED>"+
|
" <DTPOSTED>2024-09-01</DTPOSTED>\n"+
|
||||||
" <TRNAMT>123.45</TRNAMT>"+
|
" <TRNAMT>123.45</TRNAMT>\n"+
|
||||||
" </STMTTRN>"+
|
" </STMTTRN>\n"+
|
||||||
" </BANKTRANLIST>"+
|
" </BANKTRANLIST>\n"+
|
||||||
" </STMTRS>"+
|
" </STMTRS>\n"+
|
||||||
" </STMTTRNRS>"+
|
" </STMTTRNRS>\n"+
|
||||||
" </BANKMSGSRSV1>"+
|
" </BANKMSGSRSV1>\n"+
|
||||||
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
||||||
assert.EqualError(t, err, errs.ErrTransactionTimeInvalid.Message)
|
assert.EqualError(t, err, errs.ErrTransactionTimeInvalid.Message)
|
||||||
|
|
||||||
_, _, _, _, _, _, err = converter.ParseImportedData(context, user, []byte(
|
_, _, _, _, _, _, err = converter.ParseImportedData(context, user, []byte(
|
||||||
"<OFX>"+
|
"<OFX>\n"+
|
||||||
" <BANKMSGSRSV1>"+
|
" <BANKMSGSRSV1>\n"+
|
||||||
" <STMTTRNRS>"+
|
" <STMTTRNRS>\n"+
|
||||||
" <STMTRS>"+
|
" <STMTRS>\n"+
|
||||||
" <CURDEF>CNY</CURDEF>"+
|
" <CURDEF>CNY</CURDEF>\n"+
|
||||||
" <BANKACCTFROM>"+
|
" <BANKACCTFROM>\n"+
|
||||||
" <ACCTID>123</ACCTID>"+
|
" <ACCTID>123</ACCTID>\n"+
|
||||||
" </BANKACCTFROM>"+
|
" </BANKACCTFROM>\n"+
|
||||||
" <BANKTRANLIST>"+
|
" <BANKTRANLIST>\n"+
|
||||||
" <STMTTRN>"+
|
" <STMTTRN>\n"+
|
||||||
" <TRNTYPE>DEP</TRNTYPE>"+
|
" <TRNTYPE>DEP</TRNTYPE>\n"+
|
||||||
" <DTPOSTED>202491</DTPOSTED>"+
|
" <DTPOSTED>202491</DTPOSTED>\n"+
|
||||||
" <TRNAMT>123.45</TRNAMT>"+
|
" <TRNAMT>123.45</TRNAMT>\n"+
|
||||||
" </STMTTRN>"+
|
" </STMTTRN>\n"+
|
||||||
" </BANKTRANLIST>"+
|
" </BANKTRANLIST>\n"+
|
||||||
" </STMTRS>"+
|
" </STMTRS>\n"+
|
||||||
" </STMTTRNRS>"+
|
" </STMTTRNRS>\n"+
|
||||||
" </BANKMSGSRSV1>"+
|
" </BANKMSGSRSV1>\n"+
|
||||||
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
||||||
assert.EqualError(t, err, errs.ErrTransactionTimeInvalid.Message)
|
assert.EqualError(t, err, errs.ErrTransactionTimeInvalid.Message)
|
||||||
|
|
||||||
_, _, _, _, _, _, err = converter.ParseImportedData(context, user, []byte(
|
_, _, _, _, _, _, err = converter.ParseImportedData(context, user, []byte(
|
||||||
"<OFX>"+
|
"<OFX>\n"+
|
||||||
" <BANKMSGSRSV1>"+
|
" <BANKMSGSRSV1>\n"+
|
||||||
" <STMTTRNRS>"+
|
" <STMTTRNRS>\n"+
|
||||||
" <STMTRS>"+
|
" <STMTRS>\n"+
|
||||||
" <CURDEF>CNY</CURDEF>"+
|
" <CURDEF>CNY</CURDEF>\n"+
|
||||||
" <BANKACCTFROM>"+
|
" <BANKACCTFROM>\n"+
|
||||||
" <ACCTID>123</ACCTID>"+
|
" <ACCTID>123</ACCTID>\n"+
|
||||||
" </BANKACCTFROM>"+
|
" </BANKACCTFROM>\n"+
|
||||||
" <BANKTRANLIST>"+
|
" <BANKTRANLIST>\n"+
|
||||||
" <STMTTRN>"+
|
" <STMTTRN>\n"+
|
||||||
" <TRNTYPE>DEP</TRNTYPE>"+
|
" <TRNTYPE>DEP</TRNTYPE>\n"+
|
||||||
" <DTPOSTED>20240901 12:34:56</DTPOSTED>"+
|
" <DTPOSTED>20240901 12:34:56</DTPOSTED>\n"+
|
||||||
" <TRNAMT>123.45</TRNAMT>"+
|
" <TRNAMT>123.45</TRNAMT>\n"+
|
||||||
" </STMTTRN>"+
|
" </STMTTRN>\n"+
|
||||||
" </BANKTRANLIST>"+
|
" </BANKTRANLIST>\n"+
|
||||||
" </STMTRS>"+
|
" </STMTRS>\n"+
|
||||||
" </STMTTRNRS>"+
|
" </STMTTRNRS>\n"+
|
||||||
" </BANKMSGSRSV1>"+
|
" </BANKMSGSRSV1>\n"+
|
||||||
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
||||||
assert.EqualError(t, err, errs.ErrTransactionTimeInvalid.Message)
|
assert.EqualError(t, err, errs.ErrTransactionTimeInvalid.Message)
|
||||||
}
|
}
|
||||||
@@ -415,24 +415,24 @@ func TestOFXTransactionDataFileParseImportedData_ParseAmount_CommaAsDecimalPoint
|
|||||||
}
|
}
|
||||||
|
|
||||||
allNewTransactions, _, _, _, _, _, err := converter.ParseImportedData(context, user, []byte(
|
allNewTransactions, _, _, _, _, _, err := converter.ParseImportedData(context, user, []byte(
|
||||||
"<OFX>"+
|
"<OFX>\n"+
|
||||||
" <BANKMSGSRSV1>"+
|
" <BANKMSGSRSV1>\n"+
|
||||||
" <STMTTRNRS>"+
|
" <STMTTRNRS>\n"+
|
||||||
" <STMTRS>"+
|
" <STMTRS>\n"+
|
||||||
" <CURDEF>CNY</CURDEF>"+
|
" <CURDEF>CNY</CURDEF>\n"+
|
||||||
" <BANKACCTFROM>"+
|
" <BANKACCTFROM>\n"+
|
||||||
" <ACCTID>123</ACCTID>"+
|
" <ACCTID>123</ACCTID>\n"+
|
||||||
" </BANKACCTFROM>"+
|
" </BANKACCTFROM>\n"+
|
||||||
" <BANKTRANLIST>"+
|
" <BANKTRANLIST>\n"+
|
||||||
" <STMTTRN>"+
|
" <STMTTRN>\n"+
|
||||||
" <TRNTYPE>DEP</TRNTYPE>"+
|
" <TRNTYPE>DEP</TRNTYPE>\n"+
|
||||||
" <DTPOSTED>20240901012345.000[+8:CST]</DTPOSTED>"+
|
" <DTPOSTED>20240901012345.000[+8:CST]</DTPOSTED>\n"+
|
||||||
" <TRNAMT>123,45</TRNAMT>"+
|
" <TRNAMT>123,45</TRNAMT>\n"+
|
||||||
" </STMTTRN>"+
|
" </STMTTRN>\n"+
|
||||||
" </BANKTRANLIST>"+
|
" </BANKTRANLIST>\n"+
|
||||||
" </STMTRS>"+
|
" </STMTRS>\n"+
|
||||||
" </STMTTRNRS>"+
|
" </STMTTRNRS>\n"+
|
||||||
" </BANKMSGSRSV1>"+
|
" </BANKMSGSRSV1>\n"+
|
||||||
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
||||||
|
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -451,24 +451,24 @@ func TestOFXTransactionDataFileParseImportedData_ParseInvalidAmount(t *testing.T
|
|||||||
}
|
}
|
||||||
|
|
||||||
_, _, _, _, _, _, err := converter.ParseImportedData(context, user, []byte(
|
_, _, _, _, _, _, err := converter.ParseImportedData(context, user, []byte(
|
||||||
"<OFX>"+
|
"<OFX>\n"+
|
||||||
" <BANKMSGSRSV1>"+
|
" <BANKMSGSRSV1>\n"+
|
||||||
" <STMTTRNRS>"+
|
" <STMTTRNRS>\n"+
|
||||||
" <STMTRS>"+
|
" <STMTRS>\n"+
|
||||||
" <CURDEF>CNY</CURDEF>"+
|
" <CURDEF>CNY</CURDEF>\n"+
|
||||||
" <BANKACCTFROM>"+
|
" <BANKACCTFROM>\n"+
|
||||||
" <ACCTID>123</ACCTID>"+
|
" <ACCTID>123</ACCTID>\n"+
|
||||||
" </BANKACCTFROM>"+
|
" </BANKACCTFROM>\n"+
|
||||||
" <BANKTRANLIST>"+
|
" <BANKTRANLIST>\n"+
|
||||||
" <STMTTRN>"+
|
" <STMTTRN>\n"+
|
||||||
" <TRNTYPE>DEP</TRNTYPE>"+
|
" <TRNTYPE>DEP</TRNTYPE>\n"+
|
||||||
" <DTPOSTED>20240901012345.000[+8:CST]</DTPOSTED>"+
|
" <DTPOSTED>20240901012345.000[+8:CST]</DTPOSTED>\n"+
|
||||||
" <TRNAMT>123 45</TRNAMT>"+
|
" <TRNAMT>123 45</TRNAMT>\n"+
|
||||||
" </STMTTRN>"+
|
" </STMTTRN>\n"+
|
||||||
" </BANKTRANLIST>"+
|
" </BANKTRANLIST>\n"+
|
||||||
" </STMTRS>"+
|
" </STMTRS>\n"+
|
||||||
" </STMTTRNRS>"+
|
" </STMTTRNRS>\n"+
|
||||||
" </BANKMSGSRSV1>"+
|
" </BANKMSGSRSV1>\n"+
|
||||||
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
||||||
assert.EqualError(t, err, errs.ErrAmountInvalid.Message)
|
assert.EqualError(t, err, errs.ErrAmountInvalid.Message)
|
||||||
}
|
}
|
||||||
@@ -483,25 +483,25 @@ func TestOFXTransactionDataFileParseImportedData_ParseTransactionCurrency(t *tes
|
|||||||
}
|
}
|
||||||
|
|
||||||
allNewTransactions, _, _, _, _, _, err := converter.ParseImportedData(context, user, []byte(
|
allNewTransactions, _, _, _, _, _, err := converter.ParseImportedData(context, user, []byte(
|
||||||
"<OFX>"+
|
"<OFX>\n"+
|
||||||
" <BANKMSGSRSV1>"+
|
" <BANKMSGSRSV1>\n"+
|
||||||
" <STMTTRNRS>"+
|
" <STMTTRNRS>\n"+
|
||||||
" <STMTRS>"+
|
" <STMTRS>\n"+
|
||||||
" <CURDEF>CNY</CURDEF>"+
|
" <CURDEF>CNY</CURDEF>\n"+
|
||||||
" <BANKACCTFROM>"+
|
" <BANKACCTFROM>\n"+
|
||||||
" <ACCTID>123</ACCTID>"+
|
" <ACCTID>123</ACCTID>\n"+
|
||||||
" </BANKACCTFROM>"+
|
" </BANKACCTFROM>\n"+
|
||||||
" <BANKTRANLIST>"+
|
" <BANKTRANLIST>\n"+
|
||||||
" <STMTTRN>"+
|
" <STMTTRN>\n"+
|
||||||
" <TRNTYPE>DEP</TRNTYPE>"+
|
" <TRNTYPE>DEP</TRNTYPE>\n"+
|
||||||
" <DTPOSTED>20240901012345.000[+8:CST]</DTPOSTED>"+
|
" <DTPOSTED>20240901012345.000[+8:CST]</DTPOSTED>\n"+
|
||||||
" <TRNAMT>123.45</TRNAMT>"+
|
" <TRNAMT>123.45</TRNAMT>\n"+
|
||||||
" <CURRENCY>USD</CURRENCY>"+
|
" <CURRENCY>USD</CURRENCY>\n"+
|
||||||
" </STMTTRN>"+
|
" </STMTTRN>\n"+
|
||||||
" </BANKTRANLIST>"+
|
" </BANKTRANLIST>\n"+
|
||||||
" </STMTRS>"+
|
" </STMTRS>\n"+
|
||||||
" </STMTTRNRS>"+
|
" </STMTTRNRS>\n"+
|
||||||
" </BANKMSGSRSV1>"+
|
" </BANKMSGSRSV1>\n"+
|
||||||
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
||||||
|
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -519,26 +519,26 @@ func TestOFXTransactionDataFileParseImportedData_ParseDescription(t *testing.T)
|
|||||||
}
|
}
|
||||||
|
|
||||||
allNewTransactions, _, _, _, _, _, err := converter.ParseImportedData(context, user, []byte(
|
allNewTransactions, _, _, _, _, _, err := converter.ParseImportedData(context, user, []byte(
|
||||||
"<OFX>"+
|
"<OFX>\n"+
|
||||||
" <BANKMSGSRSV1>"+
|
" <BANKMSGSRSV1>\n"+
|
||||||
" <STMTTRNRS>"+
|
" <STMTTRNRS>\n"+
|
||||||
" <STMTRS>"+
|
" <STMTRS>\n"+
|
||||||
" <CURDEF>CNY</CURDEF>"+
|
" <CURDEF>CNY</CURDEF>\n"+
|
||||||
" <BANKACCTFROM>"+
|
" <BANKACCTFROM>\n"+
|
||||||
" <ACCTID>123</ACCTID>"+
|
" <ACCTID>123</ACCTID>\n"+
|
||||||
" </BANKACCTFROM>"+
|
" </BANKACCTFROM>\n"+
|
||||||
" <BANKTRANLIST>"+
|
" <BANKTRANLIST>\n"+
|
||||||
" <STMTTRN>"+
|
" <STMTTRN>\n"+
|
||||||
" <TRNTYPE>DEP</TRNTYPE>"+
|
" <TRNTYPE>DEP</TRNTYPE>\n"+
|
||||||
" <DTPOSTED>20240901012345.000[+8:CST]</DTPOSTED>"+
|
" <DTPOSTED>20240901012345.000[+8:CST]</DTPOSTED>\n"+
|
||||||
" <TRNAMT>123.45</TRNAMT>"+
|
" <TRNAMT>123.45</TRNAMT>\n"+
|
||||||
" <NAME>Test</NAME>"+
|
" <NAME>Test</NAME>\n"+
|
||||||
" <MEMO>foo bar\t#test</MEMO>"+
|
" <MEMO>foo bar\t#test</MEMO>\n"+
|
||||||
" </STMTTRN>"+
|
" </STMTTRN>\n"+
|
||||||
" </BANKTRANLIST>"+
|
" </BANKTRANLIST>\n"+
|
||||||
" </STMTRS>"+
|
" </STMTRS>\n"+
|
||||||
" </STMTTRNRS>"+
|
" </STMTTRNRS>\n"+
|
||||||
" </BANKMSGSRSV1>"+
|
" </BANKMSGSRSV1>\n"+
|
||||||
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
||||||
|
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -546,25 +546,25 @@ func TestOFXTransactionDataFileParseImportedData_ParseDescription(t *testing.T)
|
|||||||
assert.Equal(t, "foo bar\t#test", allNewTransactions[0].Comment)
|
assert.Equal(t, "foo bar\t#test", allNewTransactions[0].Comment)
|
||||||
|
|
||||||
allNewTransactions, _, _, _, _, _, err = converter.ParseImportedData(context, user, []byte(
|
allNewTransactions, _, _, _, _, _, err = converter.ParseImportedData(context, user, []byte(
|
||||||
"<OFX>"+
|
"<OFX>\n"+
|
||||||
" <BANKMSGSRSV1>"+
|
" <BANKMSGSRSV1>\n"+
|
||||||
" <STMTTRNRS>"+
|
" <STMTTRNRS>\n"+
|
||||||
" <STMTRS>"+
|
" <STMTRS>\n"+
|
||||||
" <CURDEF>CNY</CURDEF>"+
|
" <CURDEF>CNY</CURDEF>\n"+
|
||||||
" <BANKACCTFROM>"+
|
" <BANKACCTFROM>\n"+
|
||||||
" <ACCTID>123</ACCTID>"+
|
" <ACCTID>123</ACCTID>\n"+
|
||||||
" </BANKACCTFROM>"+
|
" </BANKACCTFROM>\n"+
|
||||||
" <BANKTRANLIST>"+
|
" <BANKTRANLIST>\n"+
|
||||||
" <STMTTRN>"+
|
" <STMTTRN>\n"+
|
||||||
" <TRNTYPE>DEP</TRNTYPE>"+
|
" <TRNTYPE>DEP</TRNTYPE>\n"+
|
||||||
" <DTPOSTED>20240901012345.000[+8:CST]</DTPOSTED>"+
|
" <DTPOSTED>20240901012345.000[+8:CST]</DTPOSTED>\n"+
|
||||||
" <TRNAMT>123.45</TRNAMT>"+
|
" <TRNAMT>123.45</TRNAMT>\n"+
|
||||||
" <NAME>Test</NAME>"+
|
" <NAME>Test</NAME>\n"+
|
||||||
" </STMTTRN>"+
|
" </STMTTRN>\n"+
|
||||||
" </BANKTRANLIST>"+
|
" </BANKTRANLIST>\n"+
|
||||||
" </STMTRS>"+
|
" </STMTRS>\n"+
|
||||||
" </STMTTRNRS>"+
|
" </STMTTRNRS>\n"+
|
||||||
" </BANKMSGSRSV1>"+
|
" </BANKMSGSRSV1>\n"+
|
||||||
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
||||||
|
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -572,27 +572,27 @@ func TestOFXTransactionDataFileParseImportedData_ParseDescription(t *testing.T)
|
|||||||
assert.Equal(t, "Test", allNewTransactions[0].Comment)
|
assert.Equal(t, "Test", allNewTransactions[0].Comment)
|
||||||
|
|
||||||
allNewTransactions, _, _, _, _, _, err = converter.ParseImportedData(context, user, []byte(
|
allNewTransactions, _, _, _, _, _, err = converter.ParseImportedData(context, user, []byte(
|
||||||
"<OFX>"+
|
"<OFX>\n"+
|
||||||
" <BANKMSGSRSV1>"+
|
" <BANKMSGSRSV1>\n"+
|
||||||
" <STMTTRNRS>"+
|
" <STMTTRNRS>\n"+
|
||||||
" <STMTRS>"+
|
" <STMTRS>\n"+
|
||||||
" <CURDEF>CNY</CURDEF>"+
|
" <CURDEF>CNY</CURDEF>\n"+
|
||||||
" <BANKACCTFROM>"+
|
" <BANKACCTFROM>\n"+
|
||||||
" <ACCTID>123</ACCTID>"+
|
" <ACCTID>123</ACCTID>\n"+
|
||||||
" </BANKACCTFROM>"+
|
" </BANKACCTFROM>\n"+
|
||||||
" <BANKTRANLIST>"+
|
" <BANKTRANLIST>\n"+
|
||||||
" <STMTTRN>"+
|
" <STMTTRN>\n"+
|
||||||
" <TRNTYPE>DEP</TRNTYPE>"+
|
" <TRNTYPE>DEP</TRNTYPE>\n"+
|
||||||
" <DTPOSTED>20240901012345.000[+8:CST]</DTPOSTED>"+
|
" <DTPOSTED>20240901012345.000[+8:CST]</DTPOSTED>\n"+
|
||||||
" <TRNAMT>123.45</TRNAMT>"+
|
" <TRNAMT>123.45</TRNAMT>\n"+
|
||||||
" <PAYEE>"+
|
" <PAYEE>\n"+
|
||||||
" <NAME>Test</NAME>"+
|
" <NAME>Test</NAME>\n"+
|
||||||
" </PAYEE>"+
|
" </PAYEE>\n"+
|
||||||
" </STMTTRN>"+
|
" </STMTTRN>\n"+
|
||||||
" </BANKTRANLIST>"+
|
" </BANKTRANLIST>\n"+
|
||||||
" </STMTRS>"+
|
" </STMTRS>\n"+
|
||||||
" </STMTTRNRS>"+
|
" </STMTTRNRS>\n"+
|
||||||
" </BANKMSGSRSV1>"+
|
" </BANKMSGSRSV1>\n"+
|
||||||
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
||||||
|
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -611,21 +611,21 @@ func TestOFXTransactionDataFileParseImportedData_MissingAccountFromNode(t *testi
|
|||||||
|
|
||||||
// Missing Posted Date Node
|
// Missing Posted Date Node
|
||||||
_, _, _, _, _, _, err := converter.ParseImportedData(context, user, []byte(
|
_, _, _, _, _, _, err := converter.ParseImportedData(context, user, []byte(
|
||||||
"<OFX>"+
|
"<OFX>\n"+
|
||||||
" <BANKMSGSRSV1>"+
|
" <BANKMSGSRSV1>\n"+
|
||||||
" <STMTTRNRS>"+
|
" <STMTTRNRS>\n"+
|
||||||
" <STMTRS>"+
|
" <STMTRS>\n"+
|
||||||
" <CURDEF>CNY</CURDEF>"+
|
" <CURDEF>CNY</CURDEF>\n"+
|
||||||
" <BANKTRANLIST>"+
|
" <BANKTRANLIST>\n"+
|
||||||
" <STMTTRN>"+
|
" <STMTTRN>\n"+
|
||||||
" <TRNTYPE>DEP</TRNTYPE>"+
|
" <TRNTYPE>DEP</TRNTYPE>\n"+
|
||||||
" <DTPOSTED>20240901012345.000[+8:CST]</DTPOSTED>"+
|
" <DTPOSTED>20240901012345.000[+8:CST]</DTPOSTED>\n"+
|
||||||
" <TRNAMT>123.45</TRNAMT>"+
|
" <TRNAMT>123.45</TRNAMT>\n"+
|
||||||
" </STMTTRN>"+
|
" </STMTTRN>\n"+
|
||||||
" </BANKTRANLIST>"+
|
" </BANKTRANLIST>\n"+
|
||||||
" </STMTRS>"+
|
" </STMTRS>\n"+
|
||||||
" </STMTTRNRS>"+
|
" </STMTTRNRS>\n"+
|
||||||
" </BANKMSGSRSV1>"+
|
" </BANKMSGSRSV1>\n"+
|
||||||
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
||||||
assert.EqualError(t, err, errs.ErrMissingAccountData.Message)
|
assert.EqualError(t, err, errs.ErrMissingAccountData.Message)
|
||||||
}
|
}
|
||||||
@@ -641,23 +641,23 @@ func TestOFXTransactionDataFileParseImportedData_MissingCurrencyNode(t *testing.
|
|||||||
|
|
||||||
// Missing Default Currency Node
|
// Missing Default Currency Node
|
||||||
_, _, _, _, _, _, err := converter.ParseImportedData(context, user, []byte(
|
_, _, _, _, _, _, err := converter.ParseImportedData(context, user, []byte(
|
||||||
"<OFX>"+
|
"<OFX>\n"+
|
||||||
" <BANKMSGSRSV1>"+
|
" <BANKMSGSRSV1>\n"+
|
||||||
" <STMTTRNRS>"+
|
" <STMTTRNRS>\n"+
|
||||||
" <STMTRS>"+
|
" <STMTRS>\n"+
|
||||||
" <BANKACCTFROM>"+
|
" <BANKACCTFROM>\n"+
|
||||||
" <ACCTID>123</ACCTID>"+
|
" <ACCTID>123</ACCTID>\n"+
|
||||||
" </BANKACCTFROM>"+
|
" </BANKACCTFROM>\n"+
|
||||||
" <BANKTRANLIST>"+
|
" <BANKTRANLIST>\n"+
|
||||||
" <STMTTRN>"+
|
" <STMTTRN>\n"+
|
||||||
" <TRNTYPE>DEP</TRNTYPE>"+
|
" <TRNTYPE>DEP</TRNTYPE>\n"+
|
||||||
" <DTPOSTED>20240901012345.000[+8:CST]</DTPOSTED>"+
|
" <DTPOSTED>20240901012345.000[+8:CST]</DTPOSTED>\n"+
|
||||||
" <TRNAMT>123.45</TRNAMT>"+
|
" <TRNAMT>123.45</TRNAMT>\n"+
|
||||||
" </STMTTRN>"+
|
" </STMTTRN>\n"+
|
||||||
" </BANKTRANLIST>"+
|
" </BANKTRANLIST>\n"+
|
||||||
" </STMTRS>"+
|
" </STMTRS>\n"+
|
||||||
" </STMTTRNRS>"+
|
" </STMTTRNRS>\n"+
|
||||||
" </BANKMSGSRSV1>"+
|
" </BANKMSGSRSV1>\n"+
|
||||||
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
||||||
assert.EqualError(t, err, errs.ErrAccountCurrencyInvalid.Message)
|
assert.EqualError(t, err, errs.ErrAccountCurrencyInvalid.Message)
|
||||||
}
|
}
|
||||||
@@ -673,67 +673,67 @@ func TestOFXTransactionDataFileParseImportedData_MissingTransactionRequiredNode(
|
|||||||
|
|
||||||
// Missing Posted Date Node
|
// Missing Posted Date Node
|
||||||
_, _, _, _, _, _, err := converter.ParseImportedData(context, user, []byte(
|
_, _, _, _, _, _, err := converter.ParseImportedData(context, user, []byte(
|
||||||
"<OFX>"+
|
"<OFX>\n"+
|
||||||
" <BANKMSGSRSV1>"+
|
" <BANKMSGSRSV1>\n"+
|
||||||
" <STMTTRNRS>"+
|
" <STMTTRNRS>\n"+
|
||||||
" <STMTRS>"+
|
" <STMTRS>\n"+
|
||||||
" <CURDEF>CNY</CURDEF>"+
|
" <CURDEF>CNY</CURDEF>\n"+
|
||||||
" <BANKACCTFROM>"+
|
" <BANKACCTFROM>\n"+
|
||||||
" <ACCTID>123</ACCTID>"+
|
" <ACCTID>123</ACCTID>\n"+
|
||||||
" </BANKACCTFROM>"+
|
" </BANKACCTFROM>\n"+
|
||||||
" <BANKTRANLIST>"+
|
" <BANKTRANLIST>\n"+
|
||||||
" <STMTTRN>"+
|
" <STMTTRN>\n"+
|
||||||
" <TRNTYPE>DEP</TRNTYPE>"+
|
" <TRNTYPE>DEP</TRNTYPE>\n"+
|
||||||
" <TRNAMT>123.45</TRNAMT>"+
|
" <TRNAMT>123.45</TRNAMT>\n"+
|
||||||
" </STMTTRN>"+
|
" </STMTTRN>\n"+
|
||||||
" </BANKTRANLIST>"+
|
" </BANKTRANLIST>\n"+
|
||||||
" </STMTRS>"+
|
" </STMTRS>\n"+
|
||||||
" </STMTTRNRS>"+
|
" </STMTTRNRS>\n"+
|
||||||
" </BANKMSGSRSV1>"+
|
" </BANKMSGSRSV1>\n"+
|
||||||
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
||||||
assert.EqualError(t, err, errs.ErrMissingTransactionTime.Message)
|
assert.EqualError(t, err, errs.ErrMissingTransactionTime.Message)
|
||||||
|
|
||||||
// Missing Transaction Type Node
|
// Missing Transaction Type Node
|
||||||
_, _, _, _, _, _, err = converter.ParseImportedData(context, user, []byte(
|
_, _, _, _, _, _, err = converter.ParseImportedData(context, user, []byte(
|
||||||
"<OFX>"+
|
"<OFX>\n"+
|
||||||
" <BANKMSGSRSV1>"+
|
" <BANKMSGSRSV1>\n"+
|
||||||
" <STMTTRNRS>"+
|
" <STMTTRNRS>\n"+
|
||||||
" <STMTRS>"+
|
" <STMTRS>\n"+
|
||||||
" <CURDEF>CNY</CURDEF>"+
|
" <CURDEF>CNY</CURDEF>\n"+
|
||||||
" <BANKACCTFROM>"+
|
" <BANKACCTFROM>\n"+
|
||||||
" <ACCTID>123</ACCTID>"+
|
" <ACCTID>123</ACCTID>\n"+
|
||||||
" </BANKACCTFROM>"+
|
" </BANKACCTFROM>\n"+
|
||||||
" <BANKTRANLIST>"+
|
" <BANKTRANLIST>\n"+
|
||||||
" <STMTTRN>"+
|
" <STMTTRN>\n"+
|
||||||
" <DTPOSTED>20240901012345.000[+8:CST]</DTPOSTED>"+
|
" <DTPOSTED>20240901012345.000[+8:CST]</DTPOSTED>\n"+
|
||||||
" <TRNAMT>123.45</TRNAMT>"+
|
" <TRNAMT>123.45</TRNAMT>\n"+
|
||||||
" </STMTTRN>"+
|
" </STMTTRN>\n"+
|
||||||
" </BANKTRANLIST>"+
|
" </BANKTRANLIST>\n"+
|
||||||
" </STMTRS>"+
|
" </STMTRS>\n"+
|
||||||
" </STMTTRNRS>"+
|
" </STMTTRNRS>\n"+
|
||||||
" </BANKMSGSRSV1>"+
|
" </BANKMSGSRSV1>\n"+
|
||||||
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
||||||
assert.EqualError(t, err, errs.ErrTransactionTypeInvalid.Message)
|
assert.EqualError(t, err, errs.ErrTransactionTypeInvalid.Message)
|
||||||
|
|
||||||
// Missing Amount Node
|
// Missing Amount Node
|
||||||
_, _, _, _, _, _, err = converter.ParseImportedData(context, user, []byte(
|
_, _, _, _, _, _, err = converter.ParseImportedData(context, user, []byte(
|
||||||
"<OFX>"+
|
"<OFX>\n"+
|
||||||
" <BANKMSGSRSV1>"+
|
" <BANKMSGSRSV1>\n"+
|
||||||
" <STMTTRNRS>"+
|
" <STMTTRNRS>\n"+
|
||||||
" <STMTRS>"+
|
" <STMTRS>\n"+
|
||||||
" <CURDEF>CNY</CURDEF>"+
|
" <CURDEF>CNY</CURDEF>\n"+
|
||||||
" <BANKACCTFROM>"+
|
" <BANKACCTFROM>\n"+
|
||||||
" <ACCTID>123</ACCTID>"+
|
" <ACCTID>123</ACCTID>\n"+
|
||||||
" </BANKACCTFROM>"+
|
" </BANKACCTFROM>\n"+
|
||||||
" <BANKTRANLIST>"+
|
" <BANKTRANLIST>\n"+
|
||||||
" <STMTTRN>"+
|
" <STMTTRN>\n"+
|
||||||
" <TRNTYPE>DEP</TRNTYPE>"+
|
" <TRNTYPE>DEP</TRNTYPE>\n"+
|
||||||
" <DTPOSTED>20240901012345.000[+8:CST]</DTPOSTED>"+
|
" <DTPOSTED>20240901012345.000[+8:CST]</DTPOSTED>\n"+
|
||||||
" </STMTTRN>"+
|
" </STMTTRN>\n"+
|
||||||
" </BANKTRANLIST>"+
|
" </BANKTRANLIST>\n"+
|
||||||
" </STMTRS>"+
|
" </STMTRS>\n"+
|
||||||
" </STMTTRNRS>"+
|
" </STMTTRNRS>\n"+
|
||||||
" </BANKMSGSRSV1>"+
|
" </BANKMSGSRSV1>\n"+
|
||||||
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
"</OFX>"), 0, nil, nil, nil, nil, nil)
|
||||||
assert.EqualError(t, err, errs.ErrAmountInvalid.Message)
|
assert.EqualError(t, err, errs.ErrAmountInvalid.Message)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user