def test_parses_correct_time(self): ''' Test whether it can parse correct time for some valid time fields ''' self.assertEquals( OfxParser.parseOfxDateTime('19881201'), datetime(1988, 12, 1, 0, 0) ) self.assertEquals( OfxParser.parseOfxDateTime('19881201230100'), datetime(1988, 12, 1, 23, 01) ) self.assertEquals( OfxParser.parseOfxDateTime('20120229230100'), datetime(2012, 2, 29, 23, 01) )
def parse_file(self, _account, f): parsed_file = OfxParser.parse(f) transactions = [] for account in parsed_file.accounts: transactions.extend(account.statement.transactions) try: balance = parsed_file.account.statement.balance except: balance = parsed_file.account.statement.available_balance return Statement(_account, transactions, balance)
def testDecimalConversionError(self): ''' The test file contains a transaction that has a poorly formatted decimal number ($20). Test that we catch this. ''' ofx = OfxParser.parse(open_file('fail_nice/decimal_error.ofx'), False) self.assertEquals(len(ofx.account.statement.transactions), 0) self.assertEquals(len(ofx.account.statement.discarded_entries), 1) # Test that it raises an error otherwise. self.assertRaises(OfxParserException, OfxParser.parse, open_file('fail_nice/decimal_error.ofx'))
def testForUnclosedTags(self): ofx = OfxParser.parse(open_file('vanguard.ofx')) self.assertTrue(hasattr(ofx, 'account')) self.assertTrue(hasattr(ofx.account, 'statement')) self.assertTrue(hasattr(ofx.account.statement, 'transactions')) self.assertEquals(len(ofx.account.statement.transactions), 1) self.assertEquals(ofx.account.statement.transactions[0].id, '01234567890.0123.07152011.0') self.assertEquals(ofx.account.statement.transactions[0].tradeDate, datetime(2011, 7, 15, 21)) self.assertEquals(ofx.account.statement.transactions[0].settleDate, datetime(2011, 7, 15, 21)) self.assertTrue(hasattr(ofx.account.statement, 'positions')) self.assertEquals(len(ofx.account.statement.positions), 2) self.assertEquals(ofx.account.statement.positions[0].units, Decimal('102.0'))
def testThatParseTransactionReturnsATransaction(self): input = ''' <STMTTRN><TRNTYPE>POS<DTPOSTED>20090401122017.000[-5:EST]<TRNAMT>-6.60<FITID>0000123456782009040100001<NAME>MCDONALD'S #112<MEMO>POS MERCHANDISE;MCDONALD'S #112</STMTTRN> ''' txn = BeautifulStoneSoup(input) transaction = OfxParser.parseTransaction(txn.find('stmttrn')) self.assertEquals('pos', transaction.type) self.assertEquals(datetime(2009, 4, 1, 12, 20, 17) - timedelta(hours=-5), transaction.date) self.assertEquals(Decimal('-6.60'), transaction.amount) self.assertEquals('0000123456782009040100001', transaction.id) self.assertEquals("MCDONALD'S #112", transaction.payee) self.assertEquals("POS MERCHANDISE;MCDONALD'S #112", transaction.memo)
def testHeaders(self): expect = { "OFXHEADER": u"100", "DATA": u"OFXSGML", "VERSION": u"102", "SECURITY": None, "ENCODING": u"USASCII", "CHARSET": u"1252", "COMPRESSION":None, "OLDFILEUID": None, "NEWFILEUID": None, } ofx = OfxParser.parse(open_file('bank_medium.ofx')) self.assertEquals(expect, ofx.headers)
def testThatParseStatementReturnsAStatement(self): input = ''' <STMTTRNRS><TRNUID>20090523122017<STATUS><CODE>0<SEVERITY>INFO<MESSAGE>OK</STATUS> <STMTRS><CURDEF>CAD<BANKACCTFROM><BANKID>160000100<ACCTID>12300 000012345678<ACCTTYPE>CHECKING</BANKACCTFROM> <BANKTRANLIST><DTSTART>20090401<DTEND>20090523122017 <STMTTRN><TRNTYPE>POS<DTPOSTED>20090401122017.000[-5:EST]<TRNAMT>-6.60<FITID>0000123456782009040100001<NAME>MCDONALD'S #112<MEMO>POS MERCHANDISE;MCDONALD'S #112</STMTTRN> </BANKTRANLIST><LEDGERBAL><BALAMT>382.34<DTASOF>20090523122017</LEDGERBAL><AVAILBAL><BALAMT>682.34<DTASOF>20090523122017</AVAILBAL></STMTRS></STMTTRNRS> ''' txn = BeautifulStoneSoup(input) statement = OfxParser.parseStatement(txn.find('stmttrnrs')) self.assertEquals(datetime(2009, 4, 1), statement.start_date) self.assertEquals(datetime(2009, 5, 23, 12, 20, 17), statement.end_date) self.assertEquals(1, len(statement.transactions)) self.assertEquals(Decimal('382.34'), statement.balance) self.assertEquals(Decimal('682.34'), statement.available_balance)
def testDateFieldMissing(self): ''' The test file contains three transactions in a single statement. They fail due to: 1) No date 2) Empty date 3) Invalid date ''' ofx = OfxParser.parse(open_file('fail_nice/date_missing.ofx'), False) self.assertEquals(len(ofx.account.statement.transactions), 0) self.assertEquals(len(ofx.account.statement.discarded_entries), 3) self.assertEquals(len(ofx.account.statement.warnings), 0) # Test that it raises an error otherwise. self.assertRaises(OfxParserException, OfxParser.parse, open_file('fail_nice/date_missing.ofx'))
def testEverything(self): ofx = OfxParser.parse(open_file('bank_medium.ofx')) self.assertEquals('12300 000012345678', ofx.account.number) self.assertEquals('160000100', ofx.account.routing_number) self.assertEquals('CHECKING', ofx.account.account_type) self.assertEquals(Decimal('382.34'), ofx.account.statement.balance) # Todo: support values in decimal or int form. #self.assertEquals('15', ofx.bank_account.statement.balance_in_pennies) self.assertEquals(Decimal('682.34'), ofx.account.statement.available_balance) self.assertEquals(datetime(2009, 4, 1), ofx.account.statement.start_date) self.assertEquals(datetime(2009, 5, 23, 12, 20, 17), ofx.account.statement.end_date) self.assertEquals(3, len(ofx.account.statement.transactions)) transaction = ofx.account.statement.transactions[0] self.assertEquals("MCDONALD'S #112", transaction.payee) self.assertEquals('pos', transaction.type) self.assertEquals(Decimal('-6.60'), transaction.amount)
def test_parses_time_offset(self): ''' Test that we handle GMT offset ''' self.assertEquals( OfxParser.parseOfxDateTime('20001201120000 [0:GMT]'), datetime(2000, 12, 1, 12, 0) ) self.assertEquals( OfxParser.parseOfxDateTime('19991201120000 [1:ITT]'), datetime(1999, 12, 1, 11, 0) ) self.assertEquals( OfxParser.parseOfxDateTime('19881201230100 [-5:EST]'), datetime(1988, 12, 2, 4, 1) ) self.assertEquals( OfxParser.parseOfxDateTime('20120229230100 [-6:CAT]'), datetime(2012, 3, 1, 5, 1) ) self.assertEquals( OfxParser.parseOfxDateTime('20120412120000 [-5.5:XXX]'), datetime(2012, 04, 12, 17, 30)) self.assertEquals( OfxParser.parseOfxDateTime('20120412120000 [-5:XXX]'), datetime(2012, 04, 12, 17))
from ofxparse.ofxparse import OfxParser from .db import db from .service import import_ofx import sys with open(sys.argv[1], 'rb') as f: ofx = OfxParser.parse(f) import_ofx(ofx) db.session.commit()
def testThatParseReturnsAResultWithABankAccount(self): ofx = OfxParser.parse(open_file('bank_medium.ofx')) self.assertTrue(ofx.account != None)
def testThatParseWorksWithoutErrors(self): OfxParser.parse(open_file('bank_medium.ofx'))
def testThatParseCanCreateAnInvestmentAccount(self): OfxParser.parse(StringIO(self.sample))
def testThatReturnedAccountAlsoHasAStatement(self): stmtrs = BeautifulStoneSoup(self.input) account = OfxParser.parseStmtrs(stmtrs.find('stmtrs'), AccountType.Bank) self.assertTrue(hasattr(account, 'statement'))
def testThatParseStmtrsReturnsAnAccount(self): stmtrs = BeautifulStoneSoup(self.input) account = OfxParser.parseStmtrs(stmtrs.find('stmtrs'), AccountType.Bank) self.assertEquals('12300 000012345678', account.number) self.assertEquals('160000100', account.routing_number) self.assertEquals('CHECKING', account.account_type)