onfido 0.14.0 → 1.1.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 +4 -4
- data/.rubocop.yml +4 -0
- data/.travis.yml +3 -7
- data/CHANGELOG.md +21 -0
- data/LICENSE +2 -1
- data/README.md +59 -73
- data/lib/onfido.rb +1 -1
- data/lib/onfido/api.rb +4 -4
- data/lib/onfido/configuration.rb +4 -4
- data/lib/onfido/resource.rb +3 -6
- data/lib/onfido/resources/address.rb +1 -4
- data/lib/onfido/resources/applicant.rb +6 -6
- data/lib/onfido/resources/check.rb +10 -14
- data/lib/onfido/resources/document.rb +11 -11
- data/lib/onfido/resources/extraction.rb +9 -0
- data/lib/onfido/resources/live_photo.rb +9 -14
- data/lib/onfido/resources/live_video.rb +5 -8
- data/lib/onfido/resources/report.rb +8 -9
- data/lib/onfido/resources/sdk_token.rb +3 -5
- data/lib/onfido/resources/webhook.rb +11 -9
- data/lib/onfido/version.rb +1 -1
- data/onfido.gemspec +6 -7
- data/spec/integrations/address_spec.rb +1 -0
- data/spec/integrations/applicant_spec.rb +21 -37
- data/spec/integrations/check_spec.rb +13 -23
- data/spec/integrations/document_spec.rb +16 -17
- data/spec/integrations/exceptions_spec.rb +12 -14
- data/spec/integrations/extraction_spec.rb +19 -0
- data/spec/integrations/live_photo_spec.rb +12 -13
- data/spec/integrations/live_video_spec.rb +7 -10
- data/spec/integrations/report_spec.rb +11 -13
- data/spec/integrations/sdk_token_spec.rb +5 -5
- data/spec/integrations/webhook_spec.rb +35 -20
- data/spec/onfido/resource_spec.rb +10 -14
- data/spec/onfido_spec.rb +9 -10
- data/spec/support/fake_onfido_api.rb +53 -78
- data/spec/support/fixtures/applicant.json +21 -42
- data/spec/support/fixtures/check.json +4 -4
- data/spec/support/fixtures/checks.json +4 -4
- data/spec/support/fixtures/document.json +2 -2
- data/spec/support/fixtures/documents.json +8 -8
- data/spec/support/fixtures/extraction.json +23 -0
- data/spec/support/fixtures/live_photo.json +3 -3
- data/spec/support/fixtures/live_photos.json +6 -6
- data/spec/support/fixtures/live_video.json +3 -3
- data/spec/support/fixtures/live_videos.json +4 -4
- data/spec/support/fixtures/not_scheduled_for_deletion_error.json +7 -0
- data/spec/support/fixtures/report.json +4 -4
- data/spec/support/fixtures/reports.json +8 -8
- data/spec/support/fixtures/webhook.json +6 -5
- data/spec/support/fixtures/webhooks.json +17 -12
- metadata +19 -40
- data/lib/onfido/resources/report_type_group.rb +0 -11
- data/spec/integrations/report_type_group_spec.rb +0 -19
- data/spec/support/fixtures/check_with_expanded_reports.json +0 -30
- data/spec/support/fixtures/checks_with_expanded_reports.json +0 -34
- data/spec/support/fixtures/report_type_group.json +0 -25
- data/spec/support/fixtures/report_type_groups.json +0 -30
@@ -1,27 +1,27 @@
|
|
1
1
|
module Onfido
|
2
2
|
class Applicant < Resource
|
3
3
|
def create(payload)
|
4
|
-
post(
|
4
|
+
post(path: 'applicants', payload: payload)
|
5
5
|
end
|
6
6
|
|
7
7
|
def update(applicant_id, payload)
|
8
|
-
put(
|
8
|
+
put(path: "applicants/#{applicant_id}", payload: payload)
|
9
9
|
end
|
10
10
|
|
11
11
|
def destroy(applicant_id)
|
12
|
-
delete(
|
12
|
+
delete(path: "applicants/#{applicant_id}")
|
13
13
|
end
|
14
14
|
|
15
15
|
def find(applicant_id)
|
16
|
-
get(
|
16
|
+
get(path: "applicants/#{applicant_id}")
|
17
17
|
end
|
18
18
|
|
19
19
|
def all(page: 1, per_page: 20)
|
20
|
-
get(
|
20
|
+
get(path: "applicants?page=#{page}&per_page=#{per_page}")
|
21
21
|
end
|
22
22
|
|
23
23
|
def restore(applicant_id)
|
24
|
-
post(
|
24
|
+
post(path: "applicants/#{applicant_id}/restore")
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
@@ -1,26 +1,22 @@
|
|
1
1
|
module Onfido
|
2
2
|
class Check < Resource
|
3
|
-
def create(applicant_id
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
)
|
3
|
+
def create(applicant_id:, report_names:, **payload)
|
4
|
+
payload[:applicant_id] = applicant_id
|
5
|
+
payload[:report_names] = report_names
|
6
|
+
|
7
|
+
post(path: 'checks', payload: payload)
|
8
8
|
end
|
9
9
|
|
10
|
-
def find(
|
11
|
-
|
12
|
-
get(url: url_for("applicants/#{applicant_id}/checks/#{check_id}?" \
|
13
|
-
"#{querystring}"))
|
10
|
+
def find(check_id)
|
11
|
+
get(path: "checks/#{check_id}")
|
14
12
|
end
|
15
13
|
|
16
|
-
def all(applicant_id
|
17
|
-
|
18
|
-
querystring += "&expand=#{expand}" if expand
|
19
|
-
get(url: url_for("applicants/#{applicant_id}/checks?#{querystring}"))
|
14
|
+
def all(applicant_id)
|
15
|
+
get(path: "checks?applicant_id=#{applicant_id}")
|
20
16
|
end
|
21
17
|
|
22
18
|
def resume(check_id)
|
23
|
-
post(
|
19
|
+
post(path: "checks/#{check_id}/resume")
|
24
20
|
end
|
25
21
|
end
|
26
22
|
end
|
@@ -2,25 +2,25 @@ module Onfido
|
|
2
2
|
class Document < Resource
|
3
3
|
# with open-uri the file can be a link or an actual file
|
4
4
|
|
5
|
-
def create(applicant_id
|
6
|
-
validate_file!(
|
5
|
+
def create(applicant_id:, file:, type:, **payload)
|
6
|
+
validate_file!(file)
|
7
|
+
payload[:applicant_id] = applicant_id
|
8
|
+
payload[:file] = file
|
9
|
+
payload[:type] = type
|
7
10
|
|
8
|
-
post(
|
9
|
-
url: url_for("applicants/#{applicant_id}/documents"),
|
10
|
-
payload: payload
|
11
|
-
)
|
11
|
+
post(path: 'documents', payload: payload)
|
12
12
|
end
|
13
13
|
|
14
|
-
def find(
|
15
|
-
get(
|
14
|
+
def find(document_id)
|
15
|
+
get(path: "documents/#{document_id}")
|
16
16
|
end
|
17
17
|
|
18
|
-
def download(
|
19
|
-
get(
|
18
|
+
def download(document_id)
|
19
|
+
get(path: "documents/#{document_id}/download")
|
20
20
|
end
|
21
21
|
|
22
22
|
def all(applicant_id)
|
23
|
-
get(
|
23
|
+
get(path: "documents?applicant_id=#{applicant_id}")
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
@@ -2,29 +2,24 @@ module Onfido
|
|
2
2
|
class LivePhoto < Resource
|
3
3
|
# with open-uri the file can be a link or an actual file
|
4
4
|
|
5
|
-
def create(applicant_id
|
6
|
-
validate_file!(
|
5
|
+
def create(applicant_id:, file:, **payload)
|
6
|
+
validate_file!(file)
|
7
7
|
payload[:applicant_id] = applicant_id
|
8
|
+
payload[:file] = file
|
8
9
|
|
9
|
-
post(
|
10
|
-
url: url_for("/live_photos"),
|
11
|
-
payload: payload
|
12
|
-
)
|
10
|
+
post(path: 'live_photos', payload: payload)
|
13
11
|
end
|
14
12
|
|
15
|
-
def find(
|
16
|
-
|
17
|
-
get(url: url_for("live_photos/#{live_photo_id}?#{query_string}"))
|
13
|
+
def find(live_photo_id)
|
14
|
+
get(path: "live_photos/#{live_photo_id}")
|
18
15
|
end
|
19
16
|
|
20
|
-
def download(
|
21
|
-
|
22
|
-
get(url: url_for("live_photos/#{live_photo_id}/download?#{query_string}"))
|
17
|
+
def download(live_photo_id)
|
18
|
+
get(path: "live_photos/#{live_photo_id}/download")
|
23
19
|
end
|
24
20
|
|
25
21
|
def all(applicant_id)
|
26
|
-
|
27
|
-
get(url: url_for("live_photos?#{query_string}"))
|
22
|
+
get(path: "live_photos?applicant_id=#{applicant_id}")
|
28
23
|
end
|
29
24
|
end
|
30
25
|
end
|
@@ -1,18 +1,15 @@
|
|
1
1
|
module Onfido
|
2
2
|
class LiveVideo < Resource
|
3
|
-
def find(
|
4
|
-
|
5
|
-
get(url: url_for("live_videos/#{live_video_id}?#{query_string}"))
|
3
|
+
def find(live_video_id)
|
4
|
+
get(path: "live_videos/#{live_video_id}")
|
6
5
|
end
|
7
6
|
|
8
|
-
def download(
|
9
|
-
|
10
|
-
get(url: url_for("live_videos/#{live_video_id}/download?#{query_string}"))
|
7
|
+
def download(live_video_id)
|
8
|
+
get(path: "live_videos/#{live_video_id}/download")
|
11
9
|
end
|
12
10
|
|
13
11
|
def all(applicant_id)
|
14
|
-
|
15
|
-
get(url: url_for("live_videos?#{query_string}"))
|
12
|
+
get(path: "live_videos?applicant_id=#{applicant_id}")
|
16
13
|
end
|
17
14
|
end
|
18
15
|
end
|
@@ -1,20 +1,19 @@
|
|
1
1
|
module Onfido
|
2
2
|
class Report < Resource
|
3
|
-
def find(
|
4
|
-
get(
|
3
|
+
def find(report_id)
|
4
|
+
get(path: "reports/#{report_id}")
|
5
5
|
end
|
6
6
|
|
7
|
-
def all(check_id
|
8
|
-
|
9
|
-
get(url: url_for("checks/#{check_id}/reports?#{querystring}"))
|
7
|
+
def all(check_id)
|
8
|
+
get(path: "reports?check_id=#{check_id}")
|
10
9
|
end
|
11
10
|
|
12
|
-
def resume(
|
13
|
-
post(
|
11
|
+
def resume(report_id)
|
12
|
+
post(path: "reports/#{report_id}/resume")
|
14
13
|
end
|
15
14
|
|
16
|
-
def cancel(
|
17
|
-
post(
|
15
|
+
def cancel(report_id)
|
16
|
+
post(path: "reports/#{report_id}/cancel")
|
18
17
|
end
|
19
18
|
end
|
20
19
|
end
|
@@ -1,10 +1,8 @@
|
|
1
1
|
module Onfido
|
2
2
|
class SdkToken < Resource
|
3
|
-
def create(payload)
|
4
|
-
|
5
|
-
|
6
|
-
payload: payload
|
7
|
-
)
|
3
|
+
def create(applicant_id:, **payload)
|
4
|
+
payload[:applicant_id] = applicant_id
|
5
|
+
post(path: 'sdk_token', payload: payload)
|
8
6
|
end
|
9
7
|
end
|
10
8
|
end
|
@@ -1,18 +1,20 @@
|
|
1
1
|
module Onfido
|
2
2
|
class Webhook < Resource
|
3
|
-
def create(payload)
|
4
|
-
|
5
|
-
|
6
|
-
payload: payload
|
7
|
-
)
|
3
|
+
def create(url:, **payload)
|
4
|
+
payload[:url] = url
|
5
|
+
post(path: 'webhooks', payload: payload)
|
8
6
|
end
|
9
7
|
|
10
8
|
def find(webhooks_id)
|
11
|
-
get(
|
9
|
+
get(path: "webhooks/#{webhooks_id}")
|
12
10
|
end
|
13
11
|
|
14
|
-
def all
|
15
|
-
get(
|
12
|
+
def all
|
13
|
+
get(path: 'webhooks')
|
14
|
+
end
|
15
|
+
|
16
|
+
def destroy(webhook_id)
|
17
|
+
delete(path: "webhooks/#{webhook_id}")
|
16
18
|
end
|
17
19
|
|
18
20
|
# As well as being a normal resource, Onfido::Webhook also supports
|
@@ -29,7 +31,7 @@ module Onfido
|
|
29
31
|
end
|
30
32
|
|
31
33
|
def self.generate_signature(request_body, token)
|
32
|
-
OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('
|
34
|
+
OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), token, request_body)
|
33
35
|
end
|
34
36
|
private_class_method :generate_signature
|
35
37
|
end
|
data/lib/onfido/version.rb
CHANGED
data/onfido.gemspec
CHANGED
@@ -7,14 +7,14 @@ require 'onfido/version'
|
|
7
7
|
Gem::Specification.new do |spec|
|
8
8
|
spec.name = 'onfido'
|
9
9
|
spec.version = Onfido::VERSION
|
10
|
-
spec.authors = ['
|
11
|
-
spec.email = ['
|
10
|
+
spec.authors = ['Onfido']
|
11
|
+
spec.email = ['engineering@onfido.com']
|
12
12
|
spec.summary = 'A wrapper for Onfido API'
|
13
|
-
spec.description = "A thin wrapper for Onfido's API. This gem supports "\
|
14
|
-
"
|
13
|
+
spec.description = "A thin wrapper for Onfido's API. This gem only supports "\
|
14
|
+
"v3 of the Onfido API. Refer to Onfido's "\
|
15
15
|
"API documentation for details of the expected "\
|
16
|
-
"requests and responses
|
17
|
-
spec.homepage = 'http://github.com/
|
16
|
+
"requests and responses."
|
17
|
+
spec.homepage = 'http://github.com/onfido/onfido-ruby'
|
18
18
|
spec.license = 'MIT'
|
19
19
|
|
20
20
|
spec.files = `git ls-files -z`.split("\x0")
|
@@ -23,7 +23,6 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.require_paths = ['lib']
|
24
24
|
spec.required_ruby_version = ">= 2.2.0"
|
25
25
|
|
26
|
-
spec.add_development_dependency 'bundler', '~> 1.7'
|
27
26
|
spec.add_development_dependency 'rake', '~> 12.0'
|
28
27
|
spec.add_development_dependency 'rspec', '~> 3.1'
|
29
28
|
spec.add_development_dependency 'rspec-its', '~> 1.2'
|
@@ -1,38 +1,24 @@
|
|
1
1
|
describe Onfido::Applicant do
|
2
2
|
subject(:applicant) { described_class.new }
|
3
|
+
let(:applicant_id) { '61f659cb-c90b-4067-808a-6136b5c01351' }
|
3
4
|
let(:params) do
|
4
5
|
{
|
5
6
|
'title' => 'Mr',
|
6
7
|
'first_name' => 'Chandler',
|
7
8
|
'last_name' => 'Bing',
|
8
|
-
'gender' => 'male',
|
9
9
|
'middle_name' => 'Muriel',
|
10
10
|
'dob' => '1968-04-08',
|
11
|
-
'telephone' => '555555555',
|
12
|
-
'mobile' => '77777777',
|
13
11
|
'email' => 'chandler_bing_6@friends.com',
|
14
|
-
'
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
},
|
25
|
-
{
|
26
|
-
'flat_number' => '1',
|
27
|
-
'building_number' => '10',
|
28
|
-
'building_name' => 'Great Building',
|
29
|
-
'street' => 'Old Street',
|
30
|
-
'sub_street' => 'Sub Street',
|
31
|
-
'town' => 'London',
|
32
|
-
'postcode' => 'SW1 4NG',
|
33
|
-
'country' => 'GBR'
|
34
|
-
}
|
35
|
-
]
|
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
|
+
'postcode' => 'SW4 6EH',
|
20
|
+
'country' => 'GBR'
|
21
|
+
}
|
36
22
|
}
|
37
23
|
end
|
38
24
|
|
@@ -43,7 +29,7 @@ describe Onfido::Applicant do
|
|
43
29
|
|
44
30
|
it 'serializes the payload correctly' do
|
45
31
|
WebMock.after_request do |request_signature, _response|
|
46
|
-
if request_signature.uri.path == '
|
32
|
+
if request_signature.uri.path == 'v3/applicants'
|
47
33
|
expect(Rack::Utils.parse_nested_query(request_signature.body)).
|
48
34
|
to eq(params)
|
49
35
|
end
|
@@ -57,26 +43,22 @@ describe Onfido::Applicant do
|
|
57
43
|
end
|
58
44
|
|
59
45
|
describe '#update' do
|
60
|
-
let(:applicant_id) { '61f659cb-c90b-4067-808a-6136b5c01351' }
|
61
|
-
|
62
46
|
it 'updates an applicant' do
|
63
47
|
response = applicant.update(applicant_id, params)
|
48
|
+
|
64
49
|
expect(response['id']).to eq(applicant_id)
|
65
50
|
end
|
66
51
|
end
|
67
52
|
|
68
53
|
describe '#find' do
|
69
|
-
let(:applicant_id) { '61f659cb-c90b-4067-808a-6136b5c01351' }
|
70
|
-
|
71
54
|
it 'returns the applicant' do
|
72
55
|
response = applicant.find(applicant_id)
|
56
|
+
|
73
57
|
expect(response['id']).to eq(applicant_id)
|
74
58
|
end
|
75
59
|
end
|
76
60
|
|
77
61
|
describe '#destroy' do
|
78
|
-
let(:applicant_id) { '61f659cb-c90b-4067-808a-6136b5c01351' }
|
79
|
-
|
80
62
|
it 'returns success code' do
|
81
63
|
expect { applicant.destroy(applicant_id) }.not_to raise_error
|
82
64
|
end
|
@@ -86,6 +68,7 @@ describe Onfido::Applicant do
|
|
86
68
|
context 'with the default page and per page params' do
|
87
69
|
it 'returns all the applicants' do
|
88
70
|
response = applicant.all
|
71
|
+
|
89
72
|
expect(response['applicants'].size).to eq(2)
|
90
73
|
end
|
91
74
|
end
|
@@ -93,6 +76,7 @@ describe Onfido::Applicant do
|
|
93
76
|
context 'with specific range of results for a page' do
|
94
77
|
it 'returns the specified applicants' do
|
95
78
|
response = applicant.all(page: 1, per_page: 1)
|
79
|
+
|
96
80
|
expect(response['applicants'].size).to eq(1)
|
97
81
|
end
|
98
82
|
end
|
@@ -100,21 +84,21 @@ describe Onfido::Applicant do
|
|
100
84
|
|
101
85
|
describe '#restore' do
|
102
86
|
context 'an applicant scheduled for deletion' do
|
103
|
-
let(:applicant_id) { '61f659cb-c90b-4067-808a-6136b5c01351' }
|
104
|
-
|
105
87
|
it 'returns nil' do
|
106
88
|
expect(applicant.restore(applicant_id)).to be_nil
|
107
89
|
end
|
108
90
|
end
|
109
91
|
|
110
92
|
context 'an applicant not scheduled for deletion' do
|
111
|
-
let(:applicant_id) { 'a2fb9c62-ab10-4898-a8ec-342c4b552ad5' }
|
112
|
-
|
113
93
|
it 'returns an error' do
|
94
|
+
applicant_id = 'a2fb9c62-ab10-4898-a8ec-342c4b552ad5'
|
95
|
+
|
114
96
|
expect { applicant.restore(applicant_id) }.to raise_error { |error|
|
115
97
|
expect(error).to be_a(Onfido::RequestError)
|
116
98
|
expect(error.message).to eq('There was a validation error on this request')
|
117
|
-
expect(error.fields).to eq(
|
99
|
+
expect(error.fields).to eq(
|
100
|
+
"Applicant a2fb9c62-ab10-4898-a8ec-342c4b552ad5 is not scheduled for deletion"
|
101
|
+
)
|
118
102
|
}
|
119
103
|
end
|
120
104
|
end
|
@@ -1,59 +1,49 @@
|
|
1
1
|
describe Onfido::Check do
|
2
2
|
subject(:check) { described_class.new }
|
3
3
|
let(:applicant_id) { '61f659cb-c90b-4067-808a-6136b5c01351' }
|
4
|
+
let(:check_id) { '8546921-123123-123123' }
|
4
5
|
|
5
6
|
describe '#create' do
|
6
|
-
let(:params) { { type: 'express', reports: [{ name: 'identity' }] } }
|
7
|
-
|
8
7
|
it 'creates a new check for an applicant' do
|
9
|
-
response = check.create(
|
8
|
+
response = check.create(
|
9
|
+
applicant_id: applicant_id,
|
10
|
+
report_names: ['identity_enhanced']
|
11
|
+
)
|
10
12
|
expect(response['id']).not_to be_nil
|
11
13
|
end
|
12
14
|
end
|
13
15
|
|
14
16
|
describe '#find' do
|
15
|
-
let(:check_id) { '8546921-123123-123123' }
|
16
|
-
|
17
17
|
it 'returns an existing check for the applicant' do
|
18
|
-
response = check.find(
|
18
|
+
response = check.find(check_id)
|
19
|
+
|
19
20
|
expect(response['id']).to eq(check_id)
|
20
21
|
end
|
21
22
|
|
22
|
-
it "returns
|
23
|
-
response = check.find(
|
24
|
-
expect(response['reports'].first).to be_a(String)
|
25
|
-
end
|
23
|
+
it "returns report_ids" do
|
24
|
+
response = check.find(check_id)
|
26
25
|
|
27
|
-
|
28
|
-
response = check.find(applicant_id, check_id, expand: "reports")
|
29
|
-
expect(response['reports'].first).to be_a(Hash)
|
26
|
+
expect(response['report_ids'].first).to be_a(String)
|
30
27
|
end
|
31
28
|
end
|
32
29
|
|
33
30
|
describe '#all' do
|
34
|
-
let(:check_id) { '8546921-123123-123123' }
|
35
|
-
|
36
31
|
context 'with the default page and per page params' do
|
37
32
|
it 'returns all existing checks for the applicant' do
|
38
33
|
response = check.all(applicant_id)
|
34
|
+
|
39
35
|
expect(response['checks'].size).to eq(1)
|
40
36
|
end
|
41
37
|
end
|
42
38
|
|
43
|
-
it "returns
|
39
|
+
it "returns report_ids" do
|
44
40
|
response = check.all(applicant_id)
|
45
|
-
expect(response['checks'].first['reports'].first).to be_a(String)
|
46
|
-
end
|
47
41
|
|
48
|
-
|
49
|
-
response = check.all(applicant_id, expand: "reports")
|
50
|
-
expect(response['checks'].first['reports'].first).to be_a(Hash)
|
42
|
+
expect(response['checks'].first['report_ids'].first).to be_a(String)
|
51
43
|
end
|
52
44
|
end
|
53
45
|
|
54
46
|
describe "#resume" do
|
55
|
-
let(:check_id) { '8546921-123123-123123' }
|
56
|
-
|
57
47
|
it 'returns success response' do
|
58
48
|
expect { check.resume(check_id) }.not_to raise_error
|
59
49
|
end
|