old_plaid 1.7.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.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/PUBLISHING.md +21 -0
- data/README.md +125 -0
- data/Rakefile +8 -0
- data/lib/old_plaid.rb +100 -0
- data/lib/old_plaid/config.rb +19 -0
- data/lib/old_plaid/connection.rb +109 -0
- data/lib/old_plaid/errors.rb +27 -0
- data/lib/old_plaid/models/account.rb +24 -0
- data/lib/old_plaid/models/category.rb +17 -0
- data/lib/old_plaid/models/exchange_token_response.rb +11 -0
- data/lib/old_plaid/models/info.rb +12 -0
- data/lib/old_plaid/models/institution.rb +22 -0
- data/lib/old_plaid/models/transaction.rb +24 -0
- data/lib/old_plaid/models/user.rb +189 -0
- data/lib/old_plaid/version.rb +3 -0
- data/old_plaid.gemspec +28 -0
- data/spec/old_plaid_spec.rb +263 -0
- data/spec/plaid/config_spec.rb +67 -0
- data/spec/plaid/connection_spec.rb +191 -0
- data/spec/plaid/error_spec.rb +10 -0
- data/spec/plaid/models/account_spec.rb +37 -0
- data/spec/plaid/models/category_spec.rb +16 -0
- data/spec/plaid/models/institution_spec.rb +19 -0
- data/spec/plaid/models/transaction_spec.rb +28 -0
- data/spec/plaid/models/user_spec.rb +172 -0
- data/spec/spec_helper.rb +14 -0
- metadata +170 -0
@@ -0,0 +1,67 @@
|
|
1
|
+
describe 'OldPlaid.config' do
|
2
|
+
around(:each) do |example|
|
3
|
+
old_customer_id = OldPlaid.customer_id
|
4
|
+
old_secret = OldPlaid.secret
|
5
|
+
old_environment_location = OldPlaid.environment_location
|
6
|
+
|
7
|
+
OldPlaid.config do |p|
|
8
|
+
p.customer_id = customer_id
|
9
|
+
p.secret = secret
|
10
|
+
p.environment_location = environment_location
|
11
|
+
end
|
12
|
+
|
13
|
+
example.run
|
14
|
+
|
15
|
+
OldPlaid.config do |p|
|
16
|
+
p.customer_id = old_customer_id
|
17
|
+
p.secret = old_secret
|
18
|
+
p.environment_location = old_environment_location
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
let(:customer_id) { 'test_id' }
|
23
|
+
let(:secret) { 'test_secret' }
|
24
|
+
let(:dev_url) { 'https://tartan.plaid.com/' }
|
25
|
+
let(:prod_url) { 'https://api.plaid.com/' }
|
26
|
+
|
27
|
+
|
28
|
+
let(:user) { OldPlaid.add_user('connect', 'plaid_test', 'plaid_good', 'wells') }
|
29
|
+
|
30
|
+
context ':environment_location' do
|
31
|
+
context 'with trailing slash' do
|
32
|
+
let(:environment_location) { 'http://example.org/' }
|
33
|
+
it 'leaves it as-is' do
|
34
|
+
expect(OldPlaid.environment_location).to eql(environment_location)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'without trailing slash' do
|
39
|
+
let(:environment_location) { 'http://example.org' }
|
40
|
+
it 'adds a trailing slash' do
|
41
|
+
expect(OldPlaid.environment_location).to eql(environment_location + '/')
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context 'has valid dev keys' do
|
47
|
+
let(:environment_location) { dev_url }
|
48
|
+
it { expect(user).to be_instance_of OldPlaid::User }
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'has valid production keys' do
|
52
|
+
let(:environment_location) { prod_url }
|
53
|
+
it { expect(user).to be_instance_of OldPlaid::User }
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'has invalid dev keys' do
|
57
|
+
let(:secret) { 'test_bad' }
|
58
|
+
let(:environment_location) { dev_url }
|
59
|
+
it { expect { user }.to raise_error(OldPlaid::Unauthorized, 'secret or client_id invalid') }
|
60
|
+
end
|
61
|
+
|
62
|
+
context 'has invalid production keys' do
|
63
|
+
let(:secret) { 'test_bad' }
|
64
|
+
let(:environment_location) { prod_url }
|
65
|
+
it { expect { user }.to raise_error(OldPlaid::Unauthorized, 'secret or client_id invalid') }
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,191 @@
|
|
1
|
+
describe OldPlaid::Connection do
|
2
|
+
let(:stub_url) { "https://tartan.plaid.com/testing" }
|
3
|
+
let(:bad_req_response) { {"code" => 1005, "message" => "invalid credentials", "resolve" => "The username or password provided is not correct."}.to_json }
|
4
|
+
let(:unauth_response) { {"code" => 1105, "message" => "bad access_token", "resolve" => "This access_token appears to be corrupted."}.to_json }
|
5
|
+
let(:req_fail_response) { {"code" => 1200, "message" => "invalid credentials", "resolve" => "The username or password provided is not correct."}.to_json }
|
6
|
+
let(:req_not_found) { {"code" => 1600, "message" => "product not found", "resolve" => "This product doesn't exist yet, we're actually not sure how you reached this error..."}.to_json }
|
7
|
+
|
8
|
+
describe "#post" do
|
9
|
+
it "sends a post request" do
|
10
|
+
stub = stub_request(:post, stub_url).to_return({:body => {"response" => "OK"}.to_json})
|
11
|
+
OldPlaid::Connection.post("testing")
|
12
|
+
expect(stub).to have_requested(:post, stub_url)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "returns response on 200 response" do
|
16
|
+
stub = stub_request(:post, stub_url).to_return({:body => {"response" => "OK"}.to_json})
|
17
|
+
response = OldPlaid::Connection.post("testing")
|
18
|
+
expect(response).to eq({"response" => "OK"})
|
19
|
+
end
|
20
|
+
|
21
|
+
it "returns message on 201 response" do
|
22
|
+
stub = stub_request(:post, stub_url).to_return(status: 201, body: {"response" => "OK"}.to_json)
|
23
|
+
response = OldPlaid::Connection.post("testing")
|
24
|
+
expect(response).to eq({:msg => "Requires further authentication", :body => {"response" => "OK"}})
|
25
|
+
end
|
26
|
+
|
27
|
+
it "throws OldPlaid::BadRequest on 400 response" do
|
28
|
+
stub = stub_request(:post, stub_url).to_return(status: 400, body: bad_req_response)
|
29
|
+
expect { OldPlaid::Connection.post("testing") }.to raise_error(OldPlaid::BadRequest, "invalid credentials")
|
30
|
+
end
|
31
|
+
|
32
|
+
it "throws OldPlaid::Unauthorized on 401 response" do
|
33
|
+
stub = stub_request(:post, stub_url).to_return(status: 401, body: unauth_response)
|
34
|
+
expect { OldPlaid::Connection.post("testing") }.to raise_error(OldPlaid::Unauthorized, "bad access_token")
|
35
|
+
end
|
36
|
+
|
37
|
+
it "throws OldPlaid::RequestFailed on 402 response" do
|
38
|
+
stub = stub_request(:post, stub_url).to_return(status: 402, body: req_fail_response)
|
39
|
+
expect { OldPlaid::Connection.post("testing") }.to raise_error(OldPlaid::RequestFailed, "invalid credentials")
|
40
|
+
end
|
41
|
+
|
42
|
+
it "throws a OldPlaid::NotFound on 404 response" do
|
43
|
+
stub = stub_request(:post, stub_url).to_return(status: 404, body: req_not_found)
|
44
|
+
expect { OldPlaid::Connection.post("testing") }.to raise_error(OldPlaid::NotFound, "product not found")
|
45
|
+
end
|
46
|
+
|
47
|
+
it "throws a OldPlaid::ServerError on empty response" do
|
48
|
+
stub = stub_request(:post, stub_url).to_return(status: 504, body: '')
|
49
|
+
expect { OldPlaid::Connection.post("testing") }.to raise_error(OldPlaid::ServerError, '')
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "#get" do
|
54
|
+
it "sends a get request" do
|
55
|
+
stub = stub_request(:get, stub_url).to_return({:body => {"response" => "OK"}.to_json})
|
56
|
+
OldPlaid::Connection.get("testing")
|
57
|
+
expect(stub).to have_requested(:get, stub_url)
|
58
|
+
end
|
59
|
+
|
60
|
+
it "returns response when no code available" do
|
61
|
+
stub = stub_request(:get, stub_url).to_return({:body => {"response" => "OK"}.to_json})
|
62
|
+
response = OldPlaid::Connection.get("testing")
|
63
|
+
expect(response).to eq({"response" => "OK"})
|
64
|
+
end
|
65
|
+
|
66
|
+
it "returns response when code not [1301, 1401, 1501, 1601]" do
|
67
|
+
stub = stub_request(:get, stub_url).to_return({:body => {"code" => 1502, "response" => "OK"}.to_json})
|
68
|
+
response = OldPlaid::Connection.get("testing")
|
69
|
+
expect(response).to eq({"code" => 1502, "response" => "OK"})
|
70
|
+
end
|
71
|
+
|
72
|
+
it "throws 404 for 1301 code" do
|
73
|
+
stub = stub_request(:get, stub_url).to_return({:body => {"code" => 1301, "message" => "Doesn't matter", "resolve" => "Yep."}.to_json})
|
74
|
+
expect { OldPlaid::Connection.get("testing")}.to raise_error(OldPlaid::NotFound, "Doesn't matter")
|
75
|
+
end
|
76
|
+
|
77
|
+
it "throws 404 for 1401 code" do
|
78
|
+
stub = stub_request(:get, stub_url).to_return({:body => {"code" => 1401, "message" => "Doesn't matter", "resolve" => "Yep."}.to_json})
|
79
|
+
expect { OldPlaid::Connection.get("testing")}.to raise_error(OldPlaid::NotFound, "Doesn't matter")
|
80
|
+
end
|
81
|
+
|
82
|
+
it "throws 404 for 1501 code" do
|
83
|
+
stub = stub_request(:get, stub_url).to_return({:body => {"code" => 1501, "message" => "Doesn't matter", "resolve" => "Yep."}.to_json})
|
84
|
+
expect { OldPlaid::Connection.get("testing")}.to raise_error(OldPlaid::NotFound, "Doesn't matter")
|
85
|
+
end
|
86
|
+
|
87
|
+
it "throws 404 for 1601 code" do
|
88
|
+
stub = stub_request(:get, stub_url).to_return({:body => {"code" => 1601, "message" => "Doesn't matter", "resolve" => "Yep."}.to_json})
|
89
|
+
expect { OldPlaid::Connection.get("testing")}.to raise_error(OldPlaid::NotFound, "Doesn't matter")
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
describe "#secure_get" do
|
95
|
+
it "sends a secure get request" do
|
96
|
+
stub = stub_request(:get, stub_url).to_return({:body => {"response" => "OK"}.to_json})
|
97
|
+
OldPlaid::Connection.secure_get("testing", "test_wells")
|
98
|
+
expect(stub).to have_requested(:get, stub_url).with(:body => {:access_token => "test_wells"})
|
99
|
+
end
|
100
|
+
|
101
|
+
it "returns response on 200 response" do
|
102
|
+
stub = stub_request(:get, stub_url).to_return({:body => {"response" => "OK"}.to_json})
|
103
|
+
response = OldPlaid::Connection.secure_get("testing", "test_wells")
|
104
|
+
expect(response).to eq({"response" => "OK"})
|
105
|
+
end
|
106
|
+
|
107
|
+
it "returns message on 201 response" do
|
108
|
+
stub = stub_request(:get, stub_url).to_return(status: 201, body: {"response" => "OK"}.to_json)
|
109
|
+
response = OldPlaid::Connection.secure_get("testing", "test_wells")
|
110
|
+
expect(response).to eq({:msg => "Requires further authentication", :body => {"response" => "OK"}})
|
111
|
+
end
|
112
|
+
|
113
|
+
it "throws OldPlaid::BadRequest on 400 response" do
|
114
|
+
stub = stub_request(:get, stub_url).to_return(status: 400, body: bad_req_response)
|
115
|
+
expect { OldPlaid::Connection.secure_get("testing", "test_wells") }.to raise_error(OldPlaid::BadRequest, "invalid credentials")
|
116
|
+
end
|
117
|
+
|
118
|
+
it "throws OldPlaid::Unauthorized on 401 response" do
|
119
|
+
stub = stub_request(:get, stub_url).to_return(status: 401, body: unauth_response)
|
120
|
+
expect { OldPlaid::Connection.secure_get("testing", "test_wells") }.to raise_error(OldPlaid::Unauthorized, "bad access_token")
|
121
|
+
end
|
122
|
+
|
123
|
+
it "throws OldPlaid::RequestFailed on 402 response" do
|
124
|
+
stub = stub_request(:get, stub_url).to_return(status: 402, body: req_fail_response)
|
125
|
+
expect { OldPlaid::Connection.secure_get("testing", "test_wells") }.to raise_error(OldPlaid::RequestFailed, "invalid credentials")
|
126
|
+
end
|
127
|
+
|
128
|
+
it "throws a OldPlaid::NotFound on 404 response" do
|
129
|
+
stub = stub_request(:get, stub_url).to_return(status: 404, body: req_not_found)
|
130
|
+
expect { OldPlaid::Connection.secure_get("testing", "test_wells") }.to raise_error(OldPlaid::NotFound, "product not found")
|
131
|
+
end
|
132
|
+
|
133
|
+
it "throws a OldPlaid::ServerError on empty response" do
|
134
|
+
stub = stub_request(:get, stub_url).to_return(status: 504, body: '')
|
135
|
+
expect { OldPlaid::Connection.secure_get("testing", "test_wells") }.to raise_error(OldPlaid::ServerError, '')
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
describe "#patch" do
|
140
|
+
it "sends a patch request" do
|
141
|
+
stub = stub_request(:patch, stub_url).to_return({:body => {"response" => "OK"}.to_json})
|
142
|
+
OldPlaid::Connection.patch("testing")
|
143
|
+
expect(stub).to have_requested(:patch, stub_url)
|
144
|
+
end
|
145
|
+
|
146
|
+
it "returns response on 200 response" do
|
147
|
+
stub = stub_request(:patch, stub_url).to_return({:body => {"response" => "OK"}.to_json})
|
148
|
+
response = OldPlaid::Connection.patch("testing")
|
149
|
+
expect(response).to eq({"response" => "OK"})
|
150
|
+
end
|
151
|
+
|
152
|
+
it "returns message on 201 response" do
|
153
|
+
stub = stub_request(:patch, stub_url).to_return(status: 201, body: {"response" => "OK"}.to_json)
|
154
|
+
response = OldPlaid::Connection.patch("testing")
|
155
|
+
expect(response).to eq({:msg => "Requires further authentication", :body => {"response" => "OK"}})
|
156
|
+
end
|
157
|
+
|
158
|
+
it "throws OldPlaid::BadRequest on 400 response" do
|
159
|
+
stub = stub_request(:patch, stub_url).to_return(status: 400, body: bad_req_response)
|
160
|
+
expect { OldPlaid::Connection.patch("testing") }.to raise_error(OldPlaid::BadRequest, "invalid credentials")
|
161
|
+
end
|
162
|
+
|
163
|
+
it "throws OldPlaid::Unauthorized on 401 response" do
|
164
|
+
stub = stub_request(:patch, stub_url).to_return(status: 401, body: unauth_response)
|
165
|
+
expect { OldPlaid::Connection.patch("testing") }.to raise_error(OldPlaid::Unauthorized, "bad access_token")
|
166
|
+
end
|
167
|
+
|
168
|
+
it "throws OldPlaid::RequestFailed on 402 response" do
|
169
|
+
stub = stub_request(:patch, stub_url).to_return(status: 402, body: req_fail_response)
|
170
|
+
expect { OldPlaid::Connection.patch("testing") }.to raise_error(OldPlaid::RequestFailed, "invalid credentials")
|
171
|
+
end
|
172
|
+
|
173
|
+
it "throws a OldPlaid::NotFound on 404 response" do
|
174
|
+
stub = stub_request(:patch, stub_url).to_return(status: 404, body: req_not_found)
|
175
|
+
expect { OldPlaid::Connection.patch("testing") }.to raise_error(OldPlaid::NotFound, "product not found")
|
176
|
+
end
|
177
|
+
|
178
|
+
it "throws a OldPlaid::ServerError on empty response" do
|
179
|
+
stub = stub_request(:patch, stub_url).to_return(status: 504, body: '')
|
180
|
+
expect { OldPlaid::Connection.patch("testing") }.to raise_error(OldPlaid::ServerError, '')
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
describe "#delete" do
|
185
|
+
it "sends a delete request" do
|
186
|
+
stub = stub_request(:delete, stub_url)
|
187
|
+
OldPlaid::Connection.delete("testing")
|
188
|
+
expect(stub).to have_requested(:delete, stub_url)
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
describe OldPlaid::OldPlaidError do
|
2
|
+
describe "#new" do
|
3
|
+
it "allows code, message and resolution" do
|
4
|
+
error = OldPlaid::OldPlaidError.new 1, "testing", "fix it"
|
5
|
+
expect(error.code).to eq(1)
|
6
|
+
expect(error.message).to eq("testing")
|
7
|
+
expect(error.resolve).to eq("fix it")
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
describe OldPlaid::Account do
|
2
|
+
# API: semi-private
|
3
|
+
describe '.new' do
|
4
|
+
subject { OldPlaid::Account.new(results) }
|
5
|
+
|
6
|
+
def self.with_results(_results, &examples)
|
7
|
+
context "with results #{_results}" do
|
8
|
+
let(:results) { _results }
|
9
|
+
instance_eval(&examples)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
with_results('meta' => {'name' => 'Name'}) do it { expect(subject.name).to eql('Name') } end
|
14
|
+
with_results('_id' => 'ID') do it { expect(subject.id).to eql('ID') } end
|
15
|
+
with_results('type' => 'Type') do it { expect(subject.type).to eql('Type') } end
|
16
|
+
with_results('type' => 'STyp') do it { expect(subject.type).to eql('STyp') } end
|
17
|
+
with_results('meta' => nil) do it { expect(subject.meta).to be_nil } end
|
18
|
+
with_results('meta' => {}) do it { expect(subject.meta).to eql({}) } end
|
19
|
+
|
20
|
+
with_results('balance' => { 'available' => 100.00 } ) do it { expect(subject.available_balance).to eql(100.00) } end
|
21
|
+
with_results('balance' => { 'current' => 200.00 } ) do it { expect(subject.current_balance).to eql(200.00) } end
|
22
|
+
|
23
|
+
with_results('institution_type' => 'Type') do it { expect(subject.institution_type).to eql('Type') } end
|
24
|
+
|
25
|
+
with_results('numbers' => nil) do
|
26
|
+
it { expect(subject.numbers).to eql('Upgrade user to access routing information for this account') }
|
27
|
+
end
|
28
|
+
|
29
|
+
with_results('numbers' => {}) do
|
30
|
+
it { expect(subject.numbers).to eql({}) }
|
31
|
+
end
|
32
|
+
|
33
|
+
with_results({}) do
|
34
|
+
it { expect(subject.name).to eq nil } # doesn't blow up if 'meta' is missing
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
describe OldPlaid::Category do
|
2
|
+
context 'when a single category is found' do
|
3
|
+
let(:category) { OldPlaid.category('17001013') }
|
4
|
+
it { expect(category).to be_kind_of(OldPlaid::Category) }
|
5
|
+
end
|
6
|
+
|
7
|
+
context 'when all categories are found' do
|
8
|
+
let(:category) { OldPlaid.category }
|
9
|
+
it { expect(category).to be_kind_of(Array)}
|
10
|
+
end
|
11
|
+
|
12
|
+
context 'when category is not found' do
|
13
|
+
it { expect { OldPlaid.category('dumb_cat') }.to raise_error(OldPlaid::NotFound, 'unable to find category') }
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
describe OldPlaid::Institution do
|
2
|
+
context 'when a single institution is found' do
|
3
|
+
let(:institution) { OldPlaid.institution('5301a93ac140de84910000e0') }
|
4
|
+
|
5
|
+
it { expect(institution).to be_kind_of(OldPlaid::Institution) }
|
6
|
+
it { expect(institution.mfa).to be_kind_of(Array) }
|
7
|
+
it { expect(institution.products).to be_kind_of(Array) }
|
8
|
+
it { expect(institution.credentials).to be_kind_of(Hash) }
|
9
|
+
end
|
10
|
+
|
11
|
+
context 'when all institutions are found' do
|
12
|
+
let(:institution) { OldPlaid.institution }
|
13
|
+
it { expect(institution).to be_kind_of(Array) }
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'when institution is not found' do
|
17
|
+
it { expect { OldPlaid.institution('dumb_bank') }.to raise_error(OldPlaid::NotFound, 'unable to find institution') }
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
describe OldPlaid::Transaction do
|
2
|
+
# API: semi-private
|
3
|
+
describe '.new' do
|
4
|
+
# The reason this looks weird is because it is. This will be refactored for 2.0
|
5
|
+
subject { OldPlaid::Transaction.new(results) }
|
6
|
+
|
7
|
+
def self.with_results(_results, &examples)
|
8
|
+
context "with results #{_results}" do
|
9
|
+
let(:results) { _results }
|
10
|
+
instance_eval(&examples)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
with_results('_id' => 'ID') do it { expect(subject.id).to eql('ID') } end
|
15
|
+
with_results('_account' => 'acct') do it { expect(subject.account).to eql('acct') } end
|
16
|
+
with_results('date' => '00/00/00') do it { expect(subject.date).to eql('00/00/00') } end
|
17
|
+
with_results('amount' => 100.00) do it { expect(subject.amount).to eql(100.00) } end
|
18
|
+
with_results('name' => 'Name') do it { expect(subject.name).to eql('Name') } end
|
19
|
+
with_results('meta' => {} ) do it { expect(subject.meta).to eql({}) } end
|
20
|
+
with_results('meta' => {'location' => 'Location'}) do it { expect(subject.location).to eql('Location') } end
|
21
|
+
with_results('pending' => true) do it { expect(subject.pending).to eql(true) } end
|
22
|
+
with_results('score' => 200) do it { expect(subject.score).to eql(200) } end
|
23
|
+
with_results('type' => 'Type') do it { expect(subject.type).to eql('Type') } end
|
24
|
+
|
25
|
+
with_results('category' => 'Category') do it { expect(subject.category).to eql('Category') } end
|
26
|
+
with_results('category_id' => 100) do it { expect(subject.category_id).to eql(100) } end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,172 @@
|
|
1
|
+
describe OldPlaid::User do
|
2
|
+
let(:auth_user) { OldPlaid.add_user('auth', 'plaid_test', 'plaid_good', 'wells') }
|
3
|
+
let(:connect_user) { OldPlaid.add_user('connect', 'plaid_test', 'plaid_good', 'wells') }
|
4
|
+
let(:info_user) { OldPlaid.add_user('info', 'plaid_test', 'plaid_good', 'wells') }
|
5
|
+
|
6
|
+
context 'user vars' do
|
7
|
+
context 'valid user has accounts and accounts contain id attribute' do
|
8
|
+
let(:user) { OldPlaid.add_user('connect', 'plaid_test', 'plaid_good', 'wells') }
|
9
|
+
it { expect(user.accounts.first.id).not_to be_nil }
|
10
|
+
end
|
11
|
+
|
12
|
+
context 'valid user has accounts and accounts contain type attribute' do
|
13
|
+
let(:user) { OldPlaid.add_user('connect', 'plaid_test', 'plaid_good', 'wells') }
|
14
|
+
it { expect(user.accounts.first.type).to eq('depository') }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# MFA specs - after user is instantiated,
|
19
|
+
describe '#mfa_authentication' do
|
20
|
+
let(:user) { OldPlaid.add_user('connect', 'plaid_test', 'plaid_good', 'bofa') }
|
21
|
+
let(:new_mfa_user) { user.mfa_authentication('tomato') }
|
22
|
+
|
23
|
+
context 'enters correct credentials for MFA auth and authenticates' do
|
24
|
+
it { expect(new_mfa_user.accounts).not_to be_empty }
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'enters old method of adding type strongly in each method and authenticates correctly using 2FA' do
|
28
|
+
let(:new_mfa_user) { user.mfa_authentication('tomato', 'bofa') }
|
29
|
+
it { expect(new_mfa_user.accounts).to be_truthy }
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'has to enter another round of MFA credentials' do
|
33
|
+
let(:mfa_again) { user.mfa_authentication('again') }
|
34
|
+
it { expect(mfa_again.api_res).to eq 'Requires further authentication' }
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'enters incorrect credentials for MFA auth' do
|
38
|
+
let(:mfa_user) { user.mfa_authentication('tomato') }
|
39
|
+
let(:mfa_bad) { mfa_user; OldPlaid.add_user('connect', 'plaid_test', 'plaid_good', 'bofa') }
|
40
|
+
it { expect { mfa_bad.mfa_authentication('bad') }.to raise_error(OldPlaid::RequestFailed, 'invalid mfa') }
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'requests list of MFA credentials' do
|
44
|
+
let(:new_mfa_user) { OldPlaid.add_user('auth', 'plaid_test', 'plaid_good', 'chase', nil, '{"list":true}') }
|
45
|
+
let(:expected_questions) do
|
46
|
+
{
|
47
|
+
"type"=>"list",
|
48
|
+
"mfa"=> [
|
49
|
+
{"mask"=>"xxx-xxx-5309", "type"=>"phone"},
|
50
|
+
{"mask"=>"t..t@plaid.com", "type"=>"email"}
|
51
|
+
],
|
52
|
+
"access_token"=>"test_chase"
|
53
|
+
}
|
54
|
+
end
|
55
|
+
it { expect(new_mfa_user.pending_mfa_questions).to eql(expected_questions) }
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'selects MFA method and returns successful response' do
|
59
|
+
let(:user) { OldPlaid.add_user('auth', 'plaid_test', 'plaid_good', 'chase', nil, '{"list":true}') }
|
60
|
+
let(:new_mfa_user) { user.select_mfa_method({mask: 'xxx-xxx-5309' }, 'chase') }
|
61
|
+
let(:expected_pending_questions) do
|
62
|
+
{
|
63
|
+
"type" => "device",
|
64
|
+
"mfa" => { "message" => "Code sent to xxx-xxx-5309" },
|
65
|
+
"access_token" => "test_chase"
|
66
|
+
}
|
67
|
+
end
|
68
|
+
it { expect(new_mfa_user.pending_mfa_questions).to eql(expected_pending_questions) }
|
69
|
+
end
|
70
|
+
|
71
|
+
context 'selects MFA method, and delivers correct payload to authenticate user' do
|
72
|
+
let(:user) { OldPlaid.add_user('auth', 'plaid_test', 'plaid_good', 'chase', nil, '{"list":true}') }
|
73
|
+
let(:user_select_method) { user.select_mfa_method({mask:'xxx-xxx-5309'}) }
|
74
|
+
let(:new_mfa_user) { user_select_method.mfa_authentication(1234) }
|
75
|
+
|
76
|
+
it { expect(new_mfa_user.accounts).not_to be_empty }
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context 'when authenticating' do
|
81
|
+
# Auth specs
|
82
|
+
describe '#get_auth' do
|
83
|
+
|
84
|
+
context 'has access and returns accounts' do
|
85
|
+
it { expect(auth_user.permissions[0]).to eq('auth') }
|
86
|
+
end
|
87
|
+
|
88
|
+
context 'does not have access to auth' do
|
89
|
+
it { expect(connect_user.permissions.include? 'auth' ).to eql(false) }
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
# Connect specs
|
94
|
+
describe '#get_connect' do
|
95
|
+
context 'has access and returns accounts' do
|
96
|
+
it { expect(connect_user.permissions[0]).to eq('connect') }
|
97
|
+
end
|
98
|
+
|
99
|
+
context 'does not have access to auth' do
|
100
|
+
it { expect(auth_user.permissions.include? 'connect' ).to eql(false) }
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
# Get info specs
|
105
|
+
describe '#get_info' do
|
106
|
+
context 'has access and returns user info' do
|
107
|
+
it { expect(info_user.permissions[0]).to eq('info') }
|
108
|
+
end
|
109
|
+
|
110
|
+
context 'does not have access to info' do
|
111
|
+
it{ expect(auth_user.permissions.include? 'info' ).to eql(false) }
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
describe '#get_balance' do
|
117
|
+
subject { user.tap(&:update_balance) }
|
118
|
+
let(:user) { OldPlaid.add_user('info', 'plaid_test', 'plaid_good', 'wells') }
|
119
|
+
|
120
|
+
context 'updates user accounts' do
|
121
|
+
it { expect(subject.accounts).not_to be_empty }
|
122
|
+
end
|
123
|
+
|
124
|
+
# TODO: This test needs to be rewritten better, such as using #uniq instead of this
|
125
|
+
context 'does not double up accounts or transactions' do
|
126
|
+
let(:total_duplicates) { duplicate_accounts.length + duplicate_transactions.length }
|
127
|
+
let(:duplicate_accounts) { subject.accounts.select {|element| user.accounts.count(element) > 1} }
|
128
|
+
let(:duplicate_transactions) { subject.transactions.select {|element| user.transactions.count(element) > 1} }
|
129
|
+
it{ expect(total_duplicates).to eql(0) }
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
describe '#update_info' do
|
134
|
+
let(:info_user) { OldPlaid.add_user('info', 'plaid_test', 'plaid_good', 'wells') }
|
135
|
+
context 'updates information correctly' do
|
136
|
+
# TODO: This test needs to pass, currently test credentials are failing
|
137
|
+
pending { expect { info_user.update_info('plaid_test', 'plaid_good') }.to_not raise_error }
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
describe '#delete_user' do
|
142
|
+
subject { info_user.tap(&:delete_user) }
|
143
|
+
let(:info_user) { OldPlaid.add_user('info', 'plaid_test', 'plaid_good', 'wells') }
|
144
|
+
|
145
|
+
context 'updates information correctly' do
|
146
|
+
it { expect { subject.get_info }.to raise_error(OldPlaid::Unauthorized, 'client_id missing') }
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
describe '#upgrade' do
|
151
|
+
subject { user.tap(&upgrade!) }
|
152
|
+
let(:upgrade!) { ->(x) { x.upgrade(upgrade_level) } }
|
153
|
+
let(:upgrade_level) { raise 'Define upgrade level' }
|
154
|
+
|
155
|
+
context 'auth upgrade is successful' do
|
156
|
+
let(:user) { connect_user }
|
157
|
+
let(:upgrade_level) { 'auth' }
|
158
|
+
it { expect{ subject.get_auth }.to_not raise_error }
|
159
|
+
end
|
160
|
+
|
161
|
+
context 'connect upgrade is successful' do
|
162
|
+
let(:user) { auth_user }
|
163
|
+
let(:upgrade_level) { 'connect' }
|
164
|
+
it { expect{ subject.get_connect }.to_not raise_error }
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
# This stuff needs to be tested and rewritten. Have already
|
169
|
+
# surfaced up a bug in it
|
170
|
+
pending '#populate_user'
|
171
|
+
|
172
|
+
end
|