ofx-parser-bp 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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