onfido 0.15.1 → 1.0.0

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 (52) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/LICENSE +2 -1
  4. data/README.md +18 -32
  5. data/lib/onfido.rb +0 -1
  6. data/lib/onfido/api.rb +0 -4
  7. data/lib/onfido/configuration.rb +2 -3
  8. data/lib/onfido/resource.rb +1 -5
  9. data/lib/onfido/resources/address.rb +4 -2
  10. data/lib/onfido/resources/applicant.rb +6 -6
  11. data/lib/onfido/resources/check.rb +9 -19
  12. data/lib/onfido/resources/document.rb +11 -11
  13. data/lib/onfido/resources/live_photo.rb +9 -14
  14. data/lib/onfido/resources/live_video.rb +5 -8
  15. data/lib/onfido/resources/report.rb +8 -9
  16. data/lib/onfido/resources/sdk_token.rb +3 -5
  17. data/lib/onfido/resources/webhook.rb +7 -9
  18. data/lib/onfido/version.rb +1 -1
  19. data/onfido.gemspec +6 -6
  20. data/spec/integrations/address_spec.rb +1 -0
  21. data/spec/integrations/applicant_spec.rb +18 -36
  22. data/spec/integrations/check_spec.rb +13 -67
  23. data/spec/integrations/document_spec.rb +16 -17
  24. data/spec/integrations/exceptions_spec.rb +12 -13
  25. data/spec/integrations/live_photo_spec.rb +12 -13
  26. data/spec/integrations/live_video_spec.rb +7 -10
  27. data/spec/integrations/report_spec.rb +11 -13
  28. data/spec/integrations/sdk_token_spec.rb +5 -5
  29. data/spec/integrations/webhook_spec.rb +26 -18
  30. data/spec/onfido/resource_spec.rb +6 -12
  31. data/spec/onfido_spec.rb +3 -11
  32. data/spec/support/fake_onfido_api.rb +44 -78
  33. data/spec/support/fixtures/applicant.json +21 -42
  34. data/spec/support/fixtures/check.json +4 -4
  35. data/spec/support/fixtures/checks.json +4 -4
  36. data/spec/support/fixtures/document.json +2 -2
  37. data/spec/support/fixtures/documents.json +8 -8
  38. data/spec/support/fixtures/live_photo.json +3 -3
  39. data/spec/support/fixtures/live_photos.json +6 -6
  40. data/spec/support/fixtures/live_video.json +3 -3
  41. data/spec/support/fixtures/live_videos.json +4 -4
  42. data/spec/support/fixtures/report.json +4 -4
  43. data/spec/support/fixtures/reports.json +8 -8
  44. data/spec/support/fixtures/webhook.json +6 -5
  45. data/spec/support/fixtures/webhooks.json +17 -12
  46. metadata +11 -24
  47. data/lib/onfido/resources/report_type_group.rb +0 -11
  48. data/spec/integrations/report_type_group_spec.rb +0 -19
  49. data/spec/support/fixtures/check_with_expanded_reports.json +0 -30
  50. data/spec/support/fixtures/checks_with_expanded_reports.json +0 -34
  51. data/spec/support/fixtures/report_type_group.json +0 -25
  52. data/spec/support/fixtures/report_type_groups.json +0 -30
@@ -1,18 +1,16 @@
1
1
  module Onfido
2
2
  class Webhook < Resource
3
- def create(payload)
4
- post(
5
- url: url_for('webhooks'),
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(url: url_for("webhooks/#{webhooks_id}"))
9
+ get(path: "webhooks/#{webhooks_id}")
12
10
  end
13
11
 
14
- def all(page: 1, per_page: 20)
15
- get(url: url_for("webhooks?page=#{page}&per_page=#{per_page}"))
12
+ def all
13
+ get(path: 'webhooks')
16
14
  end
17
15
 
18
16
  # As well as being a normal resource, Onfido::Webhook also supports
@@ -29,7 +27,7 @@ module Onfido
29
27
  end
30
28
 
31
29
  def self.generate_signature(request_body, token)
32
- OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha1'), token, request_body)
30
+ OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), token, request_body)
33
31
  end
34
32
  private_class_method :generate_signature
35
33
  end
@@ -1,3 +1,3 @@
1
1
  module Onfido
2
- VERSION = '0.15.1'.freeze
2
+ VERSION = '1.0.0'.freeze
3
3
  end
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 = ['Pericles Theodorou', 'Grey Baker']
11
- spec.email = ['periclestheo@gmail.com', 'grey@gocardless.com']
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
- "both v1 and v2 of the Onfido API. Refer to Onfido's "\
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 for both."
17
- spec.homepage = 'http://github.com/hvssle/onfido'
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")
@@ -4,6 +4,7 @@ describe Onfido::Address do
4
4
  describe '#all' do
5
5
  it 'returns the addresses matching the postcode' do
6
6
  response = api.address.all('SW1 4NG')
7
+
7
8
  expect(response['addresses'].count).to eq(2)
8
9
  end
9
10
  end
@@ -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
- 'addresses' => [
15
- {
16
- 'flat_number' => '4',
17
- 'building_number' => '100',
18
- 'building_name' => 'Awesome Building',
19
- 'street' => 'Main Street',
20
- 'sub_street' => 'A sub street',
21
- 'town' => 'London',
22
- 'postcode' => 'SW4 6EH',
23
- 'country' => 'GBR'
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 == 'v2/applicants'
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,17 +84,15 @@ 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')
@@ -1,103 +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(applicant_id, params)
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(applicant_id, check_id)
19
- expect(response['id']).to eq(check_id)
20
- end
21
-
22
- it "returns unexpanded reports" do
23
- response = check.find(applicant_id, check_id)
24
- expect(response['reports'].first).to be_a(String)
25
- end
26
-
27
- it 'allows you to expand the reports' do
28
- response = check.find(applicant_id, check_id, expand: "reports")
29
- expect(response['reports'].first).to be_a(Hash)
30
- end
31
- end
32
-
33
- describe '#find_by_url' do
34
- let(:check_id) { '8546921-123123-123123' }
35
-
36
- context 'partial url' do
37
- let(:url) { "applicants/#{applicant_id}/checks/#{check_id}" }
18
+ response = check.find(check_id)
38
19
 
39
- it 'returns an existing check for the applicant with the partial url' do
40
- response = check.find_by_url(url)
41
- expect(response['id']).to eq(check_id)
42
- end
43
-
44
- it "returns unexpanded reports" do
45
- response = check.find_by_url(url)
46
- expect(response['reports'].first).to be_a(String)
47
- end
48
-
49
- it 'allows you to expand the reports' do
50
- response = check.find_by_url(url, expand: "reports")
51
- expect(response['reports'].first).to be_a(Hash)
52
- end
20
+ expect(response['id']).to eq(check_id)
53
21
  end
54
22
 
55
- context 'full url' do
56
- let(:url) do
57
- "https://api.onfido.com/v2/applicants/#{applicant_id}/checks/#{check_id}"
58
- end
23
+ it "returns report_ids" do
24
+ response = check.find(check_id)
59
25
 
60
- it 'returns an existing check for the applicant with the partial url' do
61
- response = check.find_by_url(url)
62
- expect(response['id']).to eq(check_id)
63
- end
64
-
65
- it "returns unexpanded reports" do
66
- response = check.find_by_url(url)
67
- expect(response['reports'].first).to be_a(String)
68
- end
69
-
70
- it 'allows you to expand the reports' do
71
- response = check.find_by_url(url, expand: "reports")
72
- expect(response['reports'].first).to be_a(Hash)
73
- end
26
+ expect(response['report_ids'].first).to be_a(String)
74
27
  end
75
28
  end
76
29
 
77
30
  describe '#all' do
78
- let(:check_id) { '8546921-123123-123123' }
79
-
80
31
  context 'with the default page and per page params' do
81
32
  it 'returns all existing checks for the applicant' do
82
33
  response = check.all(applicant_id)
34
+
83
35
  expect(response['checks'].size).to eq(1)
84
36
  end
85
37
  end
86
38
 
87
- it "returns unexpanded reports" do
39
+ it "returns report_ids" do
88
40
  response = check.all(applicant_id)
89
- expect(response['checks'].first['reports'].first).to be_a(String)
90
- end
91
41
 
92
- it 'allows you to expand the reports' do
93
- response = check.all(applicant_id, expand: "reports")
94
- expect(response['checks'].first['reports'].first).to be_a(Hash)
42
+ expect(response['checks'].first['report_ids'].first).to be_a(String)
95
43
  end
96
44
  end
97
45
 
98
46
  describe "#resume" do
99
- let(:check_id) { '8546921-123123-123123' }
100
-
101
47
  it 'returns success response' do
102
48
  expect { check.resume(check_id) }.not_to raise_error
103
49
  end
@@ -6,15 +6,15 @@ describe Onfido::Document do
6
6
  describe '#create' do
7
7
  let(:params) do
8
8
  {
9
- type: 'passport',
10
- side: 'back',
11
- file: file
9
+ applicant_id: '1030303-123123-123123',
10
+ type: 'driving_licence',
11
+ file: file,
12
+ side: 'front'
12
13
  }
13
14
  end
14
- let(:applicant_id) { '1030303-123123-123123' }
15
15
 
16
16
  context 'with a File-like object to upload' do
17
- let(:file) { Tempfile.new(['passport', '.jpg']) }
17
+ let(:file) { Tempfile.new(['driving_licence', '.jpg']) }
18
18
 
19
19
  after do
20
20
  file.close
@@ -22,7 +22,8 @@ describe Onfido::Document do
22
22
  end
23
23
 
24
24
  it 'creates a new document' do
25
- response = document.create('foobar', params)
25
+ response = document.create(params)
26
+
26
27
  expect(response['id']).not_to be_nil
27
28
  end
28
29
  end
@@ -31,37 +32,35 @@ describe Onfido::Document do
31
32
  let(:file) { 'https://onfido.com/images/logo.png' }
32
33
 
33
34
  it 'raises an ArgumentError' do
34
- expect { document.create('foobar', params) }.
35
+ expect { document.create(params) }.
35
36
  to raise_error(ArgumentError, /must be a `File`-like object/)
36
37
  end
37
38
  end
38
39
  end
39
40
 
40
41
  describe '#find' do
41
- let(:applicant_id) { '1030303-123123-123123' }
42
- let(:document_id) { '7568415-123123-123123' }
43
-
44
42
  it 'returns the expected document' do
45
- response = document.find(applicant_id, document_id)
43
+ document_id = '7568415-123123-123123'
44
+ response = document.find(document_id)
45
+
46
46
  expect(response['id']).to eq(document_id)
47
47
  end
48
48
  end
49
49
 
50
50
  describe '#all' do
51
- let(:applicant_id) { '1030303-123123-123123' }
52
-
53
51
  it 'returns list of documents' do
52
+ applicant_id = '1030303-123123-123123'
54
53
  response = document.all(applicant_id)
54
+
55
55
  expect(response['documents']).not_to be_empty
56
56
  end
57
57
  end
58
58
 
59
59
  describe '#download' do
60
- let(:applicant_id) { '1030303-123123-123123' }
61
- let(:document_id) { '1212121-123123-123123' }
62
-
63
60
  it 'returns the file data' do
64
- response = document.download(applicant_id, document_id)
61
+ document_id = '1212121-123123-123123'
62
+ response = document.download(document_id)
63
+
65
64
  expect(response).not_to be_nil
66
65
  end
67
66
  end
@@ -1,34 +1,33 @@
1
1
  describe Onfido::Resource do
2
2
  let(:resource) { described_class.new }
3
- let(:url) { Onfido.endpoint + path }
4
3
  let(:api_key) { 'some_key' }
5
4
  let(:payload) { { postcode: 'SE1 4NG' } }
6
5
 
7
6
  before { allow(Onfido).to receive(:api_key).and_return(api_key) }
8
7
 
9
8
  context '4xx response' do
10
- let(:path) { '4xx_response' }
11
-
12
9
  it 'raises a custom error' do
13
- expect { resource.get(url: url, payload: payload) }.
10
+ path = '4xx_response'
11
+
12
+ expect { resource.get(path: path, payload: payload) }.
14
13
  to raise_error(Onfido::RequestError, 'Something went wrong')
15
14
  end
16
15
  end
17
16
 
18
17
  context 'unexpected error format' do
19
- let(:path) { 'unexpected_error_format' }
20
-
21
18
  it 'raises a custom error' do
22
- expect { resource.get(url: url, payload: payload) }.
19
+ path = 'unexpected_error_format'
20
+
21
+ expect { resource.get(path: path, payload: payload) }.
23
22
  to raise_error(Onfido::RequestError, /response code was 400/)
24
23
  end
25
24
  end
26
25
 
27
26
  context 'unparseable JSON 5xx' do
28
- let(:path) { 'unparseable_response' }
29
-
30
27
  it 'raises a server error' do
31
- expect { resource.get(url: url, payload: payload) }.
28
+ path = 'unparseable_response'
29
+
30
+ expect { resource.get(path: path, payload: payload) }.
32
31
  to raise_error(Onfido::ServerError, /response code was 504/)
33
32
  end
34
33
  end
@@ -41,7 +40,7 @@ describe Onfido::Resource do
41
40
  end
42
41
 
43
42
  it 'raises a ConnectionError' do
44
- expect { resource.get(url: Onfido.endpoint, payload: payload) }.
43
+ expect { resource.get(path: Onfido.endpoint, payload: payload) }.
45
44
  to raise_error(Onfido::ConnectionError, /Could not connect/)
46
45
  end
47
46
  end
@@ -54,7 +53,7 @@ describe Onfido::Resource do
54
53
  end
55
54
 
56
55
  it 'raises a ConnectionError' do
57
- expect { resource.get(url: Onfido.endpoint, payload: payload) }.
56
+ expect { resource.get(path: Onfido.endpoint, payload: payload) }.
58
57
  to raise_error(Onfido::ConnectionError, /connection to the server/)
59
58
  end
60
59
  end
@@ -67,7 +66,7 @@ describe Onfido::Resource do
67
66
  end
68
67
 
69
68
  it 'raises a ConnectionError' do
70
- expect { resource.get(url: Onfido.endpoint, payload: payload) }.
69
+ expect { resource.get(path: Onfido.endpoint, payload: payload) }.
71
70
  to raise_error(Onfido::ConnectionError, /SSL certificate/)
72
71
  end
73
72
  end