plaid 1.7.1 → 2.0.0.alpha

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 (48) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +3 -0
  3. data/CONTRIBUTING.md +15 -0
  4. data/LICENSE +20 -0
  5. data/README.md +215 -63
  6. data/Rakefile +50 -4
  7. data/UPGRADING.md +45 -0
  8. data/bin/console +13 -0
  9. data/bin/setup +8 -0
  10. data/lib/plaid.rb +51 -88
  11. data/lib/plaid/account.rb +144 -0
  12. data/lib/plaid/category.rb +62 -0
  13. data/lib/plaid/client.rb +67 -0
  14. data/lib/plaid/connector.rb +168 -0
  15. data/lib/plaid/errors.rb +24 -14
  16. data/lib/plaid/income.rb +106 -0
  17. data/lib/plaid/info.rb +65 -0
  18. data/lib/plaid/institution.rb +240 -0
  19. data/lib/plaid/risk.rb +34 -0
  20. data/lib/plaid/transaction.rb +123 -0
  21. data/lib/plaid/user.rb +430 -0
  22. data/lib/plaid/version.rb +1 -1
  23. data/plaid.gemspec +20 -12
  24. metadata +58 -62
  25. data/.gitignore +0 -15
  26. data/.rspec +0 -2
  27. data/.travis.yml +0 -5
  28. data/LICENSE.txt +0 -22
  29. data/PUBLISHING.md +0 -21
  30. data/lib/plaid/config.rb +0 -19
  31. data/lib/plaid/connection.rb +0 -109
  32. data/lib/plaid/models/account.rb +0 -24
  33. data/lib/plaid/models/category.rb +0 -17
  34. data/lib/plaid/models/exchange_token_response.rb +0 -11
  35. data/lib/plaid/models/info.rb +0 -12
  36. data/lib/plaid/models/institution.rb +0 -22
  37. data/lib/plaid/models/transaction.rb +0 -24
  38. data/lib/plaid/models/user.rb +0 -189
  39. data/spec/plaid/config_spec.rb +0 -67
  40. data/spec/plaid/connection_spec.rb +0 -191
  41. data/spec/plaid/error_spec.rb +0 -10
  42. data/spec/plaid/models/account_spec.rb +0 -37
  43. data/spec/plaid/models/category_spec.rb +0 -16
  44. data/spec/plaid/models/institution_spec.rb +0 -19
  45. data/spec/plaid/models/transaction_spec.rb +0 -28
  46. data/spec/plaid/models/user_spec.rb +0 -172
  47. data/spec/plaid_spec.rb +0 -263
  48. data/spec/spec_helper.rb +0 -14
@@ -1,24 +0,0 @@
1
- module Plaid
2
- class Account
3
- attr_accessor :available_balance, :current_balance, :institution_type, :meta, :transactions, :numbers, :name, :id, :type, :subtype
4
-
5
- def initialize(hash)
6
- @id = hash['_id']
7
- @name = hash['meta']['name'] if hash['meta']
8
- @type = hash['type']
9
- @meta = hash['meta']
10
- @institution_type = hash['institution_type']
11
-
12
- if hash['balance']
13
- @available_balance = hash['balance']['available']
14
- @current_balance = hash['balance']['current']
15
- end
16
-
17
- # Depository account only, "checkings" or "savings"
18
- # Available on live data, but not on the test data
19
- @subtype = hash['subtype']
20
-
21
- @numbers = hash['numbers'] ? hash['numbers'] : 'Upgrade user to access routing information for this account'
22
- end
23
- end
24
- end
@@ -1,17 +0,0 @@
1
- module Plaid
2
- class Category
3
- attr_accessor :type, :hierarchy, :id
4
-
5
- def initialize(fields = {})
6
- @type = fields['type']
7
- @hierarchy = fields['hierarchy']
8
- @id = fields['id']
9
- end
10
-
11
- # API: semi-private
12
- # This method takes an array returned from the API and instantiates all of the categories
13
- def self.all(res)
14
- res.map { |cat| new(cat) }
15
- end
16
- end
17
- end
@@ -1,11 +0,0 @@
1
- module Plaid
2
- class ExchangeTokenResponse
3
- attr_accessor :access_token
4
- attr_accessor :stripe_bank_account_token
5
-
6
- def initialize(fields = {})
7
- @access_token = fields['access_token']
8
- @stripe_bank_account_token = fields['stripe_bank_account_token']
9
- end
10
- end
11
- end
@@ -1,12 +0,0 @@
1
- module Plaid
2
- class Information
3
- attr_accessor :names, :emails, :phone_numbers, :addresses
4
-
5
- def initialize(hash)
6
- @names = hash['names']
7
- @emails = hash['emails']
8
- @phone_numbers = hash['phone_numbers']
9
- @addresses = hash['addresses']
10
- end
11
- end
12
- end
@@ -1,22 +0,0 @@
1
- module Plaid
2
- class Institution
3
- attr_accessor :id, :name, :type, :has_mfa, :mfa, :credentials, :products
4
-
5
- def initialize(fields = {})
6
- @id = fields['id']
7
- @name = fields['name']
8
- @type = fields['type']
9
- @has_mfa = fields['has_mfa']
10
- @mfa = fields['mfa']
11
- @credentials = fields['credentials']
12
- @products = fields['products']
13
- end
14
-
15
- # API: semi-private
16
- # This method takes an array returned from the API and instantiates all of the institutions
17
- def self.all(res)
18
- res.map { |inst| new(inst) }
19
- end
20
- end
21
- end
22
-
@@ -1,24 +0,0 @@
1
- module Plaid
2
- class Transaction
3
- attr_accessor :id, :account, :date, :amount, :name, :meta, :location, :pending, :score, :cat, :type, :category, :category_id, :pending_transaction
4
-
5
- def initialize(fields = {})
6
- @id = fields['_id']
7
- @account = fields['_account']
8
- @date = fields['date']
9
- @amount = fields['amount']
10
- @name = fields['name']
11
- @location = fields['meta'].nil? ? {} : fields['meta']['location']
12
- @pending = fields['pending']
13
- @pending_transaction = fields['_pendingTransaction']
14
- @score = fields['score']
15
- @cat = Category.new({ 'id' => fields['category_id'], 'hierarchy' => fields['category'], 'type' => fields['type'] })
16
-
17
- # Here for backwards compatibility only.
18
- @type = fields['type']
19
- @category = fields['category']
20
- @category_id = fields['category_id']
21
- @meta = fields['meta']
22
- end
23
- end
24
- end
@@ -1,189 +0,0 @@
1
- require_relative 'account'
2
- require_relative 'transaction'
3
- require_relative 'info'
4
- require 'json'
5
-
6
- module Plaid
7
- class User
8
- attr_accessor :accounts, :transactions, :access_token, :type, :permissions, :api_res, :pending_mfa_questions, :info, :information
9
-
10
- # API: public
11
- # Use this method to select the MFA method
12
- def select_mfa_method(selection, type=nil)
13
- type = self.type if type.nil?
14
- auth_path = self.permissions.last + '/step'
15
- res = Connection.post(auth_path, { options: { send_method: selection }.to_json, access_token: self.access_token, type: type })
16
- update(res, self.permissions.last)
17
- end
18
-
19
- # API: public
20
- # Use this method to send back the MFA code or answer
21
- def mfa_authentication(auth, type = nil)
22
- type = self.type if type.nil?
23
- auth_path = self.permissions.last + '/step'
24
- res = Connection.post(auth_path, { mfa: auth, access_token: self.access_token, type: type })
25
- self.accounts = []
26
- self.transactions = []
27
- update(res)
28
- end
29
-
30
- # API: public
31
- # Use this method to find out API levels available for this user
32
- def permit?(auth_level)
33
- self.permissions.include? auth_level
34
- end
35
-
36
- # API: public
37
- # Use this method to upgrade a user to another api level
38
- def upgrade(api_level=nil)
39
- if api_level.nil?
40
- api_level = 'auth' unless self.permit? 'auth'
41
- api_level = 'connect' unless self.permit? 'connect'
42
- end
43
- res = Connection.post('upgrade', { access_token: self.access_token, upgrade_to: api_level })
44
-
45
- # Reset accounts and transaction
46
- self.accounts = []
47
- self.transactions = []
48
- update(res)
49
- end
50
-
51
- # API: public
52
- # Use this method to delete a user from the Plaid API
53
- def delete_user
54
- Connection.delete('info', { access_token: self.access_token })
55
- end
56
-
57
- ### Internal build methods
58
- def initialize
59
- self.accounts = []
60
- self.transactions = []
61
- self.permissions = []
62
- self.access_token = ''
63
- self.api_res = ''
64
- self.info = {}
65
- end
66
-
67
- # API: semi-private
68
- # This class method instantiates a new Account object and updates it with the results
69
- # from the API
70
- def self.build(res, api_level = nil)
71
- self.new.update(res, api_level)
72
- end
73
-
74
- # API: semi-private
75
- # This method updates Account with the results returned from the API
76
- def update(res, api_level = nil)
77
- self.permit! api_level
78
-
79
- if res[:msg].nil?
80
- populate_user!(res)
81
- clean_up_user!
82
- else
83
- set_mfa_request!(res)
84
- end
85
-
86
- self
87
- end
88
-
89
- # Internal helper methods
90
-
91
- # API: semi-private
92
- # Internal helper method to set the available API levels
93
- def permit!(api_level)
94
- return if api_level.nil? || self.permit?(api_level)
95
- self.permissions << api_level
96
- end
97
-
98
- # API: semi-private
99
- # Gets auth, connect, or info of the user
100
- # TODO: (2.0) auth_level should be symbols instead of string
101
- def get(auth_level, options = {})
102
- return false unless self.permit? auth_level
103
- case auth_level
104
- when 'auth'
105
- update(Connection.post('auth/get', access_token: self.access_token))
106
- when 'connect'
107
- payload = { access_token: self.access_token }.merge(options)
108
- update(Connection.post('connect/get', payload))
109
- when 'info'
110
- update(Connection.secure_get('info', self.access_token))
111
- else
112
- raise "Invalid auth level: #{auth_level}"
113
- end
114
- end
115
-
116
- # API: semi-private
117
- def get_auth
118
- get('auth')
119
- end
120
-
121
- # API: semi-private
122
- def get_connect(options={})
123
- get('connect', options)
124
- end
125
-
126
- # API: semi-private
127
- def get_info
128
- get('info')
129
- end
130
-
131
- # API: semi-private
132
- # Helper method to update user information
133
- # Requires 'info' api level
134
- def update_info(username,pass,pin=nil)
135
- return false unless self.permit? 'info'
136
-
137
- payload = { username: username, password: pass, access_token: self.access_token }
138
- payload.merge!(pin: pin) if pin
139
- update(Plaid.patch('info', payload))
140
- end
141
-
142
- # API: semi-private
143
- # Helper method to update user balance
144
- def update_balance
145
- update(Connection.post('balance', { access_token: self.access_token }))
146
- end
147
-
148
- private
149
-
150
- def clean_up_user!
151
- self.accounts.select! { |c| c.instance_of? Account }
152
- end
153
-
154
- def set_mfa_request!(res)
155
- self.access_token = res[:body]['access_token']
156
- self.pending_mfa_questions = res[:body]
157
- self.api_res = res[:msg]
158
- end
159
-
160
- def populate_user!(res)
161
- res['accounts'].each do |account|
162
- if self.accounts.none? { |h| h.id == account['_id'] }
163
- self.accounts << Account.new(account)
164
- end
165
- end if res['accounts']
166
-
167
- res['transactions'].each do |transaction|
168
- if self.transactions.any? { |t| t == transaction['_id'] }
169
- owned_transaction = self.transactions.find { |h| h == transaction['_id'] }
170
- owned_transaction.new(transaction)
171
- else
172
- self.transactions << Transaction.new(transaction)
173
- end
174
- end if res['transactions']
175
-
176
- self.pending_mfa_questions = {}
177
- self.information = Information.new(res['info']) if res['info']
178
- self.api_res = 'success'
179
-
180
- # TODO: Remove the following line when upgrading to V-2
181
- self.info.merge!(res['info']) if res['info']
182
- # End TODO
183
-
184
- self.access_token = res['access_token'].split[0]
185
- self.type = res['access_token'].split[1]
186
- end
187
-
188
- end
189
- end
@@ -1,67 +0,0 @@
1
- describe 'Plaid.config' do
2
- around(:each) do |example|
3
- old_customer_id = Plaid.customer_id
4
- old_secret = Plaid.secret
5
- old_environment_location = Plaid.environment_location
6
-
7
- Plaid.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
- Plaid.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) { Plaid.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(Plaid.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(Plaid.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 Plaid::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 Plaid::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(Plaid::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(Plaid::Unauthorized, 'secret or client_id invalid') }
66
- end
67
- end
@@ -1,191 +0,0 @@
1
- describe Plaid::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
- Plaid::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 = Plaid::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 = Plaid::Connection.post("testing")
24
- expect(response).to eq({:msg => "Requires further authentication", :body => {"response" => "OK"}})
25
- end
26
-
27
- it "throws Plaid::BadRequest on 400 response" do
28
- stub = stub_request(:post, stub_url).to_return(status: 400, body: bad_req_response)
29
- expect { Plaid::Connection.post("testing") }.to raise_error(Plaid::BadRequest, "invalid credentials")
30
- end
31
-
32
- it "throws Plaid::Unauthorized on 401 response" do
33
- stub = stub_request(:post, stub_url).to_return(status: 401, body: unauth_response)
34
- expect { Plaid::Connection.post("testing") }.to raise_error(Plaid::Unauthorized, "bad access_token")
35
- end
36
-
37
- it "throws Plaid::RequestFailed on 402 response" do
38
- stub = stub_request(:post, stub_url).to_return(status: 402, body: req_fail_response)
39
- expect { Plaid::Connection.post("testing") }.to raise_error(Plaid::RequestFailed, "invalid credentials")
40
- end
41
-
42
- it "throws a Plaid::NotFound on 404 response" do
43
- stub = stub_request(:post, stub_url).to_return(status: 404, body: req_not_found)
44
- expect { Plaid::Connection.post("testing") }.to raise_error(Plaid::NotFound, "product not found")
45
- end
46
-
47
- it "throws a Plaid::ServerError on empty response" do
48
- stub = stub_request(:post, stub_url).to_return(status: 504, body: '')
49
- expect { Plaid::Connection.post("testing") }.to raise_error(Plaid::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
- Plaid::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 = Plaid::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 = Plaid::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 { Plaid::Connection.get("testing")}.to raise_error(Plaid::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 { Plaid::Connection.get("testing")}.to raise_error(Plaid::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 { Plaid::Connection.get("testing")}.to raise_error(Plaid::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 { Plaid::Connection.get("testing")}.to raise_error(Plaid::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
- Plaid::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 = Plaid::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 = Plaid::Connection.secure_get("testing", "test_wells")
110
- expect(response).to eq({:msg => "Requires further authentication", :body => {"response" => "OK"}})
111
- end
112
-
113
- it "throws Plaid::BadRequest on 400 response" do
114
- stub = stub_request(:get, stub_url).to_return(status: 400, body: bad_req_response)
115
- expect { Plaid::Connection.secure_get("testing", "test_wells") }.to raise_error(Plaid::BadRequest, "invalid credentials")
116
- end
117
-
118
- it "throws Plaid::Unauthorized on 401 response" do
119
- stub = stub_request(:get, stub_url).to_return(status: 401, body: unauth_response)
120
- expect { Plaid::Connection.secure_get("testing", "test_wells") }.to raise_error(Plaid::Unauthorized, "bad access_token")
121
- end
122
-
123
- it "throws Plaid::RequestFailed on 402 response" do
124
- stub = stub_request(:get, stub_url).to_return(status: 402, body: req_fail_response)
125
- expect { Plaid::Connection.secure_get("testing", "test_wells") }.to raise_error(Plaid::RequestFailed, "invalid credentials")
126
- end
127
-
128
- it "throws a Plaid::NotFound on 404 response" do
129
- stub = stub_request(:get, stub_url).to_return(status: 404, body: req_not_found)
130
- expect { Plaid::Connection.secure_get("testing", "test_wells") }.to raise_error(Plaid::NotFound, "product not found")
131
- end
132
-
133
- it "throws a Plaid::ServerError on empty response" do
134
- stub = stub_request(:get, stub_url).to_return(status: 504, body: '')
135
- expect { Plaid::Connection.secure_get("testing", "test_wells") }.to raise_error(Plaid::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
- Plaid::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 = Plaid::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 = Plaid::Connection.patch("testing")
155
- expect(response).to eq({:msg => "Requires further authentication", :body => {"response" => "OK"}})
156
- end
157
-
158
- it "throws Plaid::BadRequest on 400 response" do
159
- stub = stub_request(:patch, stub_url).to_return(status: 400, body: bad_req_response)
160
- expect { Plaid::Connection.patch("testing") }.to raise_error(Plaid::BadRequest, "invalid credentials")
161
- end
162
-
163
- it "throws Plaid::Unauthorized on 401 response" do
164
- stub = stub_request(:patch, stub_url).to_return(status: 401, body: unauth_response)
165
- expect { Plaid::Connection.patch("testing") }.to raise_error(Plaid::Unauthorized, "bad access_token")
166
- end
167
-
168
- it "throws Plaid::RequestFailed on 402 response" do
169
- stub = stub_request(:patch, stub_url).to_return(status: 402, body: req_fail_response)
170
- expect { Plaid::Connection.patch("testing") }.to raise_error(Plaid::RequestFailed, "invalid credentials")
171
- end
172
-
173
- it "throws a Plaid::NotFound on 404 response" do
174
- stub = stub_request(:patch, stub_url).to_return(status: 404, body: req_not_found)
175
- expect { Plaid::Connection.patch("testing") }.to raise_error(Plaid::NotFound, "product not found")
176
- end
177
-
178
- it "throws a Plaid::ServerError on empty response" do
179
- stub = stub_request(:patch, stub_url).to_return(status: 504, body: '')
180
- expect { Plaid::Connection.patch("testing") }.to raise_error(Plaid::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
- Plaid::Connection.delete("testing")
188
- expect(stub).to have_requested(:delete, stub_url)
189
- end
190
- end
191
- end