add unit test and improve robustness

This commit is contained in:
MaysWind
2024-10-28 23:46:45 +08:00
parent c44bf73b42
commit f2bc8e44fc
4 changed files with 616 additions and 27 deletions
@@ -117,6 +117,10 @@ func (t *ofxTransactionDataRowIterator) Next(ctx core.Context, user *models.User
func (t *ofxTransactionDataRowIterator) parseTransaction(ctx core.Context, user *models.User, ofxTransaction *ofxTransactionData) (map[datatable.TransactionDataTableColumn]string, error) {
data := make(map[datatable.TransactionDataTableColumn]string, len(ofxTransactionSupportedColumns))
if ofxTransaction.PostedDate == "" {
return nil, errs.ErrMissingTransactionTime
}
datetime, timezone, err := t.parseTransactionTimeAndTimeZone(ctx, ofxTransaction.PostedDate)
if err != nil {
@@ -126,12 +130,20 @@ func (t *ofxTransactionDataRowIterator) parseTransaction(ctx core.Context, user
data[datatable.TRANSACTION_DATA_TABLE_TRANSACTION_TIME] = datetime
data[datatable.TRANSACTION_DATA_TABLE_TRANSACTION_TIMEZONE] = timezone
if ofxTransaction.Amount == "" {
return nil, errs.ErrAmountInvalid
}
amount, err := utils.ParseAmount(strings.ReplaceAll(ofxTransaction.Amount, ",", ".")) // ofx supports decimal point or comma to indicate the start of the fractional amount
if err != nil {
return nil, errs.ErrAmountInvalid
}
if ofxTransaction.TransactionType == "" {
return nil, errs.ErrTransactionTypeInvalid
}
if transactionType, exists := ofxTransactionTypeMapping[ofxTransaction.TransactionType]; exists {
data[datatable.TRANSACTION_DATA_TABLE_TRANSACTION_TYPE] = utils.IntToString(int(transactionType))
@@ -150,6 +162,10 @@ func (t *ofxTransactionDataRowIterator) parseTransaction(ctx core.Context, user
}
}
if ofxTransaction.FromAccountId == "" {
return nil, errs.ErrMissingAccountData
}
data[datatable.TRANSACTION_DATA_TABLE_ACCOUNT_NAME] = ofxTransaction.FromAccountId
if ofxTransaction.Currency != "" {
@@ -189,12 +205,22 @@ func (t *ofxTransactionDataRowIterator) parseTransactionTimeAndTimeZone(ctx core
tzOffset := ofxDefaultTimezoneOffset
if len(datetime) >= 8 { // YYYYMMDD
if !utils.IsStringOnlyContainsDigits(datetime[0:8]) {
log.Errorf(ctx, "[ofx_transaction_table.parseTransactionTimeAndTimeZone] cannot parse time \"%s\", because contains non-digit character", datetime)
return "", "", errs.ErrTransactionTimeInvalid
}
year = datetime[0:4]
month = datetime[4:6]
day = datetime[6:8]
}
if len(datetime) >= 14 { // YYYYMMDDHHMMSS
if !utils.IsStringOnlyContainsDigits(datetime[8:14]) {
log.Errorf(ctx, "[ofx_transaction_table.parseTransactionTimeAndTimeZone] cannot parse time \"%s\", because contains non-digit character", datetime)
return "", "", errs.ErrTransactionTimeInvalid
}
hour = datetime[8:10]
minute = datetime[10:12]
second = datetime[12:14]