finapps 5.0.30 → 5.0.35

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