onfido 0.12.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +4 -3
  3. data/.travis.yml +8 -7
  4. data/CHANGELOG.md +23 -0
  5. data/LICENSE +2 -1
  6. data/README.md +70 -70
  7. data/lib/onfido.rb +1 -1
  8. data/lib/onfido/api.rb +4 -4
  9. data/lib/onfido/configuration.rb +12 -16
  10. data/lib/onfido/resource.rb +3 -6
  11. data/lib/onfido/resources/address.rb +1 -1
  12. data/lib/onfido/resources/applicant.rb +9 -5
  13. data/lib/onfido/resources/check.rb +10 -14
  14. data/lib/onfido/resources/document.rb +11 -11
  15. data/lib/onfido/resources/extraction.rb +9 -0
  16. data/lib/onfido/resources/live_photo.rb +9 -14
  17. data/lib/onfido/resources/live_video.rb +5 -8
  18. data/lib/onfido/resources/report.rb +8 -9
  19. data/lib/onfido/resources/sdk_token.rb +3 -5
  20. data/lib/onfido/resources/webhook.rb +11 -9
  21. data/lib/onfido/version.rb +1 -1
  22. data/onfido.gemspec +8 -9
  23. data/spec/integrations/address_spec.rb +1 -0
  24. data/spec/integrations/applicant_spec.rb +38 -32
  25. data/spec/integrations/check_spec.rb +13 -23
  26. data/spec/integrations/document_spec.rb +16 -17
  27. data/spec/integrations/exceptions_spec.rb +12 -13
  28. data/spec/integrations/extraction_spec.rb +19 -0
  29. data/spec/integrations/live_photo_spec.rb +12 -13
  30. data/spec/integrations/live_video_spec.rb +7 -10
  31. data/spec/integrations/report_spec.rb +11 -13
  32. data/spec/integrations/sdk_token_spec.rb +5 -5
  33. data/spec/integrations/webhook_spec.rb +35 -20
  34. data/spec/onfido/resource_spec.rb +10 -14
  35. data/spec/onfido_spec.rb +13 -13
  36. data/spec/support/fake_onfido_api.rb +60 -77
  37. data/spec/support/fixtures/applicant.json +21 -42
  38. data/spec/support/fixtures/check.json +4 -4
  39. data/spec/support/fixtures/checks.json +4 -4
  40. data/spec/support/fixtures/document.json +2 -2
  41. data/spec/support/fixtures/documents.json +8 -8
  42. data/spec/support/fixtures/extraction.json +23 -0
  43. data/spec/support/fixtures/live_photo.json +3 -3
  44. data/spec/support/fixtures/live_photos.json +6 -6
  45. data/spec/support/fixtures/live_video.json +3 -3
  46. data/spec/support/fixtures/live_videos.json +4 -4
  47. data/spec/support/fixtures/not_scheduled_for_deletion_error.json +7 -0
  48. data/spec/support/fixtures/report.json +4 -4
  49. data/spec/support/fixtures/reports.json +8 -8
  50. data/spec/support/fixtures/webhook.json +6 -5
  51. data/spec/support/fixtures/webhooks.json +17 -12
  52. metadata +22 -42
  53. data/lib/onfido/resources/report_type_group.rb +0 -11
  54. data/spec/integrations/report_type_group_spec.rb +0 -19
  55. data/spec/support/fixtures/check_with_expanded_reports.json +0 -30
  56. data/spec/support/fixtures/checks_with_expanded_reports.json +0 -34
  57. data/spec/support/fixtures/report_type_group.json +0 -25
  58. data/spec/support/fixtures/report_type_groups.json +0 -30
@@ -3,7 +3,7 @@ require 'onfido/errors/connection_error'
3
3
  describe Onfido::Resource do
4
4
  subject(:resource) { described_class.new }
5
5
 
6
- let(:endpoint) { 'https://api.onfido.com/v2/' }
6
+ let(:endpoint) { 'https://api.onfido.com/v3/' }
7
7
  let(:path) { 'addresses/pick' }
8
8
  let(:url) { endpoint + path }
9
9
  let(:payload) { { postcode: 'SE1 4NG' } }
@@ -25,18 +25,12 @@ describe Onfido::Resource do
25
25
  before { allow(Onfido).to receive(:endpoint).and_return(endpoint) }
26
26
  before { allow(Onfido).to receive(:api_key).and_return(api_key) }
27
27
 
28
- describe '#url_for' do
29
- it 'composes the full api url' do
30
- expect(resource.url_for(path)).to eq(endpoint + path)
31
- end
32
- end
33
-
34
28
  describe '#method_missing' do
35
29
  %i(patch).each do |method|
36
30
  context "for unsupported HTTP method: #{method}" do
37
31
  it 'raises an error' do
38
32
  expect do
39
- resource.public_send(method, url: endpoint)
33
+ resource.public_send(method, path: endpoint)
40
34
  end.to raise_error(NoMethodError)
41
35
  end
42
36
  end
@@ -64,12 +58,13 @@ describe Onfido::Resource do
64
58
  let(:specific_api_key) { "specific_key" }
65
59
 
66
60
  it "uses that key when making the request" do
67
- resource.get(url: url, payload: payload)
61
+ resource.get(path: path, payload: payload)
68
62
 
69
63
  expect(WebMock).to have_requested(:get, url).with(
70
64
  headers: {
71
65
  'Authorization' => "Token token=#{specific_api_key}",
72
- 'Accept' => "application/json"
66
+ 'Accept' => "application/json",
67
+ 'User-Agent' => "onfido-ruby/#{Onfido::VERSION}"
73
68
  }
74
69
  )
75
70
  end
@@ -79,12 +74,13 @@ describe Onfido::Resource do
79
74
  let(:specific_api_key) { nil }
80
75
 
81
76
  it "uses the general config key when making the request" do
82
- resource.get(url: url, payload: payload)
77
+ resource.get(path: path, payload: payload)
83
78
 
84
79
  expect(WebMock).to have_requested(:get, url).with(
85
80
  headers: {
86
81
  'Authorization' => "Token token=#{api_key}",
87
- 'Accept' => "application/json"
82
+ 'Accept' => "application/json",
83
+ 'User-Agent' => "onfido-ruby/#{Onfido::VERSION}"
88
84
  }
89
85
  )
90
86
  end
@@ -113,7 +109,7 @@ describe Onfido::Resource do
113
109
  end
114
110
 
115
111
  it 'makes a request to an endpoint' do
116
- expect(resource.public_send(method, url: url, payload: payload)).
112
+ expect(resource.public_send(method, path: path, payload: payload)).
117
113
  to eq(response)
118
114
  end
119
115
  end
@@ -127,7 +123,7 @@ describe Onfido::Resource do
127
123
  end
128
124
 
129
125
  it "raises a ConnectionError" do
130
- expect { resource.public_send(method, url: url, payload: payload) }.
126
+ expect { resource.public_send(method, path: path, payload: payload) }.
131
127
  to raise_error(Onfido::ConnectionError)
132
128
  end
133
129
  end
@@ -11,7 +11,7 @@ describe Onfido do
11
11
 
12
12
  describe ".endpoint" do
13
13
  subject { onfido.endpoint }
14
- it { is_expected.to eq('https://api.onfido.com/v2/') }
14
+ it { is_expected.to eq('https://api.onfido.com/v3/') }
15
15
  end
16
16
 
17
17
  describe ".logger" do
@@ -27,32 +27,32 @@ describe Onfido do
27
27
  end
28
28
  end
29
29
 
30
- describe "setting the API version" do
31
- it 'changes the configuration to the new value' do
32
- onfido.api_version = 'v1'
33
- expect(onfido.api_version).to eq('v1')
34
- expect(onfido.endpoint).to eq('https://api.onfido.com/v1/')
30
+ describe 'using the US region' do
31
+ it 'should change endpoint' do
32
+ onfido.region = 'us'
33
+ expect(onfido.endpoint).to eq('https://api.us.onfido.com/v3/')
35
34
  end
36
35
  end
37
36
 
38
- describe 'using a US API token' do
37
+ describe 'using the CA region' do
39
38
  it 'should change endpoint' do
40
- onfido.api_key = "us_live_asdfghjkl1234567890qwertyuiop"
41
- expect(onfido.endpoint).to eq('https://api.us.onfido.com/v2/')
39
+ onfido.region = 'ca'
40
+ expect(onfido.endpoint).to eq('https://api.ca.onfido.com/v3/')
42
41
  end
43
42
  end
44
43
 
45
- describe 'using a EU API token' do
44
+ describe 'using an unsupported region' do
46
45
  it 'should change endpoint' do
47
- onfido.api_key = "eu_live_asdfghjkl1234567890qwertyuiop"
48
- expect(onfido.endpoint).to eq('https://api.eu.onfido.com/v2/')
46
+ onfido.region = 'de'
47
+ expect { onfido.endpoint }.
48
+ to raise_error('The region "de" is not currently supported')
49
49
  end
50
50
  end
51
51
 
52
52
  describe 'using an old API token' do
53
53
  it 'should use old endpoint' do
54
54
  onfido.api_key = "live_asdfghjkl1234567890qwertyuiop"
55
- expect(onfido.endpoint).to eq('https://api.onfido.com/v2/')
55
+ expect(onfido.endpoint).to eq('https://api.onfido.com/v3/')
56
56
  end
57
57
  end
58
58
 
@@ -1,62 +1,70 @@
1
1
  require 'sinatra/base'
2
2
 
3
3
  class FakeOnfidoAPI < Sinatra::Base
4
- get '/v2/addresses/pick' do
4
+ get '/v3/addresses/pick' do
5
5
  json_response(200, 'addresses.json')
6
6
  end
7
7
 
8
- post '/v2/applicants' do
8
+ post '/v3/applicants' do
9
9
  json_response(201, 'applicant.json')
10
10
  end
11
11
 
12
- put '/v2/applicants/:id' do
12
+ put '/v3/applicants/:id' do
13
13
  json_response(200, 'applicant.json')
14
14
  end
15
15
 
16
- get '/v2/applicants/:id' do
16
+ get '/v3/applicants/:id' do
17
17
  json_response(200, 'applicant.json')
18
18
  end
19
19
 
20
- get '/v2/applicants' do
20
+ get '/v3/applicants' do
21
21
  response = json_response(200, 'applicants.json')
22
22
  { applicants: JSON.parse(response)['applicants'][pagination_range] }.to_json
23
23
  end
24
24
 
25
- delete '/v2/applicants/:id' do
25
+ delete '/v3/applicants/:id' do
26
26
  status 204
27
27
  end
28
28
 
29
- post '/v2/applicants/:id/documents' do
29
+ post '/v3/applicants/:id/restore' do
30
+ if params["id"] == "a2fb9c62-ab10-4898-a8ec-342c4b552ad5"
31
+ json_response(422, 'not_scheduled_for_deletion_error.json')
32
+ else
33
+ status 204
34
+ end
35
+ end
36
+
37
+ post '/v3/documents' do
30
38
  json_response(201, 'document.json')
31
39
  end
32
40
 
33
- get '/v2/applicants/:id/documents/:id' do
41
+ post '/v3/extractions' do
42
+ json_response(201, 'extraction.json')
43
+ end
44
+
45
+ get '/v3/documents/:id' do
34
46
  json_response(200, 'document.json')
35
47
  end
36
48
 
37
- get '/v2/applicants/:id/documents' do
49
+ get '/v3/documents' do
38
50
  json_response(200, 'documents.json')
39
51
  end
40
52
 
41
- get '/v2/applicants/:id/documents/:id/download' do
53
+ get '/v3/documents/:id/download' do
42
54
  status 200
43
55
  content_type 'application/octet-stream'
44
56
  "\x01\x02\x03" # acts as binary file data
45
57
  end
46
58
 
47
- post '/v2/live_photos' do
59
+ post '/v3/live_photos' do
48
60
  json_response(201, 'live_photo.json')
49
61
  end
50
62
 
51
- get '/v2/live_photos/:id' do
52
- if params["applicant_id"] != "1030303-123123-123123"
53
- status 404
54
- else
55
- json_response(200, 'live_photo.json')
56
- end
63
+ get '/v3/live_photos/:id' do
64
+ json_response(200, 'live_photo.json')
57
65
  end
58
66
 
59
- get '/v2/live_photos' do
67
+ get '/v3/live_photos' do
60
68
  if params["applicant_id"] != "1030303-123123-123123"
61
69
  status 404
62
70
  else
@@ -64,25 +72,17 @@ class FakeOnfidoAPI < Sinatra::Base
64
72
  end
65
73
  end
66
74
 
67
- get '/v2/live_photos/:id/download' do
68
- if params["applicant_id"] != "1030303-123123-123123"
69
- status 404
70
- else
71
- status 200
72
- content_type 'image/jpeg'
73
- "\x01\x02\x03" # acts as binary file data
74
- end
75
+ get '/v3/live_photos/:id/download' do
76
+ status 200
77
+ content_type 'image/jpeg'
78
+ "\x01\x02\x03" # acts as binary file data
75
79
  end
76
80
 
77
- get '/v2/live_videos/:id' do
78
- if params["applicant_id"] != "1030303-123123-123123"
79
- status 404
80
- else
81
- json_response(200, 'live_video.json')
82
- end
81
+ get '/v3/live_videos/:id' do
82
+ json_response(200, 'live_video.json')
83
83
  end
84
84
 
85
- get '/v2/live_videos' do
85
+ get '/v3/live_videos' do
86
86
  if params["applicant_id"] != "1030303-123123-123123"
87
87
  status 404
88
88
  else
@@ -90,91 +90,74 @@ class FakeOnfidoAPI < Sinatra::Base
90
90
  end
91
91
  end
92
92
 
93
- get '/v2/live_videos/:id/download' do
94
- if params["applicant_id"] != "1030303-123123-123123"
95
- status 404
96
- else
97
- status 200
98
- content_type 'video/quicktime'
99
- "\x01\x02\x03" # acts as binary file data
100
- end
93
+ get '/v3/live_videos/:id/download' do
94
+ status 200
95
+ content_type 'video/quicktime'
96
+ "\x01\x02\x03" # acts as binary file data
101
97
  end
102
98
 
103
- post '/v2/applicants/:id/checks' do
104
- json_response(201, 'check.json')
99
+ post '/v3/checks' do
100
+ params["applicant_id"].nil? ? status(422) : json_response(201, 'check.json')
105
101
  end
106
102
 
107
- get '/v2/applicants/:id/checks/:id' do
108
- if params["expand"] == "reports"
109
- json_response(200, "check_with_expanded_reports.json")
110
- else
111
- json_response(200, "check.json")
112
- end
103
+ get '/v3/checks/:id' do
104
+ json_response(200, "check.json")
113
105
  end
114
106
 
115
- get '/v2/applicants/:id/checks' do
116
- response = if params["expand"] == "reports"
117
- json_response(200, "checks_with_expanded_reports.json")
118
- else
119
- json_response(200, "checks.json")
120
- end
121
-
122
- { checks: JSON.parse(response)['checks'][pagination_range] }.to_json
107
+ get '/v3/checks' do
108
+ json_response(200, "checks.json")
123
109
  end
124
110
 
125
- post '/v2/checks/:id/resume' do
111
+ post '/v3/checks/:id/resume' do
126
112
  status 204 # no_content
127
113
  end
128
114
 
129
- get '/v2/checks/:id/reports' do
115
+ get '/v3/reports' do
130
116
  json_response(200, 'reports.json')
131
117
  end
132
118
 
133
- get '/v2/checks/:id/reports/:id' do
119
+ get '/v3/reports/:id' do
134
120
  json_response(200, 'report.json')
135
121
  end
136
122
 
137
- post '/v2/checks/:id/reports/:id/resume' do
123
+ post '/v3/reports/:id/resume' do
138
124
  status 204
139
125
  end
140
126
 
141
- post '/v2/checks/:id/reports/:id/cancel' do
127
+ post '/v3/reports/:id/cancel' do
142
128
  status 204
143
129
  end
144
130
 
145
- get '/v2/report_type_groups/:id' do
146
- json_response(200, 'report_type_group.json')
147
- end
148
-
149
- get '/v2/report_type_groups' do
150
- json_response(200, 'report_type_groups.json')
151
- end
152
-
153
- post '/v2/sdk_token' do
131
+ post '/v3/sdk_token' do
154
132
  json_response(201, 'sdk_token.json')
155
133
  end
156
134
 
157
- post '/v2/webhooks' do
135
+ post '/v3/webhooks' do
158
136
  json_response(201, 'webhook.json')
159
137
  end
160
138
 
161
- get '/v2/webhooks/:id' do
139
+ get '/v3/webhooks/:id' do
162
140
  json_response(200, 'webhook.json')
163
141
  end
164
142
 
165
- get '/v2/webhooks' do
143
+ delete '/v3/webhooks/:id' do
144
+ content_type "application/json; charset=utf-8"
145
+ status 204
146
+ end
147
+
148
+ get '/v3/webhooks' do
166
149
  json_response(200, 'webhooks.json')
167
150
  end
168
151
 
169
- get '/v2/4xx_response' do
152
+ get '/v3/4xx_response' do
170
153
  json_response(422, '4xx_response.json')
171
154
  end
172
155
 
173
- get '/v2/unexpected_error_format' do
156
+ get '/v3/unexpected_error_format' do
174
157
  json_response(400, 'unexpected_error_format.json')
175
158
  end
176
159
 
177
- get '/v2/unparseable_response' do
160
+ get '/v3/unparseable_response' do
178
161
  content_type :json
179
162
  status 504
180
163
  ''
@@ -1,44 +1,23 @@
1
1
  {
2
- "id":"61f659cb-c90b-4067-808a-6136b5c01351",
3
- "created_at":"2015-04-10T13:16:01Z",
4
- "title":"Mr",
5
- "first_name":"Chandler",
6
- "middle_name":"Muriel",
7
- "last_name":"Bing",
8
- "email":"chandler_bing_6@friends.com",
9
- "gender":"Male",
10
- "dob":"1968-04-08",
11
- "telephone":"555555555",
12
- "mobile":"77777777",
13
- "country":"gbr",
14
- "href":"/v2/applicants/61f659cb-c90b-4067-808a-6136b5c01351",
15
- "id_numbers":[],
16
- "addresses": [
17
- {
18
- "flat_number":"4",
19
- "building_number":"100",
20
- "building_name":"Awesome Building",
21
- "street":"Main Street",
22
- "sub_street":"A sub street",
23
- "town":"London",
24
- "state":"",
25
- "postcode":"SW4 6EH",
26
- "country":"GBR",
27
- "start_date":"",
28
- "end_date":""
29
- },
30
- {
31
- "flat_number":"1",
32
- "building_number":"10",
33
- "building_name":"Great Building",
34
- "street":"Old Street",
35
- "sub_street":"Sub Street",
36
- "town":"London",
37
- "state":"",
38
- "postcode":"SW1 4NG",
39
- "country":"GBR",
40
- "start_date":"",
41
- "end_date":""
42
- }
43
- ]
2
+ "id":"61f659cb-c90b-4067-808a-6136b5c01351",
3
+ "created_at":"2015-04-10T13:16:01Z",
4
+ "title":"Mr",
5
+ "first_name":"Chandler",
6
+ "middle_name":"Muriel",
7
+ "last_name":"Bing",
8
+ "email":"chandler_bing_6@friends.com",
9
+ "dob":"1968-04-08",
10
+ "href":"/v3/applicants/61f659cb-c90b-4067-808a-6136b5c01351",
11
+ "id_numbers":[],
12
+ "address": {
13
+ "flat_number":"4",
14
+ "building_number":"100",
15
+ "building_name":"Awesome Building",
16
+ "street":"Main Street",
17
+ "sub_street":"A sub street",
18
+ "town":"London",
19
+ "state":"",
20
+ "postcode":"SW4 6EH",
21
+ "country":"GBR"
22
+ }
44
23
  }
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "id": "8546921-123123-123123",
3
- "created_at": "2014-05-23T13:50:33Z",
4
- "href": "/v2/applicants/61f659cb-c90b-4067-808a-6136b5c01351/checks/8546921-123123-123123",
5
- "type": "standard",
3
+ "created_at": "2019-05-23T13:50:33Z",
4
+ "href": "/v3/checks/8546921-123123-123123",
5
+ "applicant_provides_data": "false",
6
6
  "status": "pending",
7
7
  "result": "pending",
8
- "reports": [
8
+ "report_ids": [
9
9
  "1030303-123123-375629",
10
10
  "1030303-123123-456789"
11
11
  ]