ofx_for_ruby 0.1.1

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.
Files changed (74) hide show
  1. data/.externalToolBuilders/Rebuild parsers.launch +10 -0
  2. data/.gitignore +9 -0
  3. data/.loadpath +5 -0
  4. data/.project +27 -0
  5. data/COPYING +674 -0
  6. data/Gemfile +2 -0
  7. data/README +47 -0
  8. data/RELEASE_NOTES +45 -0
  9. data/Rakefile +63 -0
  10. data/lib/ofx.rb +60 -0
  11. data/lib/ofx/1.0.2/banking_message_set.rb +261 -0
  12. data/lib/ofx/1.0.2/credit_card_statement_message_set.rb +269 -0
  13. data/lib/ofx/1.0.2/document.rb +34 -0
  14. data/lib/ofx/1.0.2/email_message_set.rb +34 -0
  15. data/lib/ofx/1.0.2/financial_institution_profile_message_set.rb +155 -0
  16. data/lib/ofx/1.0.2/header.rb +48 -0
  17. data/lib/ofx/1.0.2/interbank_funds_transfer_message_set.rb +30 -0
  18. data/lib/ofx/1.0.2/investment_security_list_message_set.rb +30 -0
  19. data/lib/ofx/1.0.2/investment_statement_message_set.rb +30 -0
  20. data/lib/ofx/1.0.2/lexer.rb +135 -0
  21. data/lib/ofx/1.0.2/message_set.rb +165 -0
  22. data/lib/ofx/1.0.2/ofx_102.racc +90 -0
  23. data/lib/ofx/1.0.2/ofx_102.rex +65 -0
  24. data/lib/ofx/1.0.2/parser.rb +215 -0
  25. data/lib/ofx/1.0.2/payment_message_set.rb +30 -0
  26. data/lib/ofx/1.0.2/serializer.rb +114 -0
  27. data/lib/ofx/1.0.2/signon_message_set.rb +121 -0
  28. data/lib/ofx/1.0.2/signup_message_set.rb +186 -0
  29. data/lib/ofx/1.0.2/statements.rb +54 -0
  30. data/lib/ofx/1.0.2/status.rb +30 -0
  31. data/lib/ofx/1.0.2/wire_funds_transfer_message_set.rb +30 -0
  32. data/lib/ofx/banking_message_set.rb +125 -0
  33. data/lib/ofx/credit_card_statement_message_set.rb +104 -0
  34. data/lib/ofx/document.rb +30 -0
  35. data/lib/ofx/email_message_set.rb +42 -0
  36. data/lib/ofx/file_unique_identifier.rb +28 -0
  37. data/lib/ofx/financial_client.rb +76 -0
  38. data/lib/ofx/financial_institution.rb +83 -0
  39. data/lib/ofx/financial_institution_profile_message_set.rb +67 -0
  40. data/lib/ofx/header.rb +115 -0
  41. data/lib/ofx/http/cacert.pem +3509 -0
  42. data/lib/ofx/http/ofx_http_client.rb +84 -0
  43. data/lib/ofx/interbank_funds_transfer_message_set.rb +33 -0
  44. data/lib/ofx/investment_security_list_message_set.rb +33 -0
  45. data/lib/ofx/investment_statement_message_set.rb +33 -0
  46. data/lib/ofx/message_set.rb +78 -0
  47. data/lib/ofx/payment_message_set.rb +33 -0
  48. data/lib/ofx/serializer.rb +39 -0
  49. data/lib/ofx/signon_message_set.rb +141 -0
  50. data/lib/ofx/signup_message_set.rb +84 -0
  51. data/lib/ofx/statements.rb +49 -0
  52. data/lib/ofx/status.rb +100 -0
  53. data/lib/ofx/transaction_unique_identifier.rb +28 -0
  54. data/lib/ofx/version.rb +82 -0
  55. data/lib/ofx/wire_funds_transfer_message_set.rb +33 -0
  56. data/ofx_for_ruby.gemspec +25 -0
  57. data/planning/OFX Specification completion.ods +0 -0
  58. data/test/capital_one/capital_one_helper.rb +77 -0
  59. data/test/capital_one/fixtures/README +10 -0
  60. data/test/capital_one/fixtures/fipid-5599.xml +98 -0
  61. data/test/capital_one/test_banking_statement.rb +108 -0
  62. data/test/capital_one/test_financial_institution_profile.rb +295 -0
  63. data/test/capital_one/test_ofx_http_client.rb +72 -0
  64. data/test/capital_one/test_signup_account_information.rb +100 -0
  65. data/test/citi/citi_helper.rb +77 -0
  66. data/test/citi/fixtures/README +9 -0
  67. data/test/citi/fixtures/fipid-6642.xml +98 -0
  68. data/test/citi/test_credit_card_statement.rb +159 -0
  69. data/test/citi/test_financial_institution_profile.rb +231 -0
  70. data/test/citi/test_ofx_http_client.rb +71 -0
  71. data/test/citi/test_signup_account_information.rb +85 -0
  72. data/test/test_helper.rb +4 -0
  73. data/test/test_ofx_version.rb +141 -0
  74. metadata +210 -0
@@ -0,0 +1,231 @@
1
+ # Copyright © 2007 Chris Guidry <chrisguidry@gmail.com>
2
+ #
3
+ # This file is part of OFX for Ruby.
4
+ #
5
+ # OFX for Ruby is free software; you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation; either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # OFX for Ruby is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+
18
+ require File.dirname(__FILE__) + '/citi_helper'
19
+
20
+ class CitiFinancialInstitutionProfileTest < Test::Unit::TestCase
21
+
22
+ include CitiHelper
23
+
24
+ def setup
25
+ setup_citi_credentials
26
+ end
27
+
28
+ def test_requesting_fresh_fi_profile_from_citi
29
+ financial_institution = OFX::FinancialInstitution.get_institution('Citi')
30
+ requestDocument = financial_institution.create_request_document
31
+
32
+ client = OFX::FinancialClient.new([[OFX::FinancialInstitutionIdentification.new('Citigroup', '24909'),
33
+ OFX::UserCredentials.new(@user_name, @password)]])
34
+ requestDocument.message_sets << client.create_signon_request_message('24909')
35
+
36
+ client.date_of_last_profile_update = DateTime.new(2001, 1, 1)
37
+ requestDocument.message_sets << client.create_profile_update_request_message()
38
+
39
+ response_document = financial_institution.send(requestDocument)
40
+ assert response_document != nil
41
+
42
+ verify_citi_header response_document
43
+
44
+ assert_not_equal nil, response_document.message_sets
45
+ assert_equal 2, response_document.message_sets.length
46
+
47
+ verify_citi_signon_response response_document
48
+
49
+ profile_message = response_document.message_sets[1]
50
+ assert profile_message.kind_of?(OFX::FinancialInstitutionProfileMessageSet)
51
+ assert_equal 1, profile_message.responses.length
52
+ profile_response = profile_message.responses[0]
53
+ assert profile_response.kind_of?(OFX::FinancialInstitutionProfileResponse)
54
+ assert_not_equal nil, profile_response.transaction_identifier
55
+ assert_not_equal nil, profile_response.status
56
+ assert profile_response.status.kind_of?(OFX::Information)
57
+ assert profile_response.status.kind_of?(OFX::Success)
58
+ assert_equal 0, profile_response.status.code
59
+ assert_equal :information, profile_response.status.severity
60
+ assert_equal nil, profile_response.status.message
61
+
62
+ assert_not_equal nil, profile_response.date_of_last_profile_update
63
+ assert_equal "Citigroup", profile_response.financial_institution_name
64
+ assert_equal "8787 Baypine Road", profile_response.address
65
+ assert_equal "Jacksonville", profile_response.city
66
+ assert_equal "FL", profile_response.state
67
+ assert_equal "32256", profile_response.postal_code
68
+ assert_equal "USA", profile_response.country
69
+ assert_equal "1-800-950-5114", profile_response.customer_service_telephone
70
+ assert_equal "1-800-347-4934", profile_response.technical_support_telephone
71
+ assert_equal nil, profile_response.facsimile_telephone
72
+ assert_equal URI.parse("http://www.citicards.com"), profile_response.url
73
+ assert_equal nil, profile_response.email_address
74
+
75
+
76
+
77
+ assert_not_equal nil, profile_response.message_sets
78
+ assert_equal 4, profile_response.message_sets.length
79
+
80
+ # unsupported message sets
81
+ assert_equal nil, profile_response.message_sets[OFX::BankingMessageSet]
82
+ assert_equal nil, profile_response.message_sets[OFX::InvestmentStatementMessageSet]
83
+ assert_equal nil, profile_response.message_sets[OFX::InterbankFundsTransferMessageSet]
84
+ assert_equal nil, profile_response.message_sets[OFX::WireFundsTransferMessageSet]
85
+ assert_equal nil, profile_response.message_sets[OFX::InvestmentSecurityListMessageSet]
86
+ assert_equal nil, profile_response.message_sets[OFX::PaymentMessageSet]
87
+ assert_equal nil, profile_response.message_sets[OFX::EmailMessageSet]
88
+
89
+ # signon
90
+ assert_not_equal nil, profile_response.message_sets[OFX::SignonMessageSet]
91
+ assert_equal 1, profile_response.message_sets[OFX::SignonMessageSet].length
92
+ profile = profile_response.message_sets[OFX::SignonMessageSet][OFX::Version.new(1)]
93
+ assert_not_equal nil, profile
94
+ assert profile.kind_of?(OFX::SignonMessageSetProfile)
95
+ assert_equal OFX::SignonMessageSet, profile.message_set_class
96
+ assert_equal OFX::Version.new(1), profile.version
97
+ assert_equal 'Intelidata', profile.service_provider_name
98
+ assert_equal URI.parse('https://secureofx2.bankhost.com/citi/cgi-forte/ofx_rt?servicename=ofx_rt&pagename=ofx'), profile.message_url
99
+ assert_equal 'NONE', profile.required_ofx_security
100
+ assert_equal true, profile.requires_transport_security?
101
+ assert_equal 'CITI-REALM', profile.signon_realm
102
+ assert_equal 'ENG', profile.language
103
+ assert_equal 'LITE', profile.synchronization_mode
104
+ assert_equal true, profile.supports_response_file_error_recovery?
105
+
106
+ # signup
107
+ assert_not_equal nil, profile_response.message_sets[OFX::SignupMessageSet]
108
+ assert_equal 1, profile_response.message_sets[OFX::SignupMessageSet].length
109
+ profile = profile_response.message_sets[OFX::SignupMessageSet][OFX::Version.new(1)]
110
+ assert_not_equal nil, profile
111
+ assert profile.kind_of?(OFX::SignupMessageSetProfile)
112
+ assert_equal OFX::SignupMessageSet, profile.message_set_class
113
+ assert_equal OFX::Version.new(1), profile.version
114
+ assert_equal 'Intelidata', profile.service_provider_name
115
+ assert_equal URI.parse('https://secureofx2.bankhost.com/citi/cgi-forte/ofx_rt?servicename=ofx_rt&pagename=ofx'), profile.message_url
116
+ assert_equal 'NONE', profile.required_ofx_security
117
+ assert_equal true, profile.requires_transport_security?
118
+ assert_equal 'CITI-REALM', profile.signon_realm
119
+ assert_equal 'ENG', profile.language
120
+ assert_equal 'LITE', profile.synchronization_mode
121
+ assert_equal true, profile.supports_response_file_error_recovery
122
+ assert_not_equal nil, profile.enrollment
123
+ assert profile.enrollment.kind_of?(OFX::Enrollment)
124
+ assert profile.enrollment.kind_of?(OFX::ClientEnrollment)
125
+ assert_equal false, profile.enrollment.account_number_required
126
+ assert_equal false, profile.user_information_changes_allowed?
127
+ assert_equal true, profile.available_account_requests_allowed?
128
+ assert_equal false, profile.service_activation_requests_allowed?
129
+
130
+ # credit cards
131
+ assert_not_equal nil, profile_response.message_sets[OFX::CreditCardStatementMessageSet]
132
+ assert_equal 1, profile_response.message_sets[OFX::CreditCardStatementMessageSet].length
133
+ profile = profile_response.message_sets[OFX::CreditCardStatementMessageSet][OFX::Version.new(1)]
134
+ assert_not_equal nil, profile
135
+ assert profile.kind_of?(OFX::CreditCardStatementMessageSetProfile)
136
+ assert_equal OFX::CreditCardStatementMessageSet, profile.message_set_class
137
+ assert_equal OFX::Version.new(1), profile.version
138
+ assert_equal 'Intelidata', profile.service_provider_name
139
+ assert_equal URI.parse('https://secureofx2.bankhost.com/citi/cgi-forte/ofx_rt?servicename=ofx_rt&pagename=ofx'), profile.message_url
140
+ assert_equal 'NONE', profile.required_ofx_security
141
+ assert_equal true, profile.requires_transport_security?
142
+ assert_equal 'CITI-REALM', profile.signon_realm
143
+ assert_equal 'ENG', profile.language
144
+ assert_equal 'LITE', profile.synchronization_mode
145
+ assert_equal true, profile.supports_response_file_error_recovery?
146
+ assert_equal true, profile.closing_statement_available
147
+
148
+ # profile
149
+ assert_not_equal nil, profile_response.message_sets[OFX::FinancialInstitutionProfileMessageSet]
150
+ assert_equal 1, profile_response.message_sets[OFX::FinancialInstitutionProfileMessageSet].length
151
+ profile = profile_response.message_sets[OFX::FinancialInstitutionProfileMessageSet][OFX::Version.new(1)]
152
+ assert_not_equal nil, profile
153
+ assert profile.kind_of?(OFX::FinancialInstitutionProfileMessageSetProfile)
154
+ assert_equal OFX::FinancialInstitutionProfileMessageSet, profile.message_set_class
155
+ assert_equal OFX::Version.new(1), profile.version
156
+ assert_equal 'Intelidata', profile.service_provider_name
157
+ assert_equal URI.parse('https://secureofx2.bankhost.com/citi/cgi-forte/ofx_rt?servicename=ofx_rt&pagename=ofx'), profile.message_url
158
+ assert_equal 'NONE', profile.required_ofx_security
159
+ assert_equal true, profile.requires_transport_security?
160
+ assert_equal 'CITI-REALM', profile.signon_realm
161
+ assert_equal 'ENG', profile.language
162
+ assert_equal 'LITE', profile.synchronization_mode
163
+ assert_equal true, profile.supports_response_file_error_recovery?
164
+
165
+ assert_not_equal nil, profile_response.signon_realms
166
+ assert_equal 1, profile_response.signon_realms.length
167
+ signon_realm = profile_response.signon_realms[0]
168
+ assert_equal 'CITI-REALM', signon_realm.name
169
+ assert_equal 6..32, signon_realm.password_length_constraint
170
+ assert_equal :alphabetic_or_numeric, signon_realm.password_characters_constraint
171
+ assert_equal false, signon_realm.case_sensitive
172
+ assert_equal true, signon_realm.allows_special_characters
173
+ assert_equal true, signon_realm.allows_spaces
174
+ assert_equal false, signon_realm.supports_pin_changes
175
+ assert_equal false, signon_realm.requires_initial_pin_change
176
+ end
177
+
178
+ # def test_requesting_up_to_date_fi_profile_from_citi
179
+ # financial_institution = OFX::FinancialInstitution.get_institution('Capital One')
180
+ # requestDocument = financial_institution.create_request_document
181
+ #
182
+ # client = OFX::FinancialClient.new([[OFX::FinancialInstitutionIdentification.new('Hibernia', '1001'),
183
+ # OFX::UserCredentials.new(@capitalOneUserName, @capitalOnePassword)]])
184
+ # requestDocument.message_sets << client.create_signon_request_message('1001')
185
+ #
186
+ # client.date_of_last_profile_update = DateTime.now
187
+ # requestDocument.message_sets << client.create_profile_update_request_message()
188
+ #
189
+ # response_document = financial_institution.send(requestDocument)
190
+ # assert response_document != nil
191
+ #
192
+ # verify_citi_header response_document
193
+ #
194
+ # assert_not_equal nil, response_document.message_sets
195
+ # assert_equal 2, response_document.message_sets.length
196
+ #
197
+ # verify_citi_signon_response response_document
198
+ #
199
+ # profile_message = response_document.message_sets[1]
200
+ # assert profile_message.kind_of?(OFX::FinancialInstitutionProfileMessageSet)
201
+ # assert_equal 1, profile_message.responses.length
202
+ # profile_response = profile_message.responses[0]
203
+ # assert profile_response.kind_of?(OFX::FinancialInstitutionProfileResponse)
204
+ # assert_not_equal nil, profile_response.transaction_identifier
205
+ # assert_not_equal nil, profile_response.status
206
+ # assert profile_response.status.kind_of?(OFX::Information)
207
+ # assert profile_response.status.kind_of?(OFX::ClientUpToDate)
208
+ # assert_equal 1, profile_response.status.code
209
+ # assert_equal :information, profile_response.status.severity
210
+ # assert_not_equal nil, profile_response.status.message
211
+ #
212
+ # assert_equal nil, profile_response.date_of_last_profile_update
213
+ # assert_equal nil, profile_response.financial_institution_name
214
+ # assert_equal nil, profile_response.address
215
+ # assert_equal nil, profile_response.city
216
+ # assert_equal nil, profile_response.state
217
+ # assert_equal nil, profile_response.postal_code
218
+ # assert_equal nil, profile_response.country
219
+ # assert_equal nil, profile_response.customer_service_telephone
220
+ # assert_equal nil, profile_response.technical_support_telephone
221
+ # assert_equal nil, profile_response.facsimile_telephone
222
+ # assert_equal nil, profile_response.url
223
+ # assert_equal nil, profile_response.email_address
224
+ #
225
+ # assert_not_equal nil, profile_response.message_sets
226
+ # assert_equal 0, profile_response.message_sets.length
227
+ #
228
+ # assert_not_equal nil, profile_response.signon_realms
229
+ # assert_equal 0, profile_response.signon_realms.length
230
+ # end
231
+ end
@@ -0,0 +1,71 @@
1
+ # Copyright © 2007 Chris Guidry <chrisguidry@gmail.com>
2
+ #
3
+ # This file is part of OFX for Ruby.
4
+ #
5
+ # OFX for Ruby is free software; you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation; either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # OFX for Ruby is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+
18
+ require File.dirname(__FILE__) + '/citi_helper'
19
+
20
+ class CitiOFXHTTPClientTest < Test::Unit::TestCase
21
+
22
+ include CitiHelper
23
+
24
+ def setup
25
+ setup_citi_credentials
26
+ end
27
+
28
+ def test_account_info_request_to_citi
29
+ account_info_request =
30
+ "OFXHEADER:100
31
+ DATA:OFXSGML
32
+ VERSION:102
33
+ SECURITY:NONE
34
+ ENCODING:USASCII
35
+ CHARSET:1252
36
+ COMPRESSION:NONE
37
+ OLDFILEUID:NONE
38
+ NEWFILEUID:20070624162951.735621
39
+
40
+ <OFX>
41
+ <SIGNONMSGSRQV1>
42
+ <SONRQ>
43
+ <DTCLIENT>20070624162951.736219[0:Z]
44
+ <USERID>#{@user_name}
45
+ <USERPASS>#{@password}
46
+ <LANGUAGE>ENG
47
+ <FI>
48
+ <ORG>Citigroup
49
+ <FID>24909
50
+ </FI>
51
+ <APPID>OFX
52
+ <APPVER>0010
53
+ </SONRQ>
54
+ </SIGNONMSGSRQV1>
55
+ <PROFMSGSRQV1>
56
+ <PROFTRNRQ>
57
+ <TRNUID>20070624162951.737132
58
+ <PROFRQ>
59
+ <CLIENTROUTING>MSGSET
60
+ <DTPROFUP>20010101000000.0[0:Z]
61
+ </PROFRQ>
62
+ </PROFTRNRQ>
63
+ </PROFMSGSRQV1>
64
+ </OFX>"
65
+
66
+ client = OFX::HTTPClient.new(URI.parse('https://secureofx2.bankhost.com/citi/cgi-forte/ofx_rt?servicename=ofx_rt&pagename=ofx'))
67
+ account_info_response = client.send(account_info_request)
68
+ assert account_info_response != nil
69
+ assert account_info_response[0..12] == 'OFXHEADER:100'
70
+ end
71
+ end
@@ -0,0 +1,85 @@
1
+ # Copyright © 2007 Chris Guidry <chrisguidry@gmail.com>
2
+ #
3
+ # This file is part of OFX for Ruby.
4
+ #
5
+ # OFX for Ruby is free software; you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation; either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # OFX for Ruby is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+
18
+ require File.dirname(__FILE__) + '/citi_helper'
19
+
20
+ class CitiSignupAccountInformationTest < Test::Unit::TestCase
21
+
22
+ include CitiHelper
23
+
24
+ def setup
25
+ setup_citi_credentials
26
+ setup_citi_accounts
27
+ end
28
+
29
+ def test_requesting_fresh_fi_profile_from_capital_one
30
+ financial_institution = OFX::FinancialInstitution.get_institution('Citi')
31
+ requestDocument = financial_institution.create_request_document
32
+
33
+ client = OFX::FinancialClient.new([[OFX::FinancialInstitutionIdentification.new('Citigroup', '24909'),
34
+ OFX::UserCredentials.new(@user_name, @password)]])
35
+ requestDocument.message_sets << client.create_signon_request_message('24909')
36
+
37
+
38
+ signup_message_set = OFX::SignupMessageSet.new
39
+ account_info_request = OFX::AccountInformationRequest.new
40
+ account_info_request.transaction_identifier = OFX::TransactionUniqueIdentifier.new
41
+ account_info_request.date_of_last_account_update = DateTime.new(2001, 1, 1)
42
+ signup_message_set.requests << account_info_request
43
+ requestDocument.message_sets << signup_message_set
44
+
45
+
46
+ response_document = financial_institution.send(requestDocument)
47
+ assert response_document != nil
48
+
49
+ verify_citi_header response_document
50
+
51
+ assert_not_equal nil, response_document.message_sets
52
+ assert_equal 2, response_document.message_sets.length
53
+
54
+ verify_citi_signon_response response_document
55
+
56
+ signup_message = response_document.message_sets[1]
57
+ assert signup_message.kind_of?(OFX::SignupMessageSet)
58
+ assert_equal 1, signup_message.responses.length
59
+ account_info_response = signup_message.responses[0]
60
+ assert account_info_response.kind_of?(OFX::AccountInformationResponse)
61
+ assert_not_equal nil, account_info_response.transaction_identifier
62
+ assert_not_equal nil, account_info_response.status
63
+ assert account_info_response.status.kind_of?(OFX::Information)
64
+ assert account_info_response.status.kind_of?(OFX::Success)
65
+ assert_equal 0, account_info_response.status.code
66
+ assert_equal :information, account_info_response.status.severity
67
+ assert_equal nil, account_info_response.status.message
68
+
69
+ assert_not_equal nil, account_info_response.date_of_last_account_update
70
+
71
+ assert_not_equal nil, account_info_response.accounts
72
+ assert_equal 1, account_info_response.accounts.length
73
+
74
+ credit_card = account_info_response.accounts[0]
75
+ assert_equal 'CREDIT CARD ************5398', credit_card.description
76
+ assert_equal nil, credit_card.phone_number
77
+ assert_not_equal nil, credit_card.account_information
78
+ assert_not_equal nil, credit_card.account_information.account
79
+ assert_equal @accounts[:credit_card], credit_card.account_information.account.account_identifier
80
+ assert_equal true, credit_card.account_information.supports_transaction_detail_downloads
81
+ assert_equal false, credit_card.account_information.transfer_source
82
+ assert_equal false, credit_card.account_information.transfer_destination
83
+ assert_equal :active, credit_card.account_information.status
84
+ end
85
+ end
@@ -0,0 +1,4 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'test/unit'
4
+ require 'ofx'
@@ -0,0 +1,141 @@
1
+ # Copyright © 2007 Chris Guidry <chrisguidry@gmail.com>
2
+ #
3
+ # This file is part of OFX for Ruby.
4
+ #
5
+ # OFX for Ruby is free software; you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation; either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # OFX for Ruby is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+
18
+ require File.dirname(__FILE__) + '/test_helper'
19
+
20
+ class OFXVersionTest < Test::Unit::TestCase
21
+
22
+ def test_creating_from_array
23
+ version = OFX::Version.new([1, 2, 3])
24
+
25
+ assert_equal OFX::Version.new('1.2.3'), version
26
+
27
+ assert_equal 1, version.major
28
+ assert_equal 2, version.minor
29
+ assert_equal 3, version.revision
30
+
31
+ assert_equal [1, 2, 3], version.to_a
32
+ assert_equal '1.2.3', version.to_dotted_s
33
+ assert_equal '123', version.to_compact_s
34
+ end
35
+
36
+ def test_creating_from_compact_string
37
+ version = OFX::Version.new('123')
38
+
39
+ assert_equal OFX::Version.new('1.2.3'), version
40
+
41
+ assert_equal 1, version.major
42
+ assert_equal 2, version.minor
43
+ assert_equal 3, version.revision
44
+
45
+ assert_equal [1, 2, 3], version.to_a
46
+ assert_equal '1.2.3', version.to_dotted_s
47
+ assert_equal '123', version.to_compact_s
48
+ end
49
+
50
+ def test_creating_from_dotted_string
51
+ version = OFX::Version.new('1.2.3')
52
+
53
+ assert_equal OFX::Version.new([1, 2, 3]), version
54
+
55
+ assert_equal 1, version.major
56
+ assert_equal 2, version.minor
57
+ assert_equal 3, version.revision
58
+
59
+ assert_equal [1, 2, 3], version.to_a
60
+ assert_equal '1.2.3', version.to_dotted_s
61
+ assert_equal '123', version.to_compact_s
62
+ end
63
+
64
+ def test_creating_from_number
65
+ version = OFX::Version.new(1)
66
+
67
+ assert_equal OFX::Version.new([1, 0, 0]), version
68
+
69
+ assert_equal 1, version.major
70
+ assert_equal 0, version.minor
71
+ assert_equal 0, version.revision
72
+
73
+ assert_equal [1, 0, 0], version.to_a
74
+ assert_equal '1.0.0', version.to_dotted_s
75
+ assert_equal '100', version.to_compact_s
76
+ end
77
+
78
+ def test_creating_from_single_character
79
+ version = OFX::Version.new('1')
80
+
81
+ assert_equal OFX::Version.new([1, 0, 0]), version
82
+
83
+ assert_equal 1, version.major
84
+ assert_equal 0, version.minor
85
+ assert_equal 0, version.revision
86
+
87
+ assert_equal [1, 0, 0], version.to_a
88
+ assert_equal '1.0.0', version.to_dotted_s
89
+ assert_equal '100', version.to_compact_s
90
+ end
91
+
92
+ def test_version_comparisons
93
+ low_version = OFX::Version.new('1.0.0')
94
+ low_revision = OFX::Version.new('1.0.1')
95
+ low_upgrade = OFX::Version.new('1.2.0')
96
+ low_upgrade_patch = OFX::Version.new('1.2.1')
97
+ next_version = OFX::Version.new('2.0.1')
98
+ next_version_patch = OFX::Version.new('2.0.2')
99
+ next_version_revision = OFX::Version.new('2.2.0')
100
+
101
+ assert_equal low_version, OFX::Version.new('1.0.0')
102
+ assert_equal low_revision, OFX::Version.new('1.0.1')
103
+ assert_equal low_upgrade, OFX::Version.new('1.2.0')
104
+ assert_equal low_upgrade_patch, OFX::Version.new('1.2.1')
105
+ assert_equal next_version, OFX::Version.new('2.0.1')
106
+ assert_equal next_version_patch, OFX::Version.new('2.0.2')
107
+ assert_equal next_version_revision, OFX::Version.new('2.2.0')
108
+
109
+ assert low_version < low_revision
110
+ assert low_revision < low_upgrade
111
+ assert low_upgrade < low_upgrade_patch
112
+ assert low_upgrade_patch < next_version
113
+ assert next_version < next_version_patch
114
+ assert next_version_patch < next_version_revision
115
+
116
+ assert low_revision > low_version
117
+ assert low_upgrade > low_revision
118
+ assert low_upgrade_patch > low_upgrade
119
+ assert next_version > low_upgrade_patch
120
+ assert next_version_patch > next_version
121
+ assert next_version_revision > next_version_patch
122
+ end
123
+
124
+ def test_version_empty
125
+ assert OFX::Version.new(nil).empty?
126
+ assert OFX::Version.new('').empty?
127
+ assert OFX::Version.new([0, 0, 0]).empty?
128
+ assert OFX::Version.new('000').empty?
129
+ assert OFX::Version.new('0.0.0').empty?
130
+ end
131
+
132
+ def test_as_hash_key
133
+ hash =
134
+ { OFX::Version.new(1) => 1,
135
+ OFX::Version.new(2) => 2}
136
+
137
+ assert_equal 1, hash[OFX::Version.new('1')]
138
+ assert_equal 2, hash[OFX::Version.new('2')]
139
+ assert_equal nil, hash[OFX::Version.new('3')]
140
+ end
141
+ end