ofx-parser-bp 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +14 -0
- data/Manifest.txt +14 -0
- data/README.txt +103 -0
- data/Rakefile +17 -0
- data/lib/class-extension.rb +154 -0
- data/lib/mcc.rb +674 -0
- data/lib/ofx-parser.rb +236 -0
- data/lib/ofx.rb +189 -0
- data/test/fixtures/banking.ofx.sgml +87 -0
- data/test/fixtures/creditcard.ofx.sgml +79 -0
- data/test/fixtures/list.ofx.sgml +53 -0
- data/test/fixtures/malformed_header.ofx.sgml +106 -0
- data/test/fixtures/with_spaces.ofx.sgml +28 -0
- data/test/test_ofx_parser.rb +264 -0
- metadata +95 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
OFXHEADER:100
|
|
2
|
+
DATA:OFXSGML
|
|
3
|
+
VERSION:102
|
|
4
|
+
SECURITY:NONE
|
|
5
|
+
ENCODING:USASCII
|
|
6
|
+
CHARSET:1252
|
|
7
|
+
COMPRESSION:NONE
|
|
8
|
+
OLDFILEUID:NONE
|
|
9
|
+
NEWFILEUID:NONE
|
|
10
|
+
|
|
11
|
+
<OFX>
|
|
12
|
+
<SIGNONMSGSRSV1>
|
|
13
|
+
<SONRS>
|
|
14
|
+
<STATUS>
|
|
15
|
+
<CODE>0</CODE>
|
|
16
|
+
<SEVERITY>INFO</SEVERITY>
|
|
17
|
+
</STATUS>
|
|
18
|
+
<DTSERVER>20070623192010</DTSERVER>
|
|
19
|
+
<LANGUAGE>ENG</LANGUAGE>
|
|
20
|
+
<FI>
|
|
21
|
+
<ORG>Citigroup</ORG>
|
|
22
|
+
<FID>24909</FID>
|
|
23
|
+
</FI>
|
|
24
|
+
<INTU.BID>24909</INTU.BID>
|
|
25
|
+
</SONRS>
|
|
26
|
+
</SIGNONMSGSRSV1>
|
|
27
|
+
<CREDITCARDMSGSRSV1>
|
|
28
|
+
<CCSTMTTRNRS>
|
|
29
|
+
<TRNUID>0</TRNUID>
|
|
30
|
+
<STATUS>
|
|
31
|
+
<CODE>0</CODE>
|
|
32
|
+
<SEVERITY>INFO</SEVERITY>
|
|
33
|
+
</STATUS>
|
|
34
|
+
<CCSTMTRS>
|
|
35
|
+
<CURDEF>USD</CURDEF>
|
|
36
|
+
<CCACCTFROM>
|
|
37
|
+
<ACCTID>XXXXXXXXXXXX1111</ACCTID>
|
|
38
|
+
</CCACCTFROM>
|
|
39
|
+
<BANKTRANLIST>
|
|
40
|
+
<DTSTART>20070509120000</DTSTART>
|
|
41
|
+
<DTEND>20070608120000</DTEND>
|
|
42
|
+
<STMTTRN>
|
|
43
|
+
<TRNTYPE>DEBIT</TRNTYPE>
|
|
44
|
+
<DTPOSTED>20070510170000</DTPOSTED>
|
|
45
|
+
<TRNAMT>-19.17</TRNAMT>
|
|
46
|
+
<FITID>xx</FITID>
|
|
47
|
+
<SIC>5912</SIC>
|
|
48
|
+
<NAME>WALGREEN 34638675 ANYTOWN</NAME>
|
|
49
|
+
</STMTTRN>
|
|
50
|
+
<STMTTRN>
|
|
51
|
+
<TRNTYPE>DEBIT</TRNTYPE>
|
|
52
|
+
<DTPOSTED>20070512170000</DTPOSTED>
|
|
53
|
+
<TRNAMT>-12.0</TRNAMT>
|
|
54
|
+
<FITID>yy-56</FITID>
|
|
55
|
+
<SIC>7933</SIC>
|
|
56
|
+
<NAME>SUNSET BOWL ANYTOWN</NAME>
|
|
57
|
+
</STMTTRN>
|
|
58
|
+
<STMTTRN>
|
|
59
|
+
<TRNTYPE>CREDIT</TRNTYPE>
|
|
60
|
+
<DTPOSTED>20070526170000</DTPOSTED>
|
|
61
|
+
<TRNAMT>11.01</TRNAMT>
|
|
62
|
+
<FITID>78-9</FITID>
|
|
63
|
+
<SIC>0000</SIC>
|
|
64
|
+
<NAME>ELECTRONIC PAYMENT-THANK YOU</NAME>
|
|
65
|
+
</STMTTRN>
|
|
66
|
+
</BANKTRANLIST>
|
|
67
|
+
<LEDGERBAL>
|
|
68
|
+
<BALAMT>-1111.01</BALAMT>
|
|
69
|
+
<DTASOF>20070623192013</DTASOF>
|
|
70
|
+
</LEDGERBAL>
|
|
71
|
+
<AVAILBAL>
|
|
72
|
+
<BALAMT>19000.99</BALAMT>
|
|
73
|
+
<DTASOF>20070623192013</DTASOF>
|
|
74
|
+
</AVAILBAL>
|
|
75
|
+
</CCSTMTRS>
|
|
76
|
+
</CCSTMTTRNRS>
|
|
77
|
+
</CREDITCARDMSGSRSV1>
|
|
78
|
+
</OFX>
|
|
79
|
+
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
OFXHEADER:100
|
|
2
|
+
DATA:OFXSGML
|
|
3
|
+
VERSION:102
|
|
4
|
+
SECURITY:NONE
|
|
5
|
+
ENCODING:USASCII
|
|
6
|
+
CHARSET:1252
|
|
7
|
+
COMPRESSION:NONE
|
|
8
|
+
OLDFILEUID:NONE
|
|
9
|
+
NEWFILEUID:e1dffb32-0a88-1111-12fb-111056c11111
|
|
10
|
+
|
|
11
|
+
<OFX>
|
|
12
|
+
<SIGNONMSGSRSV1>
|
|
13
|
+
<SONRS>
|
|
14
|
+
<STATUS>
|
|
15
|
+
<CODE>0
|
|
16
|
+
<SEVERITY>INFO
|
|
17
|
+
</STATUS>
|
|
18
|
+
<DTSERVER>20070702051227
|
|
19
|
+
<LANGUAGE>ENG
|
|
20
|
+
<DTPROFUP>20040828230101
|
|
21
|
+
<FI>
|
|
22
|
+
<ORG>Citigroup
|
|
23
|
+
<FID>24909
|
|
24
|
+
</FI>
|
|
25
|
+
<SESSCOOKIE>11111
|
|
26
|
+
</SONRS>
|
|
27
|
+
</SIGNONMSGSRSV1>
|
|
28
|
+
<SIGNUPMSGSRSV1>
|
|
29
|
+
<ACCTINFOTRNRS>
|
|
30
|
+
<TRNUID>e1dffb32-0a88-1111-12fb-111056c11111
|
|
31
|
+
<STATUS>
|
|
32
|
+
<CODE>0
|
|
33
|
+
<SEVERITY>INFO
|
|
34
|
+
</STATUS>
|
|
35
|
+
<CLTCOOKIE>4
|
|
36
|
+
<ACCTINFORS>
|
|
37
|
+
<DTACCTUP>20070702045709
|
|
38
|
+
<ACCTINFO>
|
|
39
|
+
<DESC>CREDIT CARD ************1111
|
|
40
|
+
<CCACCTINFO>
|
|
41
|
+
<CCACCTFROM>
|
|
42
|
+
<ACCTID>XXXXXXXXXXXX1111
|
|
43
|
+
</CCACCTFROM>
|
|
44
|
+
<SUPTXDL>Y
|
|
45
|
+
<XFERSRC>N
|
|
46
|
+
<XFERDEST>N
|
|
47
|
+
<SVCSTATUS>ACTIVE
|
|
48
|
+
</CCACCTINFO>
|
|
49
|
+
</ACCTINFO>
|
|
50
|
+
</ACCTINFORS>
|
|
51
|
+
</ACCTINFOTRNRS>
|
|
52
|
+
</SIGNUPMSGSRSV1>
|
|
53
|
+
</OFX>
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
|
|
2
|
+
OFXHEADER:100
|
|
3
|
+
DATA:OFXSGML
|
|
4
|
+
VERSION:102
|
|
5
|
+
SECURITY:NONE
|
|
6
|
+
ENCODING:USASCII
|
|
7
|
+
CHARSET:1252
|
|
8
|
+
COMPRESSION:NONE
|
|
9
|
+
OLDFILEUID:NONE
|
|
10
|
+
NEWFILEUID:NONE
|
|
11
|
+
<OFX>
|
|
12
|
+
<SIGNONMSGSRSV1>
|
|
13
|
+
<SONRS>
|
|
14
|
+
<STATUS>
|
|
15
|
+
<CODE>0
|
|
16
|
+
<SEVERITY>INFO
|
|
17
|
+
</STATUS>
|
|
18
|
+
<DTSERVER>20070820120000[0:GMT]
|
|
19
|
+
<LANGUAGE>ENG
|
|
20
|
+
</SONRS>
|
|
21
|
+
</SIGNONMSGSRSV1>
|
|
22
|
+
<CREDITCARDMSGSRSV1>
|
|
23
|
+
<CCSTMTTRNRS>
|
|
24
|
+
<TRNUID>1
|
|
25
|
+
<STATUS>
|
|
26
|
+
<CODE>0
|
|
27
|
+
<SEVERITY>INFO
|
|
28
|
+
<MESSAGE>Success
|
|
29
|
+
</STATUS>
|
|
30
|
+
<CCSTMTRS>
|
|
31
|
+
<CURDEF>USD
|
|
32
|
+
<CCACCTFROM>
|
|
33
|
+
<ACCTID>xxxxxxxxxxxxxxxx
|
|
34
|
+
</CCACCTFROM>
|
|
35
|
+
<BANKTRANLIST>
|
|
36
|
+
<DTSTART>20070706120000[0:GMT]
|
|
37
|
+
<DTEND>20070820120000[0:GMT]
|
|
38
|
+
<STMTTRN>
|
|
39
|
+
<TRNTYPE>CREDIT
|
|
40
|
+
<DTPOSTED>20070719120000[0:GMT]
|
|
41
|
+
<TRNAMT>4.68
|
|
42
|
+
<FITID>GEN20070719-0000004.68PERFECTCARD_REB00000
|
|
43
|
+
<NAME>MY CREDIT CARD
|
|
44
|
+
</STMTTRN>
|
|
45
|
+
<STMTTRN>
|
|
46
|
+
<TRNTYPE>DEBIT
|
|
47
|
+
<DTPOSTED>20070814120000[0:GMT]
|
|
48
|
+
<TRNAMT>-59.99
|
|
49
|
+
<FITID>2007081425411177225225085596201
|
|
50
|
+
<NAME>Another Store
|
|
51
|
+
</STMTTRN>
|
|
52
|
+
<STMTTRN>
|
|
53
|
+
<TRNTYPE>DEBIT
|
|
54
|
+
<DTPOSTED>20070815120000[0:GMT]
|
|
55
|
+
<TRNAMT>-1.50
|
|
56
|
+
<FITID>2007081555541867296004064778618
|
|
57
|
+
<NAME>PATHTVM 33RD STREET
|
|
58
|
+
</STMTTRN>
|
|
59
|
+
<STMTTRN>
|
|
60
|
+
<TRNTYPE>DEBIT
|
|
61
|
+
<DTPOSTED>20070817120000[0:GMT]
|
|
62
|
+
<TRNAMT>-39.37
|
|
63
|
+
<FITID>2007081755432867228100699618500
|
|
64
|
+
<NAME>Yet another store
|
|
65
|
+
</STMTTRN>
|
|
66
|
+
<STMTTRN>
|
|
67
|
+
<TRNTYPE>DEBIT
|
|
68
|
+
<DTPOSTED>20070814120000[0:GMT]
|
|
69
|
+
<TRNAMT>-381.21
|
|
70
|
+
<FITID>2007081455432867226000370175054
|
|
71
|
+
<NAME>Store
|
|
72
|
+
</STMTTRN>
|
|
73
|
+
<STMTTRN>
|
|
74
|
+
<TRNTYPE>DEBIT
|
|
75
|
+
<DTPOSTED>20070803120000[0:GMT]
|
|
76
|
+
<TRNAMT>-108.38
|
|
77
|
+
<FITID>2007080325411178214214070266502
|
|
78
|
+
<NAME>Store
|
|
79
|
+
</STMTTRN>
|
|
80
|
+
<STMTTRN>
|
|
81
|
+
<TRNTYPE>DEBIT
|
|
82
|
+
<DTPOSTED>20070819120000[0:GMT]
|
|
83
|
+
<TRNAMT>-27.00
|
|
84
|
+
<FITID>2007081955500807229017000653817
|
|
85
|
+
<NAME>ZENITH PARKING LLC
|
|
86
|
+
</STMTTRN>
|
|
87
|
+
<STMTTRN>
|
|
88
|
+
<TRNTYPE>DEBIT
|
|
89
|
+
<DTPOSTED>20070730120000[0:GMT]
|
|
90
|
+
<TRNAMT>-59.61
|
|
91
|
+
<FITID>2007073085486757210101972840130
|
|
92
|
+
<NAME>CHRYSLER CAMERA REPAIR
|
|
93
|
+
</STMTTRN>
|
|
94
|
+
</BANKTRANLIST>
|
|
95
|
+
<LEDGERBAL>
|
|
96
|
+
<BALAMT>-2.00
|
|
97
|
+
<DTASOF>20070820120000[0:GMT]
|
|
98
|
+
</LEDGERBAL>
|
|
99
|
+
<AVAILBAL>
|
|
100
|
+
<BALAMT>1.00
|
|
101
|
+
<DTASOF>20070820120000[0:GMT]
|
|
102
|
+
</AVAILBAL>
|
|
103
|
+
</CCSTMTRS>
|
|
104
|
+
</CCSTMTTRNRS>
|
|
105
|
+
</CREDITCARDMSGSRSV1>
|
|
106
|
+
</OFX>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
OFXHEADER:100
|
|
2
|
+
DATA:OFXSGML
|
|
3
|
+
VERSION:102
|
|
4
|
+
SECURITY:NONE
|
|
5
|
+
ENCODING:USASCII
|
|
6
|
+
CHARSET:1252
|
|
7
|
+
COMPRESSION:NONE
|
|
8
|
+
OLDFILEUID:
|
|
9
|
+
NEWFILEUID:NONE
|
|
10
|
+
|
|
11
|
+
<OFX>
|
|
12
|
+
<SIGNONMSGSRSV1>
|
|
13
|
+
<SONRS>
|
|
14
|
+
<STATUS>
|
|
15
|
+
<CODE> 0
|
|
16
|
+
<SEVERITY> INFO
|
|
17
|
+
<MESSAGE> The user is authentic; operation succeeded.
|
|
18
|
+
</STATUS>
|
|
19
|
+
<DTSERVER> 20070623142635.169[-5:CDT]
|
|
20
|
+
<LANGUAGE>ENG
|
|
21
|
+
<FI>
|
|
22
|
+
<ORG> U.S. Bank
|
|
23
|
+
<FID> 1402
|
|
24
|
+
</FI>
|
|
25
|
+
<INTU.BID>1402
|
|
26
|
+
</SONRS>
|
|
27
|
+
</SIGNONMSGSRSV1>
|
|
28
|
+
</OFX>
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
require 'ofx-parser'
|
|
3
|
+
|
|
4
|
+
class OfxParserTest < Test::Unit::TestCase
|
|
5
|
+
|
|
6
|
+
OFX_FILES = {}
|
|
7
|
+
|
|
8
|
+
fixtures_dir = File.dirname(__FILE__) + '/fixtures'
|
|
9
|
+
|
|
10
|
+
# Load up the xml files
|
|
11
|
+
Dir.open(fixtures_dir).each do |fn|
|
|
12
|
+
next unless fn =~ /\.ofx\.sgml$/
|
|
13
|
+
|
|
14
|
+
ofx = File.read(fixtures_dir + "/#{fn}")
|
|
15
|
+
ofx.gsub!(/\r?\n/,"\r\n") # change line endings to \r\n
|
|
16
|
+
|
|
17
|
+
OFX_FILES[fn.scan(/^[^.]*/).to_s.to_sym] = ofx
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def setup
|
|
21
|
+
# empty ofx parser - useful for testing other methods independently
|
|
22
|
+
@parser = OfxParser::OfxParser
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def test_pre_process_strips_spaces
|
|
26
|
+
header, body = @parser.pre_process(OFX_FILES[:with_spaces])
|
|
27
|
+
|
|
28
|
+
assert_no_match(/>\s+.*?</, body, "should be no spaces after a tag close")
|
|
29
|
+
assert_no_match(/>.*?\s+</, body, "should be no spaces before a tag close")
|
|
30
|
+
assert_no_match(/>\s+</, body, "should be no spaces between two tags")
|
|
31
|
+
assert_match("The user is authentic; operation succeeded.", body, "content in tags should not be altered")
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def test_pre_process_header
|
|
35
|
+
header, body = @parser.pre_process(OFX_FILES[:with_spaces])
|
|
36
|
+
|
|
37
|
+
assert_equal 9, header.keys.size
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def test_parse_datetime
|
|
41
|
+
assert_equal DateTime.civil(2007, 6, 22, 19, 0, 0, Rational(-5,24)), @parser.parse_datetime('20070622190000.200[-5:CDT]')
|
|
42
|
+
assert_equal DateTime.civil(2007, 6, 22, 19, 0, 0, Rational(9,24)), @parser.parse_datetime('20070622190000.200[+9.0:JST]')
|
|
43
|
+
assert_equal DateTime.civil(2007, 6, 22), @parser.parse_datetime('20070622')
|
|
44
|
+
assert_equal DateTime.civil(2007, 6, 22, 19, 0, 0), @parser.parse_datetime('20070622190000')
|
|
45
|
+
assert_equal DateTime.civil(2007, 6, 22, 19, 0, 0), @parser.parse_datetime('20070622190000.200')
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def test_sign_on
|
|
49
|
+
ofx = OfxParser::OfxParser.parse(OFX_FILES[:with_spaces])
|
|
50
|
+
|
|
51
|
+
assert_equal '0', ofx.sign_on.status.code
|
|
52
|
+
assert_equal 'INFO', ofx.sign_on.status.severity
|
|
53
|
+
assert_equal 'The user is authentic; operation succeeded.', ofx.sign_on.status.message
|
|
54
|
+
assert_equal 'Success', ofx.sign_on.status.code_desc
|
|
55
|
+
|
|
56
|
+
assert_equal DateTime.civil(2007,6,23,14,26,35,Rational(-5, 24)), ofx.sign_on.date
|
|
57
|
+
assert_equal 'ENG', ofx.sign_on.language
|
|
58
|
+
assert_equal 'U.S. Bank', ofx.sign_on.institute.name
|
|
59
|
+
assert_equal '1402', ofx.sign_on.institute.id
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def test_no_accounts
|
|
63
|
+
ofx = OfxParser::OfxParser.parse(OFX_FILES[:with_spaces])
|
|
64
|
+
|
|
65
|
+
assert_equal 0, ofx.accounts.size
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def test_banking
|
|
69
|
+
ofx = OfxParser::OfxParser.parse(OFX_FILES[:banking])
|
|
70
|
+
|
|
71
|
+
acct = ofx.bank_account
|
|
72
|
+
|
|
73
|
+
assert_equal '103333333333', acct.number
|
|
74
|
+
assert_equal '033000033', acct.routing_number
|
|
75
|
+
assert_equal :CHECKING, acct.type
|
|
76
|
+
assert_equal '1234.09', acct.balance
|
|
77
|
+
assert_equal 123409, acct.balance_in_pennies
|
|
78
|
+
assert_equal DateTime.civil(2007,6,23,14,26,35,Rational(-5, 24)), acct.balance_date
|
|
79
|
+
assert_equal '9C24229A0077EAA50000011353C9E00743FC', acct.transaction_uid
|
|
80
|
+
|
|
81
|
+
statement = acct.statement
|
|
82
|
+
|
|
83
|
+
assert_equal 'USD', statement.currency
|
|
84
|
+
assert_equal DateTime.civil(2007,6,4,19,0,0,Rational(-5, 24)), statement.start_date
|
|
85
|
+
assert_equal DateTime.civil(2007,6,22,19,0,0,Rational(-5, 24)), statement.end_date
|
|
86
|
+
|
|
87
|
+
transactions = statement.transactions
|
|
88
|
+
assert_equal 4, transactions.size
|
|
89
|
+
|
|
90
|
+
assert_equal :PAYMENT, transactions[0].type
|
|
91
|
+
assert_equal OfxParser::Transaction::TYPE[:PAYMENT], transactions[0].type_desc
|
|
92
|
+
assert_equal DateTime.civil(2007,6,6,12,0,0), transactions[0].date
|
|
93
|
+
assert_equal '-11.11', transactions[0].amount
|
|
94
|
+
assert_equal -1111, transactions[0].amount_in_pennies
|
|
95
|
+
assert_equal '11111111 22', transactions[0].fit_id
|
|
96
|
+
assert_equal nil, transactions[0].check_number
|
|
97
|
+
assert_equal nil, transactions[0].sic
|
|
98
|
+
assert_equal nil, transactions[0].sic_desc
|
|
99
|
+
assert_equal 'WEB AUTHORIZED PMT FOO INC', transactions[0].payee
|
|
100
|
+
assert_equal 'Download from usbank.com. FOO INC', transactions[0].memo
|
|
101
|
+
|
|
102
|
+
assert_equal :CHECK, transactions[1].type
|
|
103
|
+
assert_equal OfxParser::Transaction::TYPE[:CHECK], transactions[1].type_desc
|
|
104
|
+
assert_equal DateTime.civil(2007,6,7,12,0,0), transactions[1].date
|
|
105
|
+
assert_equal '-111.11', transactions[1].amount
|
|
106
|
+
assert_equal -11111, transactions[1].amount_in_pennies
|
|
107
|
+
assert_equal '22222A', transactions[1].fit_id
|
|
108
|
+
assert_equal '0000009611', transactions[1].check_number
|
|
109
|
+
assert_equal nil, transactions[1].sic
|
|
110
|
+
assert_equal nil, transactions[1].sic_desc
|
|
111
|
+
assert_equal 'CHECK', transactions[1].payee
|
|
112
|
+
assert_equal 'Download from usbank.com.', transactions[1].memo
|
|
113
|
+
|
|
114
|
+
assert_equal :DIRECTDEP, transactions[2].type
|
|
115
|
+
assert_equal OfxParser::Transaction::TYPE[:DIRECTDEP], transactions[2].type_desc
|
|
116
|
+
assert_equal DateTime.civil(2007,6,14,12,0,0), transactions[2].date
|
|
117
|
+
assert_equal '1111.11', transactions[2].amount
|
|
118
|
+
assert_equal 111111, transactions[2].amount_in_pennies
|
|
119
|
+
assert_equal 'X34AE33', transactions[2].fit_id
|
|
120
|
+
assert_equal nil, transactions[2].check_number
|
|
121
|
+
assert_equal nil, transactions[2].sic
|
|
122
|
+
assert_equal nil, transactions[2].sic_desc
|
|
123
|
+
assert_equal 'ELECTRONIC DEPOSIT BAR INC', transactions[2].payee
|
|
124
|
+
assert_equal 'Download from usbank.com. BAR INC', transactions[2].memo
|
|
125
|
+
|
|
126
|
+
assert_equal :CREDIT, transactions[3].type
|
|
127
|
+
assert_equal OfxParser::Transaction::TYPE[:CREDIT], transactions[3].type_desc
|
|
128
|
+
assert_equal DateTime.civil(2007,6,19,12,0,0), transactions[3].date
|
|
129
|
+
assert_equal '11.11', transactions[3].amount
|
|
130
|
+
assert_equal 1111, transactions[3].amount_in_pennies
|
|
131
|
+
assert_equal '8 8 9089743', transactions[3].fit_id
|
|
132
|
+
assert_equal nil, transactions[3].check_number
|
|
133
|
+
assert_equal nil, transactions[3].sic
|
|
134
|
+
assert_equal nil, transactions[3].sic_desc
|
|
135
|
+
assert_equal 'ATM DEPOSIT US BANK ANYTOWNAS', transactions[3].payee
|
|
136
|
+
assert_equal 'Download from usbank.com. US BANK ANYTOWN ASUS1', transactions[3].memo
|
|
137
|
+
|
|
138
|
+
assert_equal 1, ofx.accounts.size
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def test_creditcard
|
|
142
|
+
ofx = OfxParser::OfxParser.parse(OFX_FILES[:creditcard])
|
|
143
|
+
|
|
144
|
+
acct = ofx.credit_card
|
|
145
|
+
|
|
146
|
+
assert_equal 'XXXXXXXXXXXX1111', acct.number
|
|
147
|
+
assert_equal '19000.99', acct.remaining_credit
|
|
148
|
+
assert_equal 1900099, acct.remaining_credit_in_pennies
|
|
149
|
+
assert_equal DateTime.civil(2007,6,23,19,20,13), acct.remaining_credit_date
|
|
150
|
+
assert_equal '-1111.01', acct.balance
|
|
151
|
+
assert_equal -111101, acct.balance_in_pennies
|
|
152
|
+
assert_equal DateTime.civil(2007,6,23,19,20,13), acct.balance_date
|
|
153
|
+
assert_equal '0', acct.transaction_uid
|
|
154
|
+
|
|
155
|
+
statement = acct.statement
|
|
156
|
+
|
|
157
|
+
assert_equal 'USD', statement.currency
|
|
158
|
+
assert_equal DateTime.civil(2007,5,9,12,0,0), statement.start_date
|
|
159
|
+
assert_equal DateTime.civil(2007,6,8,12,0,0), statement.end_date
|
|
160
|
+
|
|
161
|
+
transactions = statement.transactions
|
|
162
|
+
assert_equal 3, transactions.size
|
|
163
|
+
|
|
164
|
+
assert_equal :DEBIT, transactions[0].type
|
|
165
|
+
assert_equal OfxParser::Transaction::TYPE[:DEBIT], transactions[0].type_desc
|
|
166
|
+
assert_equal DateTime.civil(2007,5,10,17,0,0), transactions[0].date
|
|
167
|
+
assert_equal '-19.17', transactions[0].amount
|
|
168
|
+
assert_equal -1917, transactions[0].amount_in_pennies
|
|
169
|
+
assert_equal 'xx', transactions[0].fit_id
|
|
170
|
+
assert_equal nil, transactions[0].check_number
|
|
171
|
+
assert_equal '5912', transactions[0].sic
|
|
172
|
+
assert_equal OfxParser::Mcc::CODES['5912'], transactions[0].sic_desc
|
|
173
|
+
assert_equal 'WALGREEN 34638675 ANYTOWN', transactions[0].payee
|
|
174
|
+
assert_equal '', transactions[0].memo
|
|
175
|
+
|
|
176
|
+
assert_equal :DEBIT, transactions[1].type
|
|
177
|
+
assert_equal OfxParser::Transaction::TYPE[:DEBIT], transactions[1].type_desc
|
|
178
|
+
assert_equal DateTime.civil(2007,5,12,17,0,0), transactions[1].date
|
|
179
|
+
assert_equal '-12.0', transactions[1].amount
|
|
180
|
+
assert_equal -1200, transactions[1].amount_in_pennies
|
|
181
|
+
assert_equal 'yy-56', transactions[1].fit_id
|
|
182
|
+
assert_equal nil, transactions[1].check_number
|
|
183
|
+
assert_equal '7933', transactions[1].sic
|
|
184
|
+
assert_equal OfxParser::Mcc::CODES['7933'], transactions[1].sic_desc
|
|
185
|
+
assert_equal 'SUNSET BOWL ANYTOWN', transactions[1].payee
|
|
186
|
+
assert_equal '', transactions[1].memo
|
|
187
|
+
|
|
188
|
+
assert_equal :CREDIT, transactions[2].type
|
|
189
|
+
assert_equal OfxParser::Transaction::TYPE[:CREDIT], transactions[2].type_desc
|
|
190
|
+
assert_equal DateTime.civil(2007,5,26,17,0,0), transactions[2].date
|
|
191
|
+
assert_equal '11.01', transactions[2].amount
|
|
192
|
+
assert_equal 1101, transactions[2].amount_in_pennies
|
|
193
|
+
assert_equal '78-9', transactions[2].fit_id
|
|
194
|
+
assert_equal nil, transactions[2].check_number
|
|
195
|
+
assert_equal '0000', transactions[2].sic
|
|
196
|
+
assert_equal nil, transactions[2].sic_desc
|
|
197
|
+
assert_equal 'ELECTRONIC PAYMENT-THANK YOU', transactions[2].payee
|
|
198
|
+
assert_equal '', transactions[2].memo
|
|
199
|
+
|
|
200
|
+
assert_equal 1, ofx.accounts.size
|
|
201
|
+
assert_equal [], ofx.signup_account_info
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def test_account_listing
|
|
205
|
+
ofx = OfxParser::OfxParser.parse(OFX_FILES[:list])
|
|
206
|
+
|
|
207
|
+
cc_info = ofx.signup_account_info.first
|
|
208
|
+
assert_equal 'CREDIT CARD ************1111', cc_info.desc
|
|
209
|
+
assert_equal 'XXXXXXXXXXXX1111', cc_info.number
|
|
210
|
+
|
|
211
|
+
assert_equal 0, ofx.accounts.size
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
def test_monetary_support_call
|
|
215
|
+
t = OfxParser::Transaction.new
|
|
216
|
+
t.amount = '-11.1'
|
|
217
|
+
|
|
218
|
+
assert_nothing_raised { t.amount_in_pennies }
|
|
219
|
+
assert_raise(NoMethodError) { t.amount_in_whatever }
|
|
220
|
+
|
|
221
|
+
assert t.respond_to?(:amount_in_pennies)
|
|
222
|
+
assert !t.respond_to?(:amount_in_whatever)
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
def test_malformed_header_parses
|
|
226
|
+
assert_nothing_raised do
|
|
227
|
+
OfxParser::OfxParser.parse(OFX_FILES[:malformed_header])
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
class X
|
|
232
|
+
include OfxParser::MonetarySupport
|
|
233
|
+
attr_accessor :amount
|
|
234
|
+
monetary_vars :amount
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
def test_original_method
|
|
238
|
+
x = X.new
|
|
239
|
+
assert_equal :a_b, x.original_method('a_b_in_pennies')
|
|
240
|
+
assert_equal :a, x.original_method('a_in_pennies')
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
def test_for_pennies
|
|
244
|
+
amounts = {
|
|
245
|
+
'-11.1' => -111,
|
|
246
|
+
'-11.110' => -1111,
|
|
247
|
+
'-11.11101' => -1111,
|
|
248
|
+
'11.11' => 1111,
|
|
249
|
+
'11,11' => 1111,
|
|
250
|
+
'1' => 100,
|
|
251
|
+
'1.0' => 100,
|
|
252
|
+
'-1.0' => -100,
|
|
253
|
+
'' => nil
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
x = X.new
|
|
257
|
+
|
|
258
|
+
amounts.each do |actual, expected|
|
|
259
|
+
x.amount = actual
|
|
260
|
+
assert_equal expected, x.amount_in_pennies, "#{actual.inspect} should give #{expected.inspect}"
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
end
|