plaider 0.1.0
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.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +11 -0
- data/Gemfile +12 -0
- data/Gemfile.lock +57 -0
- data/LICENSE.txt +22 -0
- data/README.md +91 -0
- data/Rakefile +10 -0
- data/lib/plaider.rb +29 -0
- data/lib/plaider/client.rb +146 -0
- data/lib/plaider/configurable.rb +20 -0
- data/lib/plaider/version.rb +3 -0
- data/plaider.gemspec +24 -0
- data/test/fixtures/balance.json +82 -0
- data/test/fixtures/categories.json +36 -0
- data/test/fixtures/category.json +35 -0
- data/test/fixtures/connect.json +516 -0
- data/test/fixtures/connect_invalid.json +5 -0
- data/test/fixtures/connect_mfa.json +9 -0
- data/test/fixtures/connect_mfa_invalid.json +5 -0
- data/test/fixtures/delete_user.json +3 -0
- data/test/fixtures/entity.json +19 -0
- data/test/fixtures/institution.json +15 -0
- data/test/fixtures/institutions.json +175 -0
- data/test/plaider/client_test.rb +204 -0
- data/test/plaider/plaider_test.rb +50 -0
- data/test/test_helper.rb +45 -0
- metadata +115 -0
@@ -0,0 +1,19 @@
|
|
1
|
+
{
|
2
|
+
"_id": "539c40548590c9d05eaec20a",
|
3
|
+
"name": "Apple Store",
|
4
|
+
"_category": {
|
5
|
+
"_id": "52544965f71e87d00700018a",
|
6
|
+
"hierarchy": {
|
7
|
+
"0": "Shops",
|
8
|
+
"1": "Computers and Electronics",
|
9
|
+
"2": ""
|
10
|
+
}
|
11
|
+
},
|
12
|
+
"meta": {
|
13
|
+
"location": {
|
14
|
+
"address": "1 Stockton St",
|
15
|
+
"city": "San Francisco",
|
16
|
+
"state": "CA"
|
17
|
+
}
|
18
|
+
}
|
19
|
+
}
|
@@ -0,0 +1,175 @@
|
|
1
|
+
[
|
2
|
+
{
|
3
|
+
"credentials": {
|
4
|
+
"password": "Password",
|
5
|
+
"username": "User ID"
|
6
|
+
},
|
7
|
+
"has_mfa": false,
|
8
|
+
"id": "5301a9d704977c52b60000db",
|
9
|
+
"mfa": [],
|
10
|
+
"name": "American Express",
|
11
|
+
"type": "amex",
|
12
|
+
"products": [
|
13
|
+
"connect",
|
14
|
+
"balance"
|
15
|
+
]
|
16
|
+
},
|
17
|
+
{
|
18
|
+
"credentials": {
|
19
|
+
"password": "Password",
|
20
|
+
"username": "Online ID"
|
21
|
+
},
|
22
|
+
"has_mfa": true,
|
23
|
+
"id": "5301a93ac140de84910000e0",
|
24
|
+
"mfa": [
|
25
|
+
"code",
|
26
|
+
"list",
|
27
|
+
"questions(3)"
|
28
|
+
],
|
29
|
+
"name": "Bank of America",
|
30
|
+
"type": "bofa",
|
31
|
+
"products": [
|
32
|
+
"connect",
|
33
|
+
"auth",
|
34
|
+
"balance"
|
35
|
+
]
|
36
|
+
},
|
37
|
+
{
|
38
|
+
"credentials": {
|
39
|
+
"password": "PIN",
|
40
|
+
"username": "Username or Customer Number"
|
41
|
+
},
|
42
|
+
"has_mfa": false,
|
43
|
+
"id": "53c5c8631f9bda09c7000222",
|
44
|
+
"mfa": [],
|
45
|
+
"name": "Capital One 360",
|
46
|
+
"type": "capone360",
|
47
|
+
"products": [
|
48
|
+
"auth",
|
49
|
+
"balance"
|
50
|
+
]
|
51
|
+
},
|
52
|
+
{
|
53
|
+
"credentials": {
|
54
|
+
"password": "Password",
|
55
|
+
"username": "Login ID"
|
56
|
+
},
|
57
|
+
"has_mfa": false,
|
58
|
+
"id": "53b34fab1a73941962000186",
|
59
|
+
"mfa": [],
|
60
|
+
"name": "Charles Schwab",
|
61
|
+
"type": "schwab",
|
62
|
+
"products": [
|
63
|
+
"auth",
|
64
|
+
"balance"
|
65
|
+
]
|
66
|
+
},
|
67
|
+
{
|
68
|
+
"credentials": {
|
69
|
+
"password": "Password",
|
70
|
+
"username": "User ID"
|
71
|
+
},
|
72
|
+
"has_mfa": true,
|
73
|
+
"id": "5301a99504977c52b60000d0",
|
74
|
+
"mfa": [
|
75
|
+
"code",
|
76
|
+
"list"
|
77
|
+
],
|
78
|
+
"name": "Chase",
|
79
|
+
"type": "chase",
|
80
|
+
"products": [
|
81
|
+
"connect",
|
82
|
+
"auth",
|
83
|
+
"balance",
|
84
|
+
"info"
|
85
|
+
]
|
86
|
+
},
|
87
|
+
{
|
88
|
+
"credentials": {
|
89
|
+
"password": "Password",
|
90
|
+
"username": "User ID"
|
91
|
+
},
|
92
|
+
"has_mfa": true,
|
93
|
+
"id": "5301aa306b3f82a00500018b",
|
94
|
+
"mfa": [
|
95
|
+
"questions",
|
96
|
+
"selections"
|
97
|
+
],
|
98
|
+
"name": "Citi",
|
99
|
+
"type": "citi",
|
100
|
+
"products": [
|
101
|
+
"connect",
|
102
|
+
"auth",
|
103
|
+
"balance"
|
104
|
+
]
|
105
|
+
},
|
106
|
+
{
|
107
|
+
"credentials": {
|
108
|
+
"password": "Password",
|
109
|
+
"username": "Username"
|
110
|
+
},
|
111
|
+
"has_mfa": false,
|
112
|
+
"id": "53cee1d8c003c2747b000051",
|
113
|
+
"mfa": [],
|
114
|
+
"name": "Fidelity",
|
115
|
+
"type": "fidelity",
|
116
|
+
"products": [
|
117
|
+
"auth",
|
118
|
+
"balance"
|
119
|
+
]
|
120
|
+
},
|
121
|
+
{
|
122
|
+
"credentials": {
|
123
|
+
"password": "Password",
|
124
|
+
"pin": "PIN",
|
125
|
+
"username": "Online ID"
|
126
|
+
},
|
127
|
+
"has_mfa": true,
|
128
|
+
"id": "531ea6602ad939b68700047c",
|
129
|
+
"mfa": [
|
130
|
+
"questions(3)"
|
131
|
+
],
|
132
|
+
"name": "USAA",
|
133
|
+
"type": "usaa",
|
134
|
+
"products": [
|
135
|
+
"connect",
|
136
|
+
"auth",
|
137
|
+
"balance"
|
138
|
+
]
|
139
|
+
},
|
140
|
+
{
|
141
|
+
"credentials": {
|
142
|
+
"password": "Password",
|
143
|
+
"username": "Personal ID"
|
144
|
+
},
|
145
|
+
"has_mfa": true,
|
146
|
+
"id": "531ea6327de8211c80000440",
|
147
|
+
"mfa": [
|
148
|
+
"questions(1)"
|
149
|
+
],
|
150
|
+
"name": "US Bank",
|
151
|
+
"type": "us",
|
152
|
+
"products": [
|
153
|
+
"connect",
|
154
|
+
"auth",
|
155
|
+
"balance"
|
156
|
+
]
|
157
|
+
},
|
158
|
+
{
|
159
|
+
"credentials": {
|
160
|
+
"password": "Password",
|
161
|
+
"username": "Username"
|
162
|
+
},
|
163
|
+
"has_mfa": false,
|
164
|
+
"id": "5301aa096b3f822b440001cb",
|
165
|
+
"mfa": [],
|
166
|
+
"name": "Wells Fargo",
|
167
|
+
"type": "wells",
|
168
|
+
"products": [
|
169
|
+
"connect",
|
170
|
+
"auth",
|
171
|
+
"balance",
|
172
|
+
"info"
|
173
|
+
]
|
174
|
+
}
|
175
|
+
]
|
@@ -0,0 +1,204 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ClientTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@client = Plaider::Client.new(
|
6
|
+
{
|
7
|
+
client_id: 'client_id',
|
8
|
+
secret: 'secret',
|
9
|
+
access_token: 'access_token'
|
10
|
+
}
|
11
|
+
)
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_arguments
|
15
|
+
assert_equal 'client_id', @client.instance_variable_get(:'@client_id')
|
16
|
+
assert_equal 'secret', @client.instance_variable_get(:'@secret')
|
17
|
+
assert_equal 'access_token', @client.instance_variable_get(:'@access_token')
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_institutions
|
21
|
+
stub_get('/institutions').to_return(body: fixture('institutions.json'))
|
22
|
+
response = @client.institutions
|
23
|
+
assert_not_nil response
|
24
|
+
result = response[:result]
|
25
|
+
assert_not_nil result
|
26
|
+
assert_equal result.size, 10
|
27
|
+
assert_equal result[0][:id], '5301a9d704977c52b60000db'
|
28
|
+
assert_equal result[0][:type], 'amex'
|
29
|
+
assert_equal result[0][:name], 'American Express'
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_institution
|
33
|
+
institution_id = '5301a9d704977c52b60000db'
|
34
|
+
stub_get("/institutions/#{institution_id}").to_return(body: fixture('institution.json'))
|
35
|
+
response = @client.institution(institution_id)
|
36
|
+
assert_not_nil response
|
37
|
+
result = response[:result]
|
38
|
+
assert_not_nil result
|
39
|
+
assert_equal institution_id, result[:id]
|
40
|
+
assert_equal 'amex', result[:type]
|
41
|
+
assert_equal 'American Express', result[:name]
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_institution_with_bad_args
|
45
|
+
[nil, ''].each do |arg|
|
46
|
+
exception = assert_raise(ArgumentError) { @client.institution(arg) }
|
47
|
+
assert_equal('institution_id is required', exception.message)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_add_user
|
52
|
+
stub_post('/connect').to_return(body: fixture('connect.json'))
|
53
|
+
response = @client.add_user('institution_type', 'username', 'password', 'test@testemail.com')
|
54
|
+
assert_not_nil response
|
55
|
+
assert_not_nil '200', response[:status_code]
|
56
|
+
result = response[:result]
|
57
|
+
assert_not_nil result
|
58
|
+
assert_not_nil result[:accounts]
|
59
|
+
assert_equal 4, result[:accounts].size
|
60
|
+
assert_equal 1203.42, result[:accounts][0][:balance][:available]
|
61
|
+
assert_equal 1274.93, result[:accounts][0][:balance][:current]
|
62
|
+
assert_equal 'fake_institution', result[:accounts][0][:institution_type]
|
63
|
+
assert_equal 'depository', result[:accounts][0][:type]
|
64
|
+
assert_not_nil result[:transactions]
|
65
|
+
assert_equal 16, result[:transactions].size
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_add_user_with_invalid_credencials
|
69
|
+
stub_post('/connect').to_return(body: fixture('connect_invalid.json'))
|
70
|
+
response = @client.add_user('institution_type', 'username', 'password', 'test@testemail.com')
|
71
|
+
assert_not_nil response
|
72
|
+
result = response[:result]
|
73
|
+
assert_not_nil result
|
74
|
+
assert_equal 'invalid credentials', result[:message]
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_add_user_with_mfa
|
78
|
+
stub_post('/connect').to_return(status: 201, body: fixture('connect_mfa.json'))
|
79
|
+
response = @client.add_user('institution_type', 'username', 'password', 'test@testemail.com')
|
80
|
+
assert_not_nil response
|
81
|
+
assert_not_nil '201', response[:status_code]
|
82
|
+
result = response[:result]
|
83
|
+
assert_not_nil result
|
84
|
+
assert_equal 'You say tomato, I say...?', result[:mfa][0][:question]
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_user_confirmation
|
88
|
+
stub_post('/connect/step').to_return(body: fixture('connect.json'))
|
89
|
+
response = @client.user_confirmation('tomato')
|
90
|
+
assert_not_nil response
|
91
|
+
result = response[:result]
|
92
|
+
assert_not_nil result
|
93
|
+
assert_not_nil result[:accounts]
|
94
|
+
assert_equal 4, result[:accounts].size
|
95
|
+
assert_equal 1203.42, result[:accounts][0][:balance][:available]
|
96
|
+
assert_equal 1274.93, result[:accounts][0][:balance][:current]
|
97
|
+
assert_equal 'fake_institution', result[:accounts][0][:institution_type]
|
98
|
+
assert_equal 'depository', result[:accounts][0][:type]
|
99
|
+
assert_not_nil result[:transactions]
|
100
|
+
assert_equal 16, result[:transactions].size
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_user_confirmation_with_invalid_answer
|
104
|
+
stub_post('/connect/step').to_return(body: fixture('connect_mfa_invalid.json'))
|
105
|
+
response = @client.user_confirmation('abc')
|
106
|
+
assert_not_nil response
|
107
|
+
result = response[:result]
|
108
|
+
assert_not_nil result
|
109
|
+
assert_equal 'invalid mfa', result[:message]
|
110
|
+
end
|
111
|
+
|
112
|
+
def test_transactions
|
113
|
+
stub_post('/connect/get').to_return(body: fixture('connect.json'))
|
114
|
+
response = @client.transactions
|
115
|
+
result = response[:result]
|
116
|
+
assert_not_nil result
|
117
|
+
assert_not_nil result[:accounts]
|
118
|
+
assert_equal 4, result[:accounts].size
|
119
|
+
assert_equal 1203.42, result[:accounts][0][:balance][:available]
|
120
|
+
assert_equal 1274.93, result[:accounts][0][:balance][:current]
|
121
|
+
assert_equal 'fake_institution', result[:accounts][0][:institution_type]
|
122
|
+
assert_equal 'depository', result[:accounts][0][:type]
|
123
|
+
assert_not_nil result[:transactions]
|
124
|
+
assert_equal 16, result[:transactions].size
|
125
|
+
end
|
126
|
+
|
127
|
+
def test_transactions_valid_args
|
128
|
+
stub_post('/connect/get').to_return(body: fixture('connect.json'))
|
129
|
+
response = @client.transactions('123456789', Date.today - 30, Date.today, true)
|
130
|
+
result = response[:result]
|
131
|
+
assert_not_nil result
|
132
|
+
assert_not_nil result[:accounts]
|
133
|
+
assert_equal 4, result[:accounts].size
|
134
|
+
assert_equal 1203.42, result[:accounts][0][:balance][:available]
|
135
|
+
assert_equal 1274.93, result[:accounts][0][:balance][:current]
|
136
|
+
assert_equal 'fake_institution', result[:accounts][0][:institution_type]
|
137
|
+
assert_equal 'depository', result[:accounts][0][:type]
|
138
|
+
assert_not_nil result[:transactions]
|
139
|
+
assert_equal 16, result[:transactions].size
|
140
|
+
end
|
141
|
+
|
142
|
+
def test_update_user
|
143
|
+
stub_patch('/connect').to_return(body: fixture('connect_mfa.json'))
|
144
|
+
response = @client.update_user('username', 'password')
|
145
|
+
assert_not_nil response
|
146
|
+
assert_not_nil '201', response[:status_code]
|
147
|
+
result = response[:result]
|
148
|
+
assert_not_nil result
|
149
|
+
assert_equal 'You say tomato, I say...?', result[:mfa][0][:question]
|
150
|
+
end
|
151
|
+
|
152
|
+
def test_delete_user
|
153
|
+
stub_delete('/connect').to_return(body: fixture('delete_user.json'))
|
154
|
+
response = @client.delete_user
|
155
|
+
assert_not_nil response
|
156
|
+
result = response[:result]
|
157
|
+
assert_not_nil result
|
158
|
+
assert_equal 'Successfully removed from system', result[:message]
|
159
|
+
end
|
160
|
+
|
161
|
+
def test_balance
|
162
|
+
stub_post('/balance').to_return(body: fixture('balance.json'))
|
163
|
+
response = @client.balance
|
164
|
+
assert_not_nil response
|
165
|
+
result = response[:result]
|
166
|
+
assert_not_nil result
|
167
|
+
assert_not_nil result[:accounts]
|
168
|
+
assert_equal 4, result[:accounts].size
|
169
|
+
assert_equal 1203.42, result[:accounts][0][:balance][:available]
|
170
|
+
assert_equal 1274.93, result[:accounts][0][:balance][:current]
|
171
|
+
assert_equal 'fake_institution', result[:accounts][0][:institution_type]
|
172
|
+
assert_equal 'depository', result[:accounts][0][:type]
|
173
|
+
end
|
174
|
+
|
175
|
+
def test_categories
|
176
|
+
stub_get('/categories').to_return(body: fixture('categories.json'))
|
177
|
+
response = @client.categories
|
178
|
+
assert_not_nil response
|
179
|
+
result = response[:result]
|
180
|
+
assert_not_nil result
|
181
|
+
assert_equal 4, result.size
|
182
|
+
end
|
183
|
+
|
184
|
+
def test_category
|
185
|
+
stub_get('/categories/52544965f71e87d007000008').to_return(body: fixture('category.json'))
|
186
|
+
response = @client.category('52544965f71e87d007000008')
|
187
|
+
assert_not_nil response
|
188
|
+
result = response[:result]
|
189
|
+
assert_not_nil result
|
190
|
+
assert_not_nil result[:mappings]
|
191
|
+
assert_equal 3, result[:mappings].size
|
192
|
+
assert_equal 'Arts and Entertainment', result[:hierarchy][0]
|
193
|
+
end
|
194
|
+
|
195
|
+
def test_entity
|
196
|
+
stub_get('/entities/539c40548590c9d05eaec20a').to_return(body: fixture('entity.json'))
|
197
|
+
response = @client.entity('539c40548590c9d05eaec20a')
|
198
|
+
assert_not_nil response
|
199
|
+
result = response[:result]
|
200
|
+
assert_not_nil result
|
201
|
+
assert_equal 'Apple Store', result[:name]
|
202
|
+
end
|
203
|
+
|
204
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class PlaiderTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
Plaider.configure do |config|
|
6
|
+
config.client_id = 'client_id'
|
7
|
+
config.secret = 'secret'
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_configure
|
12
|
+
configurable = Plaider.configure do |config|
|
13
|
+
config.client_id = 'client_id'
|
14
|
+
config.secret = 'secret'
|
15
|
+
config.access_token = 'access_token'
|
16
|
+
config.open_timeout = 5
|
17
|
+
config.read_timeout = 30
|
18
|
+
end
|
19
|
+
assert_equal 'client_id', configurable.instance_variable_get(:'@client_id')
|
20
|
+
assert_equal 'secret', configurable.instance_variable_get(:'@secret')
|
21
|
+
assert_equal 'access_token', configurable.instance_variable_get(:'@access_token')
|
22
|
+
assert_equal 5, configurable.instance_variable_get(:'@open_timeout')
|
23
|
+
assert_equal 30, configurable.instance_variable_get(:'@read_timeout')
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_scope
|
27
|
+
client1 = Plaider.scope('1')
|
28
|
+
assert_true client1.is_a?(Plaider::Client)
|
29
|
+
assert_equal 'client_id', client1.instance_variable_get(:'@client_id')
|
30
|
+
assert_equal 'secret', client1.instance_variable_get(:'@secret')
|
31
|
+
client2 = Plaider.client
|
32
|
+
assert_equal client1, client2
|
33
|
+
client3 = Plaider.scope('1')
|
34
|
+
assert_equal client1, client3
|
35
|
+
client4 = Plaider.scope('2')
|
36
|
+
assert_not_equal client1, client4
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_static_call
|
40
|
+
stub_get('/institutions').to_return(body: fixture('institutions.json'))
|
41
|
+
response = Plaider.institutions
|
42
|
+
assert_not_nil response
|
43
|
+
result = response[:result]
|
44
|
+
assert_not_nil result
|
45
|
+
assert_equal result.size, 10
|
46
|
+
assert_equal result[0][:id], '5301a9d704977c52b60000db'
|
47
|
+
assert_equal result[0][:type], 'amex'
|
48
|
+
assert_equal result[0][:name], 'American Express'
|
49
|
+
end
|
50
|
+
end
|