finapps 5.0.31 → 5.0.36

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/main.yaml +37 -0
  3. data/.rubocop.yml +139 -59
  4. data/.rubocop_todo.yml +29 -0
  5. data/.tmuxinator.yml +1 -0
  6. data/.travis.yml +3 -1
  7. data/README.md +1 -0
  8. data/RELEASES.md +29 -0
  9. data/finapps.gemspec +4 -4
  10. data/lib/finapps.rb +2 -0
  11. data/lib/finapps/rest/alert_definitions.rb +1 -1
  12. data/lib/finapps/rest/alert_occurrences.rb +1 -1
  13. data/lib/finapps/rest/client.rb +8 -5
  14. data/lib/finapps/rest/consumers.rb +10 -5
  15. data/lib/finapps/rest/consumers_portfolios.rb +1 -1
  16. data/lib/finapps/rest/documents_orders.rb +30 -26
  17. data/lib/finapps/rest/documents_upload_types.rb +11 -0
  18. data/lib/finapps/rest/documents_uploads.rb +23 -0
  19. data/lib/finapps/rest/operators.rb +5 -5
  20. data/lib/finapps/rest/operators_password_resets.rb +1 -1
  21. data/lib/finapps/rest/order_assignments.rb +1 -1
  22. data/lib/finapps/rest/order_reports.rb +1 -1
  23. data/lib/finapps/rest/orders.rb +33 -22
  24. data/lib/finapps/rest/plaid/plaid_consumer_institutions.rb +1 -1
  25. data/lib/finapps/rest/portfolio_reports.rb +1 -1
  26. data/lib/finapps/rest/portfolios.rb +1 -1
  27. data/lib/finapps/rest/portfolios_available_consumers.rb +1 -1
  28. data/lib/finapps/rest/portfolios_consumers.rb +1 -1
  29. data/lib/finapps/rest/sessions.rb +11 -9
  30. data/lib/finapps/rest/signed_documents_downloads.rb +3 -1
  31. data/lib/finapps/utils/query_builder.rb +13 -4
  32. data/lib/finapps/version.rb +1 -1
  33. data/spec/rest/alert_definitions_spec.rb +10 -6
  34. data/spec/rest/alert_occurrences_spec.rb +6 -1
  35. data/spec/rest/api_request.rb +1 -0
  36. data/spec/rest/client_spec.rb +33 -41
  37. data/spec/rest/consumers_portfolios_spec.rb +7 -2
  38. data/spec/rest/consumers_spec.rb +236 -207
  39. data/spec/rest/documents_orders_notifications_spec.rb +4 -2
  40. data/spec/rest/documents_orders_spec.rb +85 -23
  41. data/spec/rest/documents_upload_types_spec.rb +21 -0
  42. data/spec/rest/documents_uploads_spec.rb +104 -0
  43. data/spec/rest/esign_templates_spec.rb +2 -1
  44. data/spec/rest/operators_password_resets_spec.rb +50 -52
  45. data/spec/rest/operators_spec.rb +181 -172
  46. data/spec/rest/order_assignments_spec.rb +6 -1
  47. data/spec/rest/order_notifications_spec.rb +4 -2
  48. data/spec/rest/order_refreshes_spec.rb +8 -5
  49. data/spec/rest/order_reports_spec.rb +21 -15
  50. data/spec/rest/order_statuses_spec.rb +14 -10
  51. data/spec/rest/order_tokens_spec.rb +37 -30
  52. data/spec/rest/orders_spec.rb +121 -73
  53. data/spec/rest/password_resets_spec.rb +46 -36
  54. data/spec/rest/plaid/plaid_account_permissions_spec.rb +5 -4
  55. data/spec/rest/plaid/plaid_accounts_spec.rb +9 -4
  56. data/spec/rest/plaid/plaid_consumer_institutions_spec.rb +11 -11
  57. data/spec/rest/plaid/plaid_institution_logos_spec.rb +1 -1
  58. data/spec/rest/plaid/plaid_webhooks_spec.rb +3 -1
  59. data/spec/rest/portfolio_reports_spec.rb +7 -2
  60. data/spec/rest/portfolios_alerts_spec.rb +9 -4
  61. data/spec/rest/portfolios_available_consumers_spec.rb +7 -2
  62. data/spec/rest/portfolios_consumers_spec.rb +15 -4
  63. data/spec/rest/portfolios_spec.rb +20 -17
  64. data/spec/rest/products_spec.rb +17 -14
  65. data/spec/rest/sessions_spec.rb +63 -58
  66. data/spec/rest/signed_documents_downloads_spec.rb +10 -6
  67. data/spec/rest/tenant_app_settings_spec.rb +9 -3
  68. data/spec/rest/tenant_settings_spec.rb +9 -3
  69. data/spec/rest/verix/verix_documents_spec.rb +15 -22
  70. data/spec/rest/verix/verix_metadata_spec.rb +1 -1
  71. data/spec/rest/verix/verix_pdf_documents_spec.rb +14 -19
  72. data/spec/rest/verix/verix_records_spec.rb +31 -10
  73. data/spec/rest/version_spec.rb +6 -4
  74. data/spec/spec_helper.rb +2 -2
  75. data/spec/support/fake_api.rb +24 -3
  76. data/spec/support/fixtures/documents_orders_none.json +6 -0
  77. data/spec/support/fixtures/upload_types.json +9 -0
  78. data/spec/utils/query_builder_spec.rb +40 -14
  79. metadata +26 -16
@@ -6,10 +6,11 @@ RSpec.describe FinApps::REST::DocumentsOrdersNotifications do
6
6
  include SpecHelpers::Client
7
7
 
8
8
  describe '#create' do
9
- subject(:notifications) { FinApps::REST::DocumentsOrdersNotifications.new(client) }
9
+ subject(:notifications) { described_class.new(client) }
10
10
 
11
11
  context 'when missing id' do
12
12
  let(:create) { subject.create(nil) }
13
+
13
14
  it('returns missing argument error') do
14
15
  expect { create }.to raise_error(FinAppsCore::MissingArgumentsError)
15
16
  end
@@ -22,12 +23,13 @@ RSpec.describe FinApps::REST::DocumentsOrdersNotifications do
22
23
 
23
24
  it { expect { create }.not_to raise_error }
24
25
  it('results is nil') { expect(results).to be_nil }
26
+
25
27
  it('error messages array is populated') do
26
28
  expect(error_messages.first.downcase).to eq('order id is invalid')
27
29
  end
28
30
  end
29
31
 
30
- context 'for valid id' do
32
+ context 'with valid id' do
31
33
  let(:create) { subject.create(:valid_id) }
32
34
  let(:results) { create[RESULTS] }
33
35
  let(:error_messages) { create[ERROR_MESSAGES] }
@@ -15,7 +15,8 @@ RSpec.describe FinApps::REST::DocumentsOrders do
15
15
  end
16
16
 
17
17
  describe '#list' do
18
- subject(:list) { FinApps::REST::DocumentsOrders.new(client).list(params) }
18
+ subject(:list) { described_class.new(client).list(params) }
19
+
19
20
  let(:results) { list[0] }
20
21
  let(:error_messages) { list[1] }
21
22
 
@@ -31,12 +32,14 @@ RSpec.describe FinApps::REST::DocumentsOrders do
31
32
  end
32
33
 
33
34
  context 'without searchTerm' do
34
- let(:params) { { "searchTerm": nil, "page": 2 } }
35
+ let(:params) { {searchTerm: nil, page: 2} }
36
+
35
37
  it_behaves_like 'an API request'
36
38
  it_behaves_like 'a successful request'
37
39
  it 'performs a get and returns the response' do
38
40
  expect(results).to have_key(:records)
39
41
  end
42
+
40
43
  it 'builds query and sends proper request' do
41
44
  list
42
45
  url = "#{versioned_api_path}/documents/orders?page=2"
@@ -50,41 +53,72 @@ RSpec.describe FinApps::REST::DocumentsOrders do
50
53
  it 'performs a get and returns the response' do
51
54
  expect(results).to have_key(:records)
52
55
  end
56
+
53
57
  it 'builds query and sends proper request' do
54
58
  list
55
59
  url =
56
- "#{versioned_api_path}/documents/orders?filter=%7B%22$or%22:%5B%7B%22applicant.email%22:"\
57
- '%22term%22%7D,%7B%22applicant.first_name%22:%22term%22%7D,%7B%22applicant.last_name%22:'\
58
- '%22term%22%7D,%7B%22reference_no%22:%7B%22$regex%22:%22%5Eterm%22,%22$options%22:%22i%22%7D%7D%5D,'\
59
- '%22consumer_id%22:%22valid_consumer_id%22%7D&page=2&requested=25&sort=tag '
60
+ "#{versioned_api_path}/documents/orders?"\
61
+ 'filter=%7B%22$or%22:%5B%7B%22applicant.email%22:'\
62
+ '%22term%22%7D,%7B%22applicant.first_name%22:%22term%22%7D,'\
63
+ '%7B%22applicant.last_name%22:'\
64
+ '%22term%22%7D,%7B%22reference_no%22:%7B%22$regex%22:%22%5Eterm%22,'\
65
+ '%22$options%22:%22i%22%7D%7D%5D,'\
66
+ '%22consumer_id%22:%22valid_consumer_id%22%7D&'\
67
+ 'page=2&requested=25&sort=tag '
60
68
 
61
69
  expect(WebMock).to have_requested(:get, url)
62
70
  end
63
71
 
64
72
  context 'with search term containing spaces' do
65
- let(:params) { { "searchTerm": 'Blue Jay', "page": 2 } }
73
+ let(:params) { {"searchTerm": 'Blue Jay', "page": 2} }
74
+
66
75
  it 'builds query and sends proper request' do
67
76
  list
68
77
  url =
69
- "#{versioned_api_path}/documents/orders?filter=%7B%22$or%22:%5B%7B%22applicant.email%22:"\
70
- '%22Blue%20Jay%22%7D,%7B%22applicant.first_name%22:%22Blue%20Jay%22%7D,%7B%22applicant.last_name%22:'\
71
- '%22Blue%20Jay%22%7D,%7B%22reference_no%22:%7B%22$regex%22:%22%5EBlue%20Jay%22,%22$options%22:'\
72
- '%22i%22%7D%7D,%7B%22applicant.first_name%22:%22Blue%22%7D,%7B%22applicant.last_name%22:%22Blue%22%7D,'\
73
- '%7B%22applicant.first_name%22:%22Jay%22%7D,%7B%22applicant.last_name%22:%22Jay%22%7D%5D%7D&page=2'
78
+ "#{versioned_api_path}/documents/orders?"\
79
+ 'filter=%7B%22$or%22:%5B%7B%22applicant.email%22:'\
80
+ '%22Blue%20Jay%22%7D,'\
81
+ '%7B%22applicant.first_name%22:%22Blue%20Jay%22%7D,'\
82
+ '%7B%22applicant.last_name%22:'\
83
+ '%22Blue%20Jay%22%7D,'\
84
+ '%7B%22reference_no%22:%7B%22$regex%22:%22%5EBlue%20Jay%22,'\
85
+ '%22$options%22:'\
86
+ '%22i%22%7D%7D,%7B%22applicant.first_name%22:%22Blue%22%7D,'\
87
+ '%7B%22applicant.last_name%22:%22Blue%22%7D,'\
88
+ '%7B%22applicant.first_name%22:%22Jay%22%7D,'\
89
+ '%7B%22applicant.last_name%22:%22Jay%22%7D%5D%7D&page=2'
74
90
 
75
91
  expect(WebMock).to have_requested(:get, url)
76
92
  end
77
93
  end
78
94
  end
95
+
96
+ context 'when filtering by open status ordes' do
97
+ let(:params) { {status: 1} }
98
+
99
+ it_behaves_like 'an API request'
100
+ it_behaves_like 'a successful request'
101
+ it { expect(list.first[:records]).not_to be_empty }
102
+ end
103
+
104
+ context 'when filtering by closed status ordes' do
105
+ let(:params) { {status: 2, searchTerm: 'term'} }
106
+
107
+ it_behaves_like 'an API request'
108
+ it_behaves_like 'a successful request'
109
+ it { expect(results[:records]).to be_empty }
110
+ end
79
111
  end
80
112
 
81
113
  context 'with invalid params' do
82
114
  let(:params) { ['invalid array'] }
115
+
83
116
  it { expect { list }.to raise_error(FinAppsCore::InvalidArgumentsError) }
84
117
  end
85
118
 
86
119
  context 'with missing params' do
87
120
  let(:params) { nil }
121
+
88
122
  it_behaves_like 'an API request'
89
123
  it_behaves_like 'a successful request'
90
124
  it('performs a get and returns the response') do
@@ -94,15 +128,18 @@ RSpec.describe FinApps::REST::DocumentsOrders do
94
128
  end
95
129
 
96
130
  describe '#show' do
97
- subject(:show) { FinApps::REST::DocumentsOrders.new(client).show(id) }
131
+ subject(:show) { described_class.new(client).show(id) }
132
+
98
133
  let(:results) { show[0] }
99
134
  let(:error_messages) { show[1] }
100
135
 
101
136
  context 'with valid id' do
102
137
  let(:id) { :valid_order_id }
138
+
103
139
  it_behaves_like 'an API request'
104
140
  it_behaves_like 'a successful request'
105
141
  it('results is a Hash') { expect(results).to be_a(Hash) }
142
+
106
143
  it('performs a get and returns the response') do
107
144
  expect(results).to have_key(:order_id)
108
145
  end
@@ -110,18 +147,21 @@ RSpec.describe FinApps::REST::DocumentsOrders do
110
147
 
111
148
  context 'with invalid id' do
112
149
  let(:id) { :invalid_order_id }
150
+
113
151
  it { expect(results).to be_nil }
114
- it { expect(error_messages).to_not be_empty }
152
+ it { expect(error_messages).not_to be_empty }
115
153
  end
116
154
 
117
155
  context 'when missing id' do
118
156
  let(:id) { nil }
157
+
119
158
  it_behaves_like 'a request that raises an error'
120
159
  end
121
160
  end
122
161
 
123
162
  describe '#create' do
124
- subject(:create) { FinApps::REST::DocumentsOrders.new(client).create(params) }
163
+ subject(:create) { described_class.new(client).create(params) }
164
+
125
165
  let(:results) { create[0] }
126
166
  let(:error_messages) { create[1] }
127
167
 
@@ -141,9 +181,11 @@ RSpec.describe FinApps::REST::DocumentsOrders do
141
181
  "tag": 'new'
142
182
  }
143
183
  end
184
+
144
185
  it_behaves_like 'an API request'
145
186
  it_behaves_like 'a successful request'
146
187
  it('results is a Hash') { expect(results).to be_a(Hash) }
188
+
147
189
  it('performs a post and returns the response') do
148
190
  expect(results).to have_key(:order_id)
149
191
  end
@@ -161,8 +203,10 @@ RSpec.describe FinApps::REST::DocumentsOrders do
161
203
  "reference_no": 'REFNO'
162
204
  }
163
205
  end
206
+
164
207
  it { expect { create }.not_to raise_error }
165
208
  it('results is nil') { expect(results).to be_nil }
209
+
166
210
  it('error messages array is populated') do
167
211
  expect(error_messages.first.downcase).to eq('invalid request body')
168
212
  end
@@ -170,12 +214,14 @@ RSpec.describe FinApps::REST::DocumentsOrders do
170
214
 
171
215
  context 'with missing params' do
172
216
  let(:params) { nil }
217
+
173
218
  it_behaves_like 'a request that raises an error'
174
219
  end
175
220
  end
176
221
 
177
222
  describe '#update' do
178
- subject(:update) { FinApps::REST::DocumentsOrders.new(client).update(id, params) }
223
+ subject(:update) { described_class.new(client).update(id, params) }
224
+
179
225
  let(:params) { {} }
180
226
  let(:results) { update[0] }
181
227
  let(:error_messages) { update[1] }
@@ -184,16 +230,19 @@ RSpec.describe FinApps::REST::DocumentsOrders do
184
230
  let(:id) { :valid_order_id }
185
231
 
186
232
  context 'with valid params' do
187
- let(:params) { { "tag": 'pending' } }
233
+ let(:params) { {"tag": 'pending'} }
234
+
188
235
  it_behaves_like 'an API request'
189
236
  it_behaves_like 'a successful request'
190
237
  it('results is nil') { expect(results).to be_nil }
191
238
  end
192
239
 
193
240
  context 'with invalid params' do
194
- let(:params) { { "tag": 'invalid' } }
241
+ let(:params) { {"tag": 'invalid'} }
242
+
195
243
  it_behaves_like 'an API request'
196
244
  it('results is nil') { expect(results).to be_nil }
245
+
197
246
  it('error messages array is populated') do
198
247
  expect(error_messages.first.downcase).to eq('invalid request body')
199
248
  end
@@ -202,9 +251,11 @@ RSpec.describe FinApps::REST::DocumentsOrders do
202
251
 
203
252
  context 'with invalid id' do
204
253
  let(:id) { :invalid_order_id }
205
- let(:params) { { applicant: { first_name: 'Quasar' } } }
254
+ let(:params) { {applicant: {first_name: 'Quasar'}} }
255
+
206
256
  it_behaves_like 'an API request'
207
257
  it('results is nil') { expect(results).to be_nil }
258
+
208
259
  it('error messages array is populated') do
209
260
  expect(error_messages.first.downcase).to eq(
210
261
  'order id is invalid'
@@ -214,17 +265,20 @@ RSpec.describe FinApps::REST::DocumentsOrders do
214
265
 
215
266
  context 'with missing id' do
216
267
  let(:id) { nil }
268
+
217
269
  it_behaves_like 'a request that raises an error'
218
270
  end
219
271
  end
220
272
 
221
273
  describe '#destroy' do
222
- subject(:destroy) { FinApps::REST::DocumentsOrders.new(client).destroy(id) }
274
+ subject(:destroy) { described_class.new(client).destroy(id) }
275
+
223
276
  let(:results) { destroy[0] }
224
277
  let(:error_messages) { destroy[1] }
225
278
 
226
279
  context 'with valid id' do
227
280
  let(:id) { :valid_order_id }
281
+
228
282
  it_behaves_like 'an API request'
229
283
  it_behaves_like 'a successful request'
230
284
  it('results is nil') { expect(results).to be_nil }
@@ -232,8 +286,10 @@ RSpec.describe FinApps::REST::DocumentsOrders do
232
286
 
233
287
  context 'with invalid id' do
234
288
  let(:id) { :invalid_order_id }
289
+
235
290
  it_behaves_like 'an API request'
236
291
  it('results is nil') { expect(results).to be_nil }
292
+
237
293
  it('error messages array is populated') do
238
294
  expect(error_messages.first.downcase).to eq('resource not found')
239
295
  end
@@ -241,12 +297,14 @@ RSpec.describe FinApps::REST::DocumentsOrders do
241
297
 
242
298
  context 'with missing id' do
243
299
  let(:id) { nil }
300
+
244
301
  it_behaves_like 'a request that raises an error'
245
302
  end
246
303
  end
247
304
 
248
305
  describe '#show_signing_url' do
249
- subject(:sign_url) { FinApps::REST::DocumentsOrders.new(client).show_signing_url(order_id, signature_id) }
306
+ subject(:sign_url) { described_class.new(client).show_signing_url(order_id, signature_id) }
307
+
250
308
  let(:results) { sign_url[0] }
251
309
  let(:error_messages) { sign_url[1] }
252
310
  let(:order_id) { :valid_order_id }
@@ -263,24 +321,28 @@ RSpec.describe FinApps::REST::DocumentsOrders do
263
321
 
264
322
  context 'with invalid signature id' do
265
323
  let(:signature_id) { :invalid_signature_id }
324
+
266
325
  it { expect(results).to be_nil }
267
- it { expect(error_messages).to_not be_empty }
326
+ it { expect(error_messages).not_to be_empty }
268
327
  end
269
328
  end
270
329
 
271
330
  context 'with invalid order id' do
272
331
  let(:order_id) { :invalid_order_id }
332
+
273
333
  it { expect(results).to be_nil }
274
- it { expect(error_messages).to_not be_empty }
334
+ it { expect(error_messages).not_to be_empty }
275
335
  end
276
336
 
277
337
  context 'with missing order id' do
278
338
  let(:order_id) { nil }
339
+
279
340
  it_behaves_like 'a request that raises an error'
280
341
  end
281
342
 
282
343
  context 'with missing signature id' do
283
344
  let(:signature_id) { nil }
345
+
284
346
  it_behaves_like 'a request that raises an error'
285
347
  end
286
348
  end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helpers/client'
4
+ require 'rest/api_request'
5
+
6
+ RSpec.describe FinApps::REST::DocumentsUploadTypes do
7
+ include SpecHelpers::Client
8
+ subject(:upload_types) { described_class.new(client).list }
9
+
10
+ let(:results) { upload_types[0] }
11
+
12
+ describe '#list' do
13
+ context 'when called' do
14
+ it_behaves_like 'an API request'
15
+ it_behaves_like 'a successful request'
16
+ it('performs a get and returns the response') do
17
+ expect(results[0]).to have_key(:type)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,104 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helpers/client'
4
+ require 'rest/api_request'
5
+
6
+ RSpec.describe FinApps::REST::DocumentsUploads do
7
+ include SpecHelpers::Client
8
+
9
+ describe '#show' do
10
+ let(:upload) { described_class.new(client) }
11
+
12
+ context 'when missing doc id' do
13
+ subject(:show) { upload.show(:consumer_id, nil) }
14
+
15
+ it 'raises an error' do
16
+ expect { show }.to raise_error(FinAppsCore::MissingArgumentsError)
17
+ end
18
+ end
19
+
20
+ context 'when missing consumer id' do
21
+ subject(:show) { upload.show(nil, :doc_id) }
22
+
23
+ it 'raises an error' do
24
+ expect { show }.to raise_error(FinAppsCore::MissingArgumentsError)
25
+ end
26
+ end
27
+
28
+ context 'when thumbnail is not included' do
29
+ subject(:show) do
30
+ upload.show(
31
+ :consumer_id,
32
+ :doc_id
33
+ )
34
+ end
35
+
36
+ it_behaves_like 'an API request'
37
+ it_behaves_like 'a successful request'
38
+ end
39
+
40
+ context 'when thumbnail is included' do
41
+ subject(:show) do
42
+ upload.show(
43
+ :consumer_id,
44
+ :doc_id,
45
+ true
46
+ )
47
+ end
48
+
49
+ it_behaves_like 'an API request'
50
+ it_behaves_like 'a successful request'
51
+ end
52
+ end
53
+
54
+ describe '#destroy' do
55
+ subject(:destroy) { described_class.new(client).destroy(order_id, doc_id) }
56
+
57
+ let(:results) { destroy[0] }
58
+ let(:error_messages) { destroy[1] }
59
+
60
+ context 'with valid id' do
61
+ let(:order_id) { :valid_order_id }
62
+ let(:doc_id) { :valid_doc_id }
63
+
64
+ it_behaves_like 'an API request'
65
+ it_behaves_like 'a successful request'
66
+ it('results is nil') { expect(results).to be_nil }
67
+ end
68
+
69
+ context 'with invalid order id' do
70
+ let(:order_id) { :invalid_order_id }
71
+ let(:doc_id) { :valid_doc_id }
72
+
73
+ it_behaves_like 'an API request'
74
+ it('results is nil') { expect(results).to be_nil }
75
+
76
+ it('error messages array is populated') do
77
+ expect(error_messages.first.downcase).to eq('resource not found')
78
+ end
79
+ end
80
+
81
+ context 'with invalid doc id' do
82
+ let(:order_id) { :valid_order_id }
83
+ let(:doc_id) { :invalid_doc_id }
84
+
85
+ it_behaves_like 'an API request'
86
+ it('results is nil') { expect(results).to be_nil }
87
+
88
+ it('error messages array is populated') do
89
+ expect(error_messages.first.downcase).to eq('resource not found')
90
+ end
91
+ end
92
+
93
+ context 'with missing id' do
94
+ let(:order_id) { nil }
95
+ let(:doc_id) { nil }
96
+
97
+ it do
98
+ expect { destroy }.to raise_error(
99
+ FinAppsCore::MissingArgumentsError
100
+ )
101
+ end
102
+ end
103
+ end
104
+ end