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.
@@ -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